[PYTHON] Kaggle Tutorial Titanic Know-how, um in den Top 2% zu sein

1. Zuallererst

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.

1. Daten lesen

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()

スクリーンショット 2019-11-20 19.43.33.png 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.

スクリーンショット 2019-11-21 09.47.01.png In Bezug auf die Überlebensraten von Männern und Frauen ** ist die Überlebensrate von Frauen überwältigend hoch **.

2. Alter fehlende Wertvervollständigung

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()

スクリーンショット 2019-11-20 20.00.40.png 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?

3. Erstellen Sie eine neue Feature-Menge aus Name

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')

スクリーンショット 2019-11-20 15.23.08.png 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())

スクリーンショット 2019-11-20 20.18.34.png 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())

スクリーンショット 2019-11-20 20.22.17.png ** 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']

スクリーンショット 2019-11-21 15.27.26.png 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.

4. Ergänzende Werte im Tarif ergänzen

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)

5. Erstellen Sie Funktionen aus SibSp und Parch

** 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

6. Extrahieren Sie aussagekräftige Funktionen aus Ticket

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()

スクリーンショット 2019-11-20 20.50.34.png 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()

スクリーンショット 2019-11-21 10.29.01.png

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()

スクリーンショット 2019-11-20 21.21.46.png

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') 

9. Vorbehandlung

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

10. Erstellen eines Schätzmodells mit einer zufälligen Gesamtstruktur

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']))

スクリーンショット 2019-11-21 14.36.59.png 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))

スクリーンショット 2019-11-21 11.01.14.png 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.

11. Submit_data erstellen

# -----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)

スクリーンショット 2019-11-21 11.09.39.png 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% **.

12. Zusammenfassung

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. ** ** **

13. Code

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

Kaggle Tutorial Titanic Know-how, um in den Top 2% zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
Kaggle Tutorial Titanic Genauigkeit 80,9% (Top 7% 0,80861)
Untersuchen Sie die Parameter von RandomForestClassifier im Kaggle / Titanic-Tutorial
Tag 66 [Einführung in Kaggle] Die einfachste Titanic-Vorhersage
Ich habe versucht, die Pferde vorherzusagen, die mit LightGBM unter den Top 3 sein werden
Schauen Sie sich das Kaggle / Titanic-Tutorial genauer an
Aktivieren Sie die Schaltfläche Überprüfen in Tkinter, damit der Eintrag bearbeitet werden kann
Programmierung, um in der Welt zu kämpfen ~ 5-5,5-6
[Kaggle] Teilnahme am Melanomwettbewerb
Programmieren, um in der Welt zu kämpfen 5-3
Programmierung für den Kampf in der Welt - Kapitel 4
Im Python-Befehl zeigt Python auf Python3.8
Stellen Sie das Django-Lernprogramm für IIS bereit ①
Probieren Sie Cython in kürzester Zeit aus
Programmieren, um in der Welt zu kämpfen ~ 5-2
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Wechseln Sie das zu ladende Modul für jede Ausführungsumgebung in Python
Holen Sie sich die besten n-ten Werte in Pandas
Herausforderungen des Titanic-Wettbewerbs für Kaggle-Anfänger
Fügen Sie in Jupyter IPerl zum Kernel hinzu.
Überprüfen Sie die Korrelation mit Kaggles Titanic (kaggle③)
Verschiedene Kommentare im Programm zu schreiben
Es ist okay, über die Titanic zu stolpern! Einführung in die Kaggle-Strategie für Super-Anfänger
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 2 übertragen
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 1 übertragen
django geodjango Ich habe mich darauf bezogen, als ich im Tutorial feststeckte (Bearbeitung)
Verwendung der C-Bibliothek in Python
Melden Sie sich mit SSH bei einem Remote-Server an
Twitter-Streaming-Client zum Genießen im Terminal
Dynamisches Ersetzen der nächsten Methode in Python
Zeichnen Sie Diagramme in Julia ... Überlassen Sie die Diagramme Python
Tipps zum Schreiben werden in Python kurz abgeflacht
So erhalten Sie die Dateien im Ordner [Python]
[Django] CSS im Projekt kann nicht gelesen werden
PyQtGraph ist möglicherweise nicht im Interpreter verfügbar.
Loggen Sie sich mit json mit pygogo ein.
Ich möchte den Fortschritt in Python anzeigen!
Verwenden Sie tkinter, um den Ausgabecode in Python als "A und vorgeben, B zu sein" zu verschieben
Was zu tun ist, wenn es nicht in der Sudoers-Datei enthalten ist. Dieser Vorfall wird gemeldet.
Sie müssen vorsichtig mit den Befehlen sein, die Sie jeden Tag in der Produktionsumgebung verwenden.