[PYTHON] Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2

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.

1. Importez la bibliothèque requise et chargez le CSV.

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.

2. Confirmer la relation entre l'âge et le taux de survie

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

image.png 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?

3. Confirmer la relation 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]))

image.png 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?

4. Confirmer la relation entre le taux de survie et les frais

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

image.png Après tout, on peut voir que les personnes avec des billets à bas prix ont un faible taux de survie.

5. Confirmer la relation entre l'âge et le 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()

image.png L'enfant a-t-il d'abord obtenu de l'aide? Vous pouvez voir que le taux de survie sous 10 ans est élevé.

6. Confirmer la relation entre la chambre d'hôtes et le taux de survie

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. image.png

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

image.png 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.

6.1 Ajoutez des informations sur la salle et faites des prédictions de la même manière que Dernière fois

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

7. Confirmer la relation entre le ticket et le taux de survie

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

image.png Il y a une différence par rapport à la division précédente de la cabine (au niveau de la chambre).

7.1 Ajouter les informations de ticket initiales pour faire des prédictions

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

7.2 Faire des prédictions en regroupant les informations initiales des tickets

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

image.png 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.

8. Résumé

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

Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_3
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_1
Explication d'approche pour que les débutants soient dans le top 1,5% (0,83732) dans Kaggle Titanic_2
Kaggle Tutorial Le savoir-faire Titanic pour être dans le top 2%
Examinez les paramètres de RandomForestClassifier dans le didacticiel Kaggle / Titanic
[Pour les débutants de Kaggle] Titanic (LightGBM)
[Pour les débutants] Je souhaite expliquer le nombre d’apprentissage d’une manière facile à comprendre.
[Kaggle pour les super débutants] Titanic (retour logistique)
Changer le module à charger pour chaque environnement d'exécution en Python
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Le moyen le plus rapide pour les débutants de maîtriser Python
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
Essayez de calculer RPN avec Python (pour les débutants)
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Histoire de base de l'héritage en Python (pour les débutants)
Jour 66 [Introduction à Kaggle] Les prévisions Titanic les plus faciles
Comment limiter la publication de l'API dans la bibliothèque partagée en langage C de Linux
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
[Pour les débutants] Comment utiliser la commande say avec python!
Comment obtenir le nombre de chiffres en Python
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
[Pour les débutants] Installez le package dans l'environnement Anaconda (Janome)
Vérifier l'existence de tables BigQuery en Java
[Pour les débutants] Quantifier la similitude des phrases avec TF-IDF
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Tout pour que les débutants puissent faire du machine learning
[Pour les débutants des professionnels de la compétition] Trois méthodes de saisie à retenir lors du démarrage de la programmation de compétition avec Python
Ce qui semble être un modèle pour la partie d'entrée standard du pro de la concurrence en python3
Comment trouver le nombre optimal de clusters pour les k-moyennes
Code de test pour vérifier les liens brisés dans la page
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
traitement python3 qui semble utilisable dans paiza
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
■ Kaggle Practice pour les débutants - Introduction de Python - par Google Colaboratory
Résumé des points d'achoppement à Django pour la première fois
[Explication pour les débutants] Introduction au traitement du pliage (expliqué dans TensorFlow)
[Explication pour les débutants] Introduction au traitement du pool (expliqué dans TensorFlow)
Obtenez le nombre d'occurrences pour chaque élément de la liste
Conseils aux débutants en Python pour utiliser l'exemple Scikit-image par eux-mêmes
Pour les débutants, comment gérer les erreurs courantes dans les keras
[Python] Les principales faiblesses et inconvénients de Google Colaboratory [Pour les débutants]
Google recherche la chaîne sur la dernière ligne du fichier en Python
Cochez le bouton Vérifier dans Tkinter pour autoriser la modification de l'entrée
Comment éliminer le "Les balises doivent être un tableau de hachages." Erreur dans l'API qiita
Mettre le processus en veille pendant un certain temps (secondes) ou plus en Python
Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
L'histoire du retour au front pour la première fois en 5 ans et de la refactorisation de Python Django
Premier Kaggle (kaggle ①)
[Pour les débutants] kaggle exercice (merucari)
Vue d'ensemble de Docker (pour les débutants)
Kaggle Tutorial Titanic Précision 80.9% (Top 7% 0.80861)
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Comment définir la résolution de sortie pour chaque image clé dans Blender
[Pour les débutants] Comment implémenter l'exemple de code O'reilly dans Google Colab
Comment déterminer l'existence d'un élément sélénium en Python
Comment modifier le niveau de journalisation d'Azure SDK pour Python