Seit ich maschinelles Lernen studiert habe, habe ich ** Kaggles Anfänger-Tutorial Titanic ** ausprobiert.
Zuerst habe ich versucht, mit der Funktionsmenge auf meine eigene Weise unter Bezugnahme auf die japanischen Webinformationen zu spielen, aber selbst wenn die Trainingsdaten eine gute Genauigkeit ergaben, verbesserte sich die Genauigkeit bei der Übermittlung der Testdaten nicht wie erwartet. Ich war in Qual, ohne die 80% Mauer zu brechen.
Unter solchen Umständen ist es schwierig anzuhängen, weil es auf Englisch ist, aber ich habe die Weisheit meines Vorgängers in Kaggle / Taitanics ** Notizbuch ** ausgeliehen und es schließlich in die oberen 2% gesetzt, sodass ich ein Memorandum machen werde, das sich auf die Punkte konzentriert, die besonders hilfreich waren. Belassen als.
Folgen wir nun dem Code.
Laden Sie zunächst den Datensatz. Wenn Zug und Test getrennt behandelt werden, muss dieselbe Verarbeitung zweimal durchgeführt werden. Kombinieren Sie sie daher zu df.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#Datensatz laden
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
# train_Daten und Test_Datenverkettung
test_data['Survived'] = np.nan
df = pd.concat([train_data, test_data], ignore_index=True, sort=False)
#df Informationen
df.info()
#Beziehung zwischen Geschlecht und Überlebensrate
sns.barplot(x='Sex', y='Survived', data=df, palette='Set3')
plt.show()
df ist 13 Elemente x 1309 Zeilen. Fehlende Werte sind ** Alter **: 1309-1046 = 263, ** Tarif **: 1309-1308 = 1, ** Kabine **: 1309-295 = 1014, ** Eingeschifft **: 1309 -1307 = 2 Stück.
In Bezug auf die Überlebensraten von Männern und Frauen ** ist die Überlebensrate von Frauen überwältigend hoch **.
Zuerst gibt es eine Beziehung zwischen Titel und Alter, deshalb habe ich sie mit ** Durchschnittsalter nach Titel ** ergänzt. Aus irgendeinem Grund würde die Verwendung dieser Feature-Menge jedoch die Genauigkeit verringern, sodass ich sie nicht für die Feature-Menge verwendet habe. Vielleicht sind die Titel, die im Alter variieren, schlecht.
In Notebook verwendeten einige Personen ** vollständige, nicht fehlende Daten (Klasse, Geschlecht, SibSp, Parch), um die fehlenden Alterswerte in einer zufälligen Gesamtstruktur zu schätzen **. Ich hatte diese Idee von Anfang an, aber ich dachte, ich müsste nicht so weit gehen. Aber es war ein Fehler. Das funktioniert.
# ------------ Age ------------
#Alter bis Klasse, Sex, Parch,Geschätzt in zufälligen Wäldern von SibSp
from sklearn.ensemble import RandomForestRegressor
#Geben Sie das Element an, das für die Schätzung verwendet werden soll
age_df = df[['Age', 'Pclass','Sex','Parch','SibSp']]
#Eine Hot-Codierung von Etikettenfunktionen
age_df=pd.get_dummies(age_df)
#Getrennt in Trainingsdaten und Testdaten und konvertiert in Numpy
known_age = age_df[age_df.Age.notnull()].values
unknown_age = age_df[age_df.Age.isnull()].values
#X Trainingsdaten,Getrennt in y
X = known_age[:, 1:]
y = known_age[:, 0]
#Erstellen Sie ein Schätzmodell in einer zufälligen Gesamtstruktur
rfr = RandomForestRegressor(random_state=0, n_estimators=100, n_jobs=-1)
rfr.fit(X, y)
#Vorhersage und Ergänzung des Alters der Testdaten mithilfe eines Schätzmodells
predictedAges = rfr.predict(unknown_age[:, 1::])
df.loc[(df.Age.isnull()), 'Age'] = predictedAges
#Altersspezifische Überlebens- und Todeskurven
facet = sns.FacetGrid(df[0:890], hue="Survived",aspect=2)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, df.loc[0:890,'Age'].max()))
facet.add_legend()
plt.show()
Als Ergebnis der Ergänzung der fehlenden Alterswerte würden Sie, wenn Sie eine Überlebenskurve und eine Todeskurve nach Alter zeichnen, sagen, dass ** der Höhepunkt des Überlebens unter 10 Jahren liegt ** und der Höhepunkt des Todes Ende der 20er Jahre ** liegt. Ist es?
Von Anfang an habe ich auch den Titel aus ** Name extrahiert und als Feature-Menge verwendet. ** Und dies trug sicherlich zur Verbesserung der Genauigkeit bei (die Genauigkeit nimmt ab, wenn sie herausgezogen wird).
# ------------ Name --------------
#Titel vom Namen(Title)Extrahieren und gruppieren
df['Title'] = df['Name'].map(lambda x: x.split(', ')[1].split('. ')[0])
df['Title'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev'], 'Officer', inplace=True)
df['Title'].replace(['Don', 'Sir', 'the Countess', 'Lady', 'Dona'], 'Royalty', inplace=True)
df['Title'].replace(['Mme', 'Ms'], 'Mrs', inplace=True)
df['Title'].replace(['Mlle'], 'Miss', inplace=True)
df['Title'].replace(['Jonkheer'], 'Master', inplace=True)
sns.barplot(x='Title', y='Survived', data=df, palette='Set3')
Wenn wir die Überlebensrate nach Titel betrachten, können wir sehen, dass ** Herr die niedrigste Überlebensrate und Frau die höchste Überlebensrate hat **.
In Notebook gab es außerdem eine Person, die den Nachnamen aus ** Name herausnahm und sich auf eine Gruppe mit mehreren Personen mit demselben Nachnamen ** konzentrierte. Mit anderen Worten, ** die Perspektive, dass Sie, wenn Sie eine Familie haben, dazu neigen, Ihr Schicksal zu teilen **.
# ------------ Surname ------------
#Name zu Nachname(Familienname, Nachname)Extrakt
df['Surname'] = df['Name'].map(lambda name:name.split(',')[0].strip())
#Gleicher Nachname(Familienname, Nachname)Zählen Sie die Häufigkeit des Auftretens(Familie, wenn die Anzahl der Auftritte 2 oder mehr beträgt)
df['FamilyGroup'] = df['Surname'].map(df['Surname'].value_counts())
Wenn Sie dann die Familie in eine Gruppe ** 16 Jahre oder jünger oder Frauen ** (sogenannte Mädchen und Kinder) und eine Gruppe ** über 16 Jahre und Männer ** aufteilen, ist es interessant, die Überlebensrate zu sehen. Ich kann es sehen.
#Überlebensrate für Familien unter 16 Jahren oder Frauen
Female_Child_Group=df.loc[(df['FamilyGroup']>=2) & ((df['Age']<=16) | (df['Sex']=='female'))]
Female_Child_Group=Female_Child_Group.groupby('Surname')['Survived'].mean()
print(Female_Child_Group.value_counts())
Die ** Gruppe von 16 Jahren oder jünger oder Frauen ** hat eine Überlebensrate von 0% nur in 32 Gruppen, während 113 Gruppen eine Überlebensrate von 100% haben. Mit anderen Worten, ** viele Gruppen leben alle, aber nur einige werden vernichtet **.
#Überlebensrate von Männern über 16 Jahre in der Familie
Male_Adult_Group=df.loc[(df['FamilyGroup']>=2) & (df['Age']>16) & (df['Sex']=='male')]
Male_Adult_List=Male_Adult_Group.groupby('Surname')['Survived'].mean()
print(Male_Adult_List.value_counts())
** Die Gruppe der Männer über 16 Jahre ** hat in 115 Gruppen eine Überlebensrate von 0%, während die Überlebensrate in 21 Gruppen 100% beträgt. Mit anderen Worten, ** viele Gruppen werden vernichtet, aber nur einige Gruppen leben alle **.
Die wertvolle Information, die aus diesen Tatsachen gewonnen werden kann, ist, dass es eine Minderheit gibt, die dazu bestimmt ist, gegen den gesamten Strom zu verstoßen **. Basierend auf diesen Minderheiteninformationen werden wir die folgenden Maßnahmen ergreifen.
#Erstellen von Deadlists und Überlebenden
Dead_list=set(Female_Child_Group[Female_Child_Group.apply(lambda x:x==0)].index)
Survived_list=set(Male_Adult_List[Male_Adult_List.apply(lambda x:x==1)].index)
#Tote Liste und Überlebensliste anzeigen
print('Dead_list = ', Dead_list)
print('Survived_list = ', Survived_list)
#Sex Deadlist und Überlebenskünstler, Age,Im Titel widerspiegeln
df.loc[(df['Survived'].isnull()) & (df['Surname'].apply(lambda x:x in Dead_list)),\
['Sex','Age','Title']] = ['male',28.0,'Mr']
df.loc[(df['Survived'].isnull()) & (df['Surname'].apply(lambda x:x in Survived_list)),\
['Sex','Age','Title']] = ['female',5.0,'Mrs']
Aus den Trainingsdaten haben wir die ** tote Liste ** (Dead_list) zusammengestellt, die alle toten Nachnamen in der Gruppe der Frauen unter 16 Jahren und die Nachnamen, die alle in der Gruppe der Männer über 16 Jahre überlebt haben, gesammelt hat * * Überlebensliste ** (Überlebensliste). Dies wird in den Testdaten widergespiegelt.
Insbesondere wenn in den Testdaten eine Zeile vorhanden ist, die der ** Totenliste ** entspricht, wird ** Geschlecht, Alter, Titel in typische Todesdaten ** geändert, sodass sie immer als tot beurteilt werden. Schreiben Sie neu, wenn es eine Zeile gibt, die ** Überlebensliste ** entspricht, und schreiben Sie Geschlecht, Alter, Titel in typische Überlebensdaten ** um, damit diese immer als lebendig beurteilt werden.
Es klingt ein wenig knifflig, aber ich denke, es ist ein kluger Weg, weil das Schätzmodell einfach ist. Wie erwartet ist es die Weisheit unserer Vorgänger.
Der Tarif wird ergänzt, indem der Tarifmedian aus den Einstellungen für fehlende Werte (Einschiffung = S, Klasse = 3) entnommen wird, indem angegeben wird, dass er sich auf den Einschiffungsort (Emabarked) und die Klasse (Klasse P) bezieht. Dies sollte kein Problem sein.
# ----------- Fare -------------
#Fehlende Werte eingeschifft='S', Pclass=Ergänzt durch den Durchschnittswert von 3
fare=df.loc[(df['Embarked'] == 'S') & (df['Pclass'] == 3), 'Fare'].median()
df['Fare']=df['Fare'].fillna(fare)
** SibSp ** ist die Anzahl der Geschwister und Ehepartner, die auf der Titanic fahren. ** Parch ** ist die Anzahl der Eltern und Kinder, die auf der Titanic fahren. Es ist besser, ** Familie ** als Merkmalsmenge zu addieren, als sie zu einer unabhängigen Merkmalsmenge zu machen. Gruppierung nach Überlebensrate. Dies sollte auch kein Problem sein.
# ----------- Family -------------
# Family = SibSp + Parch +Gruppierung mit 1 als Merkmalsmenge
df['Family']=df['SibSp']+df['Parch']+1
df.loc[(df['Family']>=2) & (df['Family']<=4), 'Family_label'] = 2
df.loc[(df['Family']>=5) & (df['Family']<=7) | (df['Family']==1), 'Family_label'] = 1 # ==Hinweis
df.loc[(df['Family']>=8), 'Family_label'] = 0
Zuerst habe ich ohne Grund eine Merkmalsmenge ** mit dem Anfangsbuchstaben der Ticketnummer erstellt. Sicher genug, ich habe diese Funktion nicht als Funktion verwendet, da die Genauigkeit sinken würde, wenn ich sie verwenden würde. Schließlich scheint es keine gute Idee zu sein, eine Feature-Menge daraus zu machen, obwohl es keinen Grund gibt.
In Notebook gab es eine Person, die eine Funktionsmenge ** basierend auf der Anzahl der Personen mit derselben Ticketnummer erstellt hat. Dann können Sie den Grund verstehen. ** Personen mit derselben Ticketnummer werden sich wahrscheinlich im selben Raum befinden, und es wird für sie einfacher sein, ihr Schicksal zu teilen, und die Leichtigkeit des Überlebens wird sich je nach Anzahl der Personen ändern **.
Unten finden Sie eine grafische Darstellung der Überlebensraten nach Anzahl der Personen mit derselben Ticketnummer.
# ----------- Ticket ----------------
#Extrahieren Sie, wie viele Personen mit derselben Ticketnummer als Feature-Mengen vorhanden sind
Ticket_Count = dict(df['Ticket'].value_counts())
df['TicketGroup'] = df['Ticket'].map(Ticket_Count)
sns.barplot(x='TicketGroup', y='Survived', data=df, palette='Set3')
plt.show()
Die Überlebensrate von 2 bis 4 Personen ist hoch, die Überlebensrate von 5 bis 8 und 1 ist mittel und die Überlebensrate von 11 ist Null. Deshalb werden wir es in drei gruppieren.
#Gruppierung in 3 nach Überlebensrate
df.loc[(df['TicketGroup']>=2) & (df['TicketGroup']<=4), 'Ticket_label'] = 2
df.loc[(df['TicketGroup']>=5) & (df['TicketGroup']<=8) | (df['TicketGroup']==1), 'Ticket_label'] = 1
df.loc[(df['TicketGroup']>=11), 'Ticket_label'] = 0
sns.barplot(x='Ticket_label', y='Survived', data=df, palette='Set3')
plt.show()
7.Cabin Es gibt viele fehlende Werte, aber da die Überlebensrate fehlender Werte U eindeutig niedrig ist, ergänzen wir fehlende Werte nicht speziell. Dies sollte auch kein Problem sein.
# ------------- Cabin ----------------
#Verwenden Sie das erste Zeichen von Cabin als Feature-Menge(Fehlender Wert ist U.)
df['Cabin'] = df['Cabin'].fillna('Unknown')
df['Cabin_label']=df['Cabin'].str.get(0)
sns.barplot(x='Cabin_label', y='Survived', data=df, palette='Set3')
plt.show()
8.Embarked Fehlende Werte werden durch S ergänzt, das die meisten Passagiere hat. Das sollte auch in Ordnung sein.
# ---------- Embarked ---------------
#Ergänzen Sie fehlende Werte mit S.
df['Embarked'] = df['Embarked'].fillna('S')
Dies ist eine Vorverarbeitung zum Erstellen eines geschätzten Modells in einer zufälligen Gesamtstruktur. ** Etikettenmerkmale können durch One-Hot-Codierung der Etikettenmerkmale zerlegt werden. ** ** **
Zum Beispiel besteht der Inhalt von Embarked aus drei Bezeichnungen: C, Q und S. Wenn Sie dies mit einer One-Hot-Codierung multiplizieren, werden automatisch drei Elemente erstellt: Embarked_C, Embarked_Q und Embarked_S. Außerdem wird der Ausdruck geändert, dass nur eines der drei Elemente 1 und der Rest 0 ist.
Auf diese Weise werden Embarked_C und Embarked_S als Merkmalsgrößen übernommen, Embarked_Q wird jedoch überlernt, sodass detaillierte Maßnahmen zur Verhinderung des Überlernens ergriffen werden können.
Dies war das erste Mal, dass ich in Notebook davon erfuhr, und ich dachte, dass ** die Zerlegung von Feature-Mengen durch One-Hot-Codierung eine leistungsstarke Waffe wäre, um nur das auszuwählen, was Sie benötigen, nachdem Sie verschiedene Feature-Mengen gefunden haben **. Es war.
# -------------Vorverarbeitung---------------
#Geben Sie das Element an, das für die Schätzung verwendet werden soll
df = df[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','Family_label','Cabin_label','Ticket_label']]
#Eine Hot-Codierung von Etikettenfunktionen
df = pd.get_dummies(df)
#Teilen Sie den Datensatz in Zug und Test
train = df[df['Survived'].notnull()]
test = df[df['Survived'].isnull()].drop('Survived',axis=1)
#Konvertieren Sie den Datenrahmen in numpy
X = train.values[:,1:]
y = train.values[:,0]
test_x = test.values
Zuerst habe ich die beste Kombination ausgewählt, indem ich die von mir erstellten Funktionen manuell addiert oder subtrahiert und die Genauigkeit ermittelt habe.
In Notbook gab es jedoch ** Personen, die SelectKbest zur automatischen Auswahl von Funktionen verwendeten **. Das ist effizient!
Die Anzahl der einzugrenzenden Features wird in der Form ** select = SelectKBest (k = 20) ** angegeben.
# -----------Geschätzter Modellbau---------------
from sklearn.feature_selection import SelectKBest
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_validate
#Grenzen Sie den zu übernehmenden Funktionsbetrag von 25 auf 20 ein
select = SelectKBest(k = 20)
clf = RandomForestClassifier(random_state = 10,
warm_start = True, #Fügen Sie einem Modell, das bereits passt, das Lernen hinzu
n_estimators = 26,
max_depth = 6,
max_features = 'sqrt')
pipeline = make_pipeline(select, clf)
pipeline.fit(X, y)
#Anzeige der Anpassungsergebnisse
cv_result = cross_validate(pipeline, X, y, cv= 10)
print('mean_score = ', np.mean(cv_result['test_score']))
print('mean_std = ', np.std(cv_result['test_score']))
Die durchschnittliche Punktzahl infolge der Eingrenzung auf 20 Merkmale betrug 0,8417441.
Lassen Sie uns nun überprüfen, welche Funktionsmenge in dem mit dem obigen Code erstellten Modell übernommen wurde.
# --------Angenommener Funktionsbetrag---------------
#Adoptionsstatus
mask= select.get_support()
#Liste von Gegenständen
list_col = list(df.columns[1:])
#Liste der Verfügbarkeit der Adoption nach Artikel
for i, j in enumerate(list_col):
print('No'+str(i+1), j,'=', mask[i])
#Form überprüfen
X_selected = select.transform(X)
print('X.shape={}, X_selected.shape={}'.format(X.shape, X_selected.shape))
Von den 25 vorbereiteten Merkmalsmengen wurden Embarked_Q, Title_officer, Cabin_label_A, Cabin_label_G, Cabin_label_T nicht übernommen, und der Rest wurde übernommen, und die Merkmalsmenge wurde sicherlich auf 20 eingegrenzt.
# -----Erstellen Senden Daten-------
PassengerId=test_data['PassengerId']
predictions = pipeline.predict(test_x)
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": predictions.astype(np.int32)})
submission.to_csv("my_submission.csv", index=False)
Am 21. November 2019 war das Ergebnis ** Genauigkeit 0,83732 ** und ** 259. Platz **. Da die Anzahl der teilnehmenden Mitglieder 15.889 beträgt, liegt sie bei ** Top 1,6% **.
Dieses Mal werde ich das Know-how von Kaggle / Titanic Notebook zusammenfassen. ** 1) Die Vervollständigung fehlender Werte ist eine Methode zum Erstellen eines Schätzmodells aus vollständigen Daten ohne fehlende Werte und zum Vervollständigen (Alter). 2) Die scheinbar zufälligen Merkmale sollten immer in der Lage sein, neue Merkmale aus rationalem Denken (Ticket) zu finden. 3) Auch wenn ein neuer Feature-Betrag einmal gefunden wird, können weitere Feature-Beträge gefunden werden (Name). 4) Es gibt eine Häufigkeit (Nachname, Ticket) als Gesichtspunkt für die Suche nach neuen Funktionen. 5) Es ist eine wirksame Maßnahme zur Verhinderung von Überlernen, die Menge der Etikettenmerkmale (eingeschifft, Titel, Kabine) zu zerlegen und auszuwählen. 6) Mit KBset auswählen können Feature-Mengen effizient ausgewählt werden. ** ** **
Abschließend werde ich den Code zusammenfassen.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#Datensatz laden
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
# train_Daten und Test_Datenverkettung
test_data['Survived'] = np.nan
df = pd.concat([train_data, test_data], ignore_index=True, sort=False)
#df Informationen
df.info()
#Beziehung zwischen Geschlecht und Überlebensrate
sns.barplot(x='Sex', y='Survived', data=df, palette='Set3')
plt.show()
# ------------ Age ------------
#Alter bis Klasse, Sex, Parch,Geschätzt in zufälligen Wäldern von SibSp
from sklearn.ensemble import RandomForestRegressor
#Geben Sie das Element an, das für die Schätzung verwendet werden soll
age_df = df[['Age', 'Pclass','Sex','Parch','SibSp']]
#Eine Hot-Codierung von Etikettenfunktionen
age_df=pd.get_dummies(age_df)
#Getrennt in Trainingsdaten und Testdaten und konvertiert in Numpy
known_age = age_df[age_df.Age.notnull()].values
unknown_age = age_df[age_df.Age.isnull()].values
#X Trainingsdaten,Getrennt in y
X = known_age[:, 1:]
y = known_age[:, 0]
#Erstellen Sie ein Schätzmodell in einer zufälligen Gesamtstruktur
rfr = RandomForestRegressor(random_state=0, n_estimators=100, n_jobs=-1)
rfr.fit(X, y)
#Vorhersage und Ergänzung des Alters der Testdaten mithilfe eines Schätzmodells
predictedAges = rfr.predict(unknown_age[:, 1::])
df.loc[(df.Age.isnull()), 'Age'] = predictedAges
#Altersspezifische Überlebens- und Todeskurven
facet = sns.FacetGrid(df[0:890], hue="Survived",aspect=2)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, df.loc[0:890,'Age'].max()))
facet.add_legend()
plt.show()
# ------------ Name --------------
#Titel vom Namen(Title)Extrahieren und gruppieren
df['Title'] = df['Name'].map(lambda x: x.split(', ')[1].split('. ')[0])
df['Title'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev'], 'Officer', inplace=True)
df['Title'].replace(['Don', 'Sir', 'the Countess', 'Lady', 'Dona'], 'Royalty', inplace=True)
df['Title'].replace(['Mme', 'Ms'], 'Mrs', inplace=True)
df['Title'].replace(['Mlle'], 'Miss', inplace=True)
df['Title'].replace(['Jonkheer'], 'Master', inplace=True)
sns.barplot(x='Title', y='Survived', data=df, palette='Set3')
# ------------ Surname ------------
#Name zu Nachname(Familienname, Nachname)Extrakt
df['Surname'] = df['Name'].map(lambda name:name.split(',')[0].strip())
#Gleicher Nachname(Familienname, Nachname)Zählen Sie die Häufigkeit des Auftretens(Familie, wenn die Anzahl der Auftritte 2 oder mehr beträgt)
df['FamilyGroup'] = df['Surname'].map(df['Surname'].value_counts())
#Überlebensrate für Familien unter 16 Jahren oder Frauen
Female_Child_Group=df.loc[(df['FamilyGroup']>=2) & ((df['Age']<=16) | (df['Sex']=='female'))]
Female_Child_Group=Female_Child_Group.groupby('Surname')['Survived'].mean()
print(Female_Child_Group.value_counts())
#Überlebensrate von Männern über 16 Jahre in der Familie
Male_Adult_Group=df.loc[(df['FamilyGroup']>=2) & (df['Age']>16) & (df['Sex']=='male')]
Male_Adult_List=Male_Adult_Group.groupby('Surname')['Survived'].mean()
print(Male_Adult_List.value_counts())
#Erstellen von Deadlists und Überlebenden
Dead_list=set(Female_Child_Group[Female_Child_Group.apply(lambda x:x==0)].index)
Survived_list=set(Male_Adult_List[Male_Adult_List.apply(lambda x:x==1)].index)
#Tote Liste und Überlebensliste anzeigen
print('Dead_list = ', Dead_list)
print('Survived_list = ', Survived_list)
#Sex Deadlist und Überlebenskünstler, Age,Im Titel widerspiegeln
df.loc[(df['Survived'].isnull()) & (df['Surname'].apply(lambda x:x in Dead_list)),\
['Sex','Age','Title']] = ['male',28.0,'Mr']
df.loc[(df['Survived'].isnull()) & (df['Surname'].apply(lambda x:x in Survived_list)),\
['Sex','Age','Title']] = ['female',5.0,'Mrs']
# ----------- Fare -------------
#Fehlende Werte eingeschifft='S', Pclass=Ergänzt durch den Durchschnittswert von 3
fare=df.loc[(df['Embarked'] == 'S') & (df['Pclass'] == 3), 'Fare'].median()
df['Fare']=df['Fare'].fillna(fare)
# ----------- Family -------------
# Family = SibSp + Parch +Gruppierung mit 1 als Merkmalsmenge
df['Family']=df['SibSp']+df['Parch']+1
df.loc[(df['Family']>=2) & (df['Family']<=4), 'Family_label'] = 2
df.loc[(df['Family']>=5) & (df['Family']<=7) | (df['Family']==1), 'Family_label'] = 1 # ==Hinweis
df.loc[(df['Family']>=8), 'Family_label'] = 0
# ----------- Ticket ----------------
#Extrahieren Sie, wie viele Personen mit derselben Ticketnummer als Feature-Mengen vorhanden sind
Ticket_Count = dict(df['Ticket'].value_counts())
df['TicketGroup'] = df['Ticket'].map(Ticket_Count)
sns.barplot(x='TicketGroup', y='Survived', data=df, palette='Set3')
plt.show()
#Gruppierung in 3 nach Überlebensrate
df.loc[(df['TicketGroup']>=2) & (df['TicketGroup']<=4), 'Ticket_label'] = 2
df.loc[(df['TicketGroup']>=5) & (df['TicketGroup']<=8) | (df['TicketGroup']==1), 'Ticket_label'] = 1
df.loc[(df['TicketGroup']>=11), 'Ticket_label'] = 0
sns.barplot(x='Ticket_label', y='Survived', data=df, palette='Set3')
plt.show()
# ------------- Cabin ----------------
#Verwenden Sie das erste Zeichen von Cabin als Feature-Menge(Fehlender Wert ist U.)
df['Cabin'] = df['Cabin'].fillna('Unknown')
df['Cabin_label']=df['Cabin'].str.get(0)
sns.barplot(x='Cabin_label', y='Survived', data=df, palette='Set3')
plt.show()
# ---------- Embarked ---------------
#Ergänzen Sie fehlende Werte mit S.
df['Embarked'] = df['Embarked'].fillna('S')
# -------------Vorverarbeitung---------------
#Geben Sie das Element an, das für die Schätzung verwendet werden soll
df = df[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','Family_label','Cabin_label','Ticket_label']]
#Eine Hot-Codierung von Etikettenfunktionen
df = pd.get_dummies(df)
#Teilen Sie den Datensatz in Zug und Test
train = df[df['Survived'].notnull()]
test = df[df['Survived'].isnull()].drop('Survived',axis=1)
#Konvertieren Sie den Datenrahmen in numpy
X = train.values[:,1:]
y = train.values[:,0]
test_x = test.values
# -----------Geschätzter Modellbau---------------
from sklearn.feature_selection import SelectKBest
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_validate
#Grenzen Sie den zu übernehmenden Funktionsbetrag von 25 auf 20 ein
select = SelectKBest(k = 20)
clf = RandomForestClassifier(random_state = 10,
warm_start = True, #Fügen Sie einem Modell, das bereits passt, das Lernen hinzu
n_estimators = 26,
max_depth = 6,
max_features = 'sqrt')
pipeline = make_pipeline(select, clf)
pipeline.fit(X, y)
#Anzeige der Anpassungsergebnisse
cv_result = cross_validate(pipeline, X, y, cv= 10)
print('mean_score = ', np.mean(cv_result['test_score']))
print('mean_std = ', np.std(cv_result['test_score']))
# --------Angenommener Funktionsbetrag---------------
#Adoptionsstatus
mask= select.get_support()
#Liste von Gegenständen
list_col = list(df.columns[1:])
#Liste der Verfügbarkeit der Adoption nach Artikel
for i, j in enumerate(list_col):
print('No'+str(i+1), j,'=', mask[i])
#Form überprüfen
X_selected = select.transform(X)
print('X.shape={}, X_selected.shape={}'.format(X.shape, X_selected.shape))
# -----Erstellen Senden Daten-------
PassengerId=test_data['PassengerId']
predictions = pipeline.predict(test_x)
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": predictions.astype(np.int32)})
submission.to_csv("my_submission.csv", index=False)
Recommended Posts