Nach Letztes Mal erreichte Kaggle Titanic die höchsten 1,5% (0,83732). Ich werde den Ansatz von erklären. Der verwendete Code ist titanic (0.83732) _2 in Github. Dieses Mal werden wir die eingereichte Punktzahl auf 0,81339 erhöhen und uns auf die nächsten 0,83732 vorbereiten. Darüber hinaus werden wir vor der Prognose die verwendeten [vorherigen] Daten (https://qiita.com/shiroino11111/items/bc3889fa38ff32d46c13) visualisieren und die Daten analysieren.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline,make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
from sklearn import model_selection
from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings('ignore')
#Lesen Sie CSV
train= pd.read_csv("train.csv")
test= pd.read_csv("test.csv")
#Datenintegration
dataset = pd.concat([train, test], ignore_index = True)
#Zur Einreichung
PassengerId = test['PassengerId']
Schauen wir uns die Beziehung der einzelnen Daten an.
#Banddiagramm von Alter und Überlebensrate
sns.barplot(x="Sex", y="Survived", data=train, palette='Set3')
#Überlebensrate nach Geschlecht
print("females: %.2f" %(train['Survived'][train['Sex'] == 'female'].value_counts(normalize = True)[1]))
print("males: %.2f" %(train['Survived'][train['Sex'] == 'male'].value_counts(normalize = True)[1]))
females: 0.74 males: 0.19 Sie können sehen, dass Frauen viel hilfreicher sind. Was ist mit der Überlebensrate für jede Ticketklasse?
#Ticketklasse und Überlebensbanddiagramm
sns.barplot(x='Pclass', y='Survived', data=train, palette='Set3')
#Überlebensrate nach Ticketklasse
print("Pclass = 1 : %.2f" %(train['Survived'][train['Pclass']==1].value_counts(normalize = True)[1]))
print("Pclass = 2 : %.2f" %(train['Survived'][train['Pclass']==2].value_counts(normalize = True)[1]))
print("Pclass = 3 : %.2f" %(train['Survived'][train['Pclass']==3].value_counts(normalize = True)[1]))
Pclass = 1 : 0.63 Pclass = 2 : 0.47 Pclass = 3 : 0.24 Je höher der Ticketkäufer, desto höher die Überlebensrate. Was ist mit dem Preis?
#Vergleich der Überlebensrate nach Preis
fare = sns.FacetGrid(train, hue="Survived",aspect=2)
fare.map(sns.kdeplot,'Fare',shade= True)
fare.set(xlim=(0, 200))
fare.add_legend()
Immerhin ist zu sehen, dass Menschen mit niedrigen Ticketpreisen eine niedrige Überlebensrate haben.
#Vergleich der Überlebensrate nach Alter
age = sns.FacetGrid(train, hue="Survived",aspect=2)
age.map(sns.kdeplot,'Age',shade= True)
age.set(xlim=(0, train['Age'].max()))
age.add_legend()
Hat das Kind zuerst Hilfe bekommen? Sie können sehen, dass die Überlebensrate unter 10 Jahren hoch ist.
Von hier aus vorher werden wir die nicht verwendeten Daten überprüfen. Erstens ist die Rauminformation. Kabine (Raumnummer) scheint je nach Akronym unterschiedliche Raumebenen zu haben.
#Vergleich der Überlebensrate nach Raumebene
dataset['Cabin'] = dataset['Cabin'].fillna('Unknown') #Ersetzen Sie Unbekannt, wenn Raumdaten fehlen
dataset['Deck'] = dataset['Cabin'].str.get(0) #Holen Sie sich den ersten Buchstaben (0. Buchstabe) der Kabine (Zimmernummer)
sns.barplot(x="Deck", y="Survived", data=dataset, palette='Set3')
Es gibt einige Variationen. Letztes Mal Nachdem der fehlende Wert durch den Medianwert ersetzt und bestätigt wurde, dass kein Wert fehlt, werden die diesmal erstellten Informationen "Deck" (Raumhierarchie) angezeigt. Machen Sie zusätzliche Vorhersagen.
# Age(Alter)Und Fahrpreis(Gebühr)Ist der Medianwert von jedem, eingeschifft(Ausgangspunkt)Ist S.(Southampton)Ersatz
dataset["Age"].fillna(dataset.Age.mean(), inplace=True)
dataset["Fare"].fillna(dataset.Fare.mean(), inplace=True)
dataset["Embarked"].fillna("S", inplace=True)
#Überprüfen Sie die Anzahl der fehlenden Daten
dataset_null = dataset.fillna(np.nan)
dataset_null.isnull().sum()
#Extrahieren Sie die zu verwendenden Variablen
dataset3 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck']]
#Erstellen Sie eine Dummy-Variable
dataset_dummies = pd.get_dummies(dataset3)
dataset_dummies.head(3)
#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten
#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_)
#Vorhersage von Testdaten
pred = grid.predict(test_set)
#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission3.csv", index=False)
{'classify__max_depth': 8, 'classify__n_estimators': 22} 0.8327721661054994 Die eingereichte Punktzahl betrug 0,78947. Durch die Aufnahme von Informationen auf Raumebene wurde diese gegenüber der vorherigen Zeit erhöht.
Dann probieren Sie die Ticketinformationen. Aber wie gruppiert man sie? Es ist möglich, zwischen der Anzahl der Zeichen und der Angabe des ersten Buchstabens oder Alphabets der Zahl zu unterscheiden. Wenn diese jedoch zu stark erhöht wird, wird die Genauigkeit verringert. Lassen Sie uns dies überprüfen, indem Sie die Anzahl der Zeichen im Ticket teilen.
#Vergleich der Überlebensrate anhand der Anzahl der Zeichen im Ticket
Ticket_Count = dict(dataset['Ticket'].value_counts()) #Gruppieren Sie nach der Anzahl der Zeichen im Ticket
dataset['TicketGroup'] = dataset['Ticket'].apply(lambda x:Ticket_Count[x]) #Gruppenverteilung
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')
Es gibt einen Unterschied zur vorherigen Kabinenabteilung (Raumebene).
#Extrahieren Sie die zu verwendenden Variablen
dataset4 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck', 'TicketGroup']]
#Erstellen Sie eine Dummy-Variable
dataset_dummies = pd.get_dummies(dataset4)
dataset_dummies.head(4)
#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten
#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")
#Vorhersage von Testdaten
pred = grid.predict(test_set)
#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission4.csv", index=False)
{'classify__max_depth': 8, 'classify__n_estimators': 23} 0.8406285072951739 Die Trainingspunktzahl stieg, aber die an Kaggle übermittelte Punktzahl fiel auf 0,77990. Erstens scheint die Korrelation zwischen der Anzahl der Zeichen in einem Ticket und der Überlebensrate realistisch gesehen schwach zu sein. Da es sich jedoch um eine Funktion handelt, die mit großem Aufwand herausgekommen ist, werde ich versuchen, durch Unterdrücken der Elemente in zwei Gruppen, einer hohen Gruppe und einer niedrigen Gruppe, zu lernen.
#Teilen Sie sich in zwei Gruppen ein, eine Gruppe mit einer hohen Überlebensrate in Bezug auf die Anzahl der Zeichen im Ticket und eine Gruppe mit einer niedrigen Überlebensrate.
#Ersetzen Sie 2, wenn hoch, und 1, wenn niedrig
def Ticket_Label(s):
if (s >= 2) & (s <= 4): #Gruppe mit hoher Überlebensrate in der Anzahl der Charaktere
return 2
elif ((s > 4) & (s <= 8)) | (s == 1): #Gruppe mit niedriger Überlebensrate in der Anzahl der Charaktere
return 1
elif (s > 8):
return 0
dataset['TicketGroup'] = dataset['TicketGroup'].apply(Ticket_Label)
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')
Es sieht so aus, als wäre es ordentlich getrennt.
#Zerlegen Sie Daten in Zug und Test
#( 'Survived'Existiert im Zug,Nicht testen)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Trennen Sie Zugdaten in Variablen und korrigieren Sie die Antworten
X = train_set.as_matrix()[:, 1:] #Variablen nach Pclass
y = train_set.as_matrix()[:, 0] #Richtige Antwortdaten
#Erstellen eines Vorhersagemodells
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Versuchen Sie 20-30 in Schritten
'classify__max_depth':list(range(3, 10, 1))} #Versuchen Sie 3-10 in Schritten
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_, sep="\n")
#Vorhersage von Testdaten
pred = grid.predict(test_set)
#Erstellen einer CSV-Datei für die Kaggle-Übermittlung
submission = pd.DataFrame({"PassengerId": PassengerId, "Survived": pred.astype(np.int32)})
submission.to_csv("submission5.csv", index=False)
{'classify__max_depth': 7, 'classify__n_estimators': 23} 0.8417508417508418 Die bei Kaggle eingereichte Punktzahl hat sich deutlich auf 0,81339 verbessert.
Diesmal durch Hinzufügen von Informationen zur Raumhierarchie und Informationen, die in zwei Gruppen unterteilt sind, eine Gruppe mit einer hohen Überlebensrate und eine Gruppe mit einer niedrigen Überlebensrate unter dem Akronym des Tickets vorher / bc3889fa38ff32d46c13) Die eingereichte Punktzahl verbesserte sich von 0,78468 auf 0,81339. Nächstes Mal Abschließend werde ich den Ansatz für den Einreichungswert 0,83732 erläutern, der den oberen 1,5% entspricht.
Recommended Posts