Après Dernière fois, Kaggle Titanic parmi les 1,5% supérieurs (0,83732) Je vais expliquer l'approche de. Le code à utiliser est titanic (0.83732) _2 dans Github. Cette fois, nous allons augmenter le score soumis à 0.81339 et nous préparer pour le prochain 0.83732. De plus, avant les prévisions, nous allons visualiser les données utilisées précédente et analyser les données.
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')
#Lire CSV
train= pd.read_csv("train.csv")
test= pd.read_csv("test.csv")
#Intégration de données
dataset = pd.concat([train, test], ignore_index = True)
#Pour soumission
PassengerId = test['PassengerId']
Regardons la relation de chaque donnée.
#Graphique de bande d'âge et taux de survie
sns.barplot(x="Sex", y="Survived", data=train, palette='Set3')
#Taux de survie par sexe
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 Vous pouvez voir que les femmes sont beaucoup plus utiles. Qu'en est-il du taux de survie pour chaque classe de billet?
#Graphique de classe de billet et de bande de survie
sns.barplot(x='Pclass', y='Survived', data=train, palette='Set3')
#Taux de survie par classe de billet
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 Plus l'acheteur de billets est élevé, plus le taux de survie est élevé. Et le prix?
#Comparaison des taux de survie par prix
fare = sns.FacetGrid(train, hue="Survived",aspect=2)
fare.map(sns.kdeplot,'Fare',shade= True)
fare.set(xlim=(0, 200))
fare.add_legend()
Après tout, on peut voir que les personnes avec des billets à bas prix ont un faible taux de survie.
#Comparaison des taux de survie par âge
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()
L'enfant a-t-il d'abord obtenu de l'aide? Vous pouvez voir que le taux de survie sous 10 ans est élevé.
De là, précédent Nous vérifierons les données inutilisées. Il y a d'abord les informations sur la chambre. La cabine (numéro de chambre) semble avoir des niveaux de chambre différents selon l'acronyme.
#Comparaison du taux de survie par niveau de chambre
dataset['Cabin'] = dataset['Cabin'].fillna('Unknown') #Remplacer Inconnu si les données de la salle sont manquantes
dataset['Deck'] = dataset['Cabin'].str.get(0) #Obtenez la première lettre (0ème lettre) de la cabine (numéro de chambre)
sns.barplot(x="Deck", y="Survived", data=dataset, palette='Set3')
Il existe quelques variantes. Dernière fois Après avoir remplacé la valeur médiane par la valeur manquante et confirmé qu'il n'y avait pas de valeur manquante, les informations «Deck» (hiérarchie de la salle) ont été créées cette fois Faites des prédictions supplémentaires.
# Age(âge)Et tarif(Frais)Est la valeur médiane de chacun, Embarqué(Point de départ)Est-ce que S(Southampton)Remplacer
dataset["Age"].fillna(dataset.Age.mean(), inplace=True)
dataset["Fare"].fillna(dataset.Fare.mean(), inplace=True)
dataset["Embarked"].fillna("S", inplace=True)
#Vérifiez le nombre de données manquantes
dataset_null = dataset.fillna(np.nan)
dataset_null.isnull().sum()
#Extraire les variables à utiliser
dataset3 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck']]
#Créer une variable factice
dataset_dummies = pd.get_dummies(dataset3)
dataset_dummies.head(3)
#Décomposer les données en train et tester
#( 'Survived'Existe en train,Pas de test)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Séparez les données du train en variables et les bonnes réponses
X = train_set.as_matrix()[:, 1:] #Variables après Pclass
y = train_set.as_matrix()[:, 0] #Corriger les données de réponse
#Créer un modèle prédictif
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Essayez 20-30 par incréments
'classify__max_depth':list(range(3, 10, 1))} #Essayez 3 à 10 par incréments
grid = GridSearchCV(estimator = pipe, param_grid = param_test, scoring='accuracy', cv=10)
grid.fit(X, y)
print(grid.best_params_, grid.best_score_)
#Prédiction des données de test
pred = grid.predict(test_set)
#Création d'un fichier csv pour la soumission Kaggle
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 La note soumise était de 0,78947. En incluant des informations sur le niveau de la pièce, il a augmenté par rapport à la fois précédente.
Ensuite, essayez les informations sur le ticket. Mais comment les regroupez-vous? Il est possible de faire la distinction entre le nombre de caractères et s'il faut ou non inclure la première lettre ou l'alphabet du nombre, mais s'il est trop augmenté, la précision sera réduite. Vérifions en divisant le nombre de caractères dans le ticket.
#Comparaison du taux de survie par le nombre de caractères du ticket
Ticket_Count = dict(dataset['Ticket'].value_counts()) #Regrouper par le nombre de caractères du ticket
dataset['TicketGroup'] = dataset['Ticket'].apply(lambda x:Ticket_Count[x]) #Distribution de groupe
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')
Il y a une différence par rapport à la division précédente de la cabine (au niveau de la chambre).
#Extraire les variables à utiliser
dataset4 = dataset[['Survived','Pclass','Sex','Age','Fare','Embarked', 'Deck', 'TicketGroup']]
#Créer une variable factice
dataset_dummies = pd.get_dummies(dataset4)
dataset_dummies.head(4)
#Décomposer les données en train et tester
#( 'Survived'Existe en train,Pas de test)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Séparez les données du train en variables et les bonnes réponses
X = train_set.as_matrix()[:, 1:] #Variables après Pclass
y = train_set.as_matrix()[:, 0] #Corriger les données de réponse
#Créer un modèle prédictif
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Essayez 20-30 par incréments
'classify__max_depth':list(range(3, 10, 1))} #Essayez 3 à 10 par incréments
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")
#Prédiction des données de test
pred = grid.predict(test_set)
#Création d'un fichier csv pour la soumission Kaggle
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 Le score d'entraînement a augmenté, mais le score soumis à Kaggle est tombé à 0,77990. En premier lieu, de manière réaliste, la corrélation entre le nombre de personnages d'un ticket et le taux de survie semble faible. Cependant, comme c'est une fonctionnalité qui est sortie avec beaucoup d'efforts, je vais essayer d'apprendre en supprimant les éléments en deux groupes, un groupe haut et un groupe bas.
#Divisez-vous en deux groupes, un groupe avec un taux de survie élevé en termes de nombre de personnages dans le ticket et un groupe avec un taux de survie faible.
#Remplacez 2 si élevé et 1 si faible
def Ticket_Label(s):
if (s >= 2) & (s <= 4): #Groupe avec un taux de survie élevé en nombre de caractères
return 2
elif ((s > 4) & (s <= 8)) | (s == 1): #Groupe avec un faible taux de survie en nombre de caractères
return 1
elif (s > 8):
return 0
dataset['TicketGroup'] = dataset['TicketGroup'].apply(Ticket_Label)
sns.barplot(x='TicketGroup', y='Survived', data=dataset, palette='Set3')
On dirait qu'il est parfaitement séparé.
#Décomposer les données en train et tester
#( 'Survived'Existe en train,Pas de test)
train_set = dataset_dummies[dataset_dummies['Survived'].notnull()]
test_set = dataset_dummies[dataset_dummies['Survived'].isnull()]
del test_set["Survived"]
#Séparez les données du train en variables et les bonnes réponses
X = train_set.as_matrix()[:, 1:] #Variables après Pclass
y = train_set.as_matrix()[:, 0] #Corriger les données de réponse
#Créer un modèle prédictif
clf = RandomForestClassifier(random_state = 10, max_features='sqrt')
pipe = Pipeline([('classify', clf)])
param_test = {'classify__n_estimators':list(range(20, 30, 1)), #Essayez 20-30 par incréments
'classify__max_depth':list(range(3, 10, 1))} #Essayez 3 à 10 par incréments
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")
#Prédiction des données de test
pred = grid.predict(test_set)
#Création d'un fichier csv pour la soumission Kaggle
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 Le score soumis à Kaggle s'est nettement amélioré à 0,81339.
Cette fois, en ajoutant des informations sur la hiérarchie des chambres et des informations réparties en deux groupes, un groupe avec un taux de survie élevé et un groupe avec un taux de survie faible par l'acronyme du ticket, [précédent](https://qiita.com/shiroino11111/items / bc3889fa38ff32d46c13), le score soumis est passé de 0,78468 à 0,81339. La prochaine fois Enfin, j'expliquerai l'approche du score de soumission 0.83732, qui correspond au top 1.5%.
Recommended Posts