[PYTHON] Kaggle Tutorial Le savoir-faire Titanic pour être dans le top 2%

1.Tout d'abord

Depuis que j'ai commencé à étudier l'apprentissage automatique, j'ai essayé le tutoriel pour débutants de ** Kaggle, Titanic ** de toute façon.

Au début, j'ai essayé de jouer avec le nombre de fonctionnalités à ma manière en me référant aux informations Web japonaises, mais même si les données d'entraînement donnaient une bonne précision, lorsque j'ai soumis les données de test, la précision ne s'est pas améliorée comme prévu. J'étais à l'agonie sans briser le mur des 80%.

Dans de telles circonstances, il est difficile de le joindre car il est en anglais, mais j'ai emprunté la sagesse de mon prédécesseur dans le ** Notebook ** de Kaggle / Taitanic et je l'ai finalement mis dans le top 2%, donc je vais faire un mémorandum mettant l'accent sur les points qui ont été particulièrement utiles. Laissez comme.

Maintenant, suivons le code.

1. Lire les données

Commencez par charger le jeu de données. Si le train et le test sont traités séparément, le même traitement doit être effectué deux fois, alors combinez-les dans df.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#Charger le jeu de données
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')

# train_données et test_concaténation de données
test_data['Survived'] = np.nan
df = pd.concat([train_data, test_data], ignore_index=True, sort=False)

#informations df
df.info()

#Relation entre le sexe et le taux de survie
sns.barplot(x='Sex', y='Survived', data=df, palette='Set3')
plt.show()

スクリーンショット 2019-11-20 19.43.33.png df est de 13 éléments x 1309 lignes. Les valeurs manquantes sont ** Âge **: 1309-1046 = 263, ** Tarif **: 1309-1308 = 1, ** Cabine **: 1309-295 = 1014, ** Embarqué **: 1309 -1307 = 2 pièces.

スクリーンショット 2019-11-21 09.47.01.png Si l'on examine les taux de survie des hommes et des femmes **, le taux de survie des femmes est extrêmement élevé **.

2. Âge d'achèvement de la valeur manquante

Au début, il y a une relation entre le titre et l'âge, alors je l'ai complété par ** l'âge moyen par titre **. Cependant, pour une raison quelconque, l'utilisation de cette quantité de fonctionnalité réduirait la précision, je ne l'ai donc pas utilisée pour la quantité de fonctionnalité. Peut-être que les titres qui varient en âge sont mauvais.

Dans Notebook, il y avait une personne qui ** a estimé la valeur manquante de Age dans une forêt aléatoire en utilisant des données complètes sans valeurs manquantes (Pclass, Sex, SibSp, Parch) **.   J'ai eu cette idée depuis le début, mais je pensais que je n'aurais pas à aller aussi loin. Mais c'était une erreur. Cela marche.

# ------------ Age ------------
#Âge à la classe, Sex, Parch,Estimation en forêt aléatoire de SibSp
from sklearn.ensemble import RandomForestRegressor

#Spécifiez l'élément à utiliser pour l'estimation
age_df = df[['Age', 'Pclass','Sex','Parch','SibSp']]

#Un encodage à chaud des fonctionnalités d'étiquette
age_df=pd.get_dummies(age_df)

#Séparé en données d'entraînement et données de test et converti en numpy
known_age = age_df[age_df.Age.notnull()].values  
unknown_age = age_df[age_df.Age.isnull()].values

#X données d'entraînement,Séparé en y
X = known_age[:, 1:]  
y = known_age[:, 0]

#Construire un modèle d'estimation dans une forêt aléatoire
rfr = RandomForestRegressor(random_state=0, n_estimators=100, n_jobs=-1)
rfr.fit(X, y)

#Prédire et compléter l'âge des données de test à l'aide d'un modèle d'estimation
predictedAges = rfr.predict(unknown_age[:, 1::])
df.loc[(df.Age.isnull()), 'Age'] = predictedAges 

#Courbes de survie et de mortalité par âge
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 En complément des valeurs manquantes de Age, si vous tracez une courbe de survie et une courbe de mortalité par âge, vous diriez que ** le pic de survie est inférieur à 10 ans ** et le pic de mortalité se situe à la fin des années 20 **. C'est ça?

3. Créez une nouvelle quantité d'objets à partir de Nom

Depuis le début, j'ai également sorti le titre de ** Name et l'ai utilisé comme quantité de fonctionnalités. ** Et, sûrement, cela a contribué à l'amélioration de la précision (la précision diminue lorsqu'elle est retirée).

# ------------ Name --------------
#Titre du nom(Title)Extraire et grouper
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 En regardant le taux de survie par titre, nous pouvons voir que ** Mr a le taux de survie le plus bas et Mme a le taux de survie le plus élevé **.

Maintenant, dans Notebook, en plus de cela, il y avait une personne qui a retiré le nom de famille de ** Nom et s'est concentrée sur un groupe avec plusieurs personnes avec le même nom de famille **.   En d'autres termes, ** la perspective que si vous avez une famille, vous avez tendance à partager votre destin **.

# ------------ Surname ------------
#Nom et prénom(Nom de famille)Extrait
df['Surname'] = df['Name'].map(lambda name:name.split(',')[0].strip())

#Même nom(Nom de famille)Comptez la fréquence d'apparition(Famille si le nombre de comparutions est de 2 ou plus)
df['FamilyGroup'] = df['Surname'].map(df['Surname'].value_counts()) 

Ensuite, si vous divisez la famille en un groupe ** de 16 ans ou moins ou de femmes ** (dites filles et enfants) et un groupe ** de plus de 16 ans et d'hommes **, il est intéressant de voir le taux de survie. Je peux le voir.

#Taux de survie des familles de moins de 16 ans ou des femmes
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 Le ** groupe de 16 ans ou moins ou de femmes ** a un taux de survie de 0% seulement dans 32 groupes, tandis que 113 groupes ont un taux de survie de 100%. En d'autres termes, ** de nombreux groupes sont tous vivants, mais seuls certains sont anéantis **.

#Taux de survie des hommes de plus de 16 ans dans la famille
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 ** Le groupe des hommes de plus de 16 ans ** a un taux de survie de 100% pour seulement 21 groupes, tandis que 115 groupes ont un taux de survie de 0%. En d'autres termes, ** de nombreux groupes sont anéantis, mais seuls certains groupes sont tous vivants **.

L'information précieuse que l'on peut tirer de ces faits est qu'il y a une minorité qui a été destinée à aller à contre-courant **. Sur la base de ces informations minoritaires, nous prendrons les mesures suivantes.

#Créer des listes mortes et des survivants
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)

#Afficher la liste morte et la liste des survivants
print('Dead_list = ', Dead_list)
print('Survived_list = ', Survived_list)

#Liste des morts et survivants sexuels, Age,Refléter dans le titre
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 À partir des données de formation, nous avons collecté la ** liste morte ** (Dead_list) qui a recueilli tous les noms de famille décédés dans le groupe des femmes de moins de 16 ans et les noms de famille qui ont tous survécu dans le groupe des hommes de plus de 16 ans * * Liste des survivants ** (Survived_list). Cela sera reflété dans les données de test.

Plus précisément, s'il y a une ligne qui correspond à la ** liste morte ** dans les données de test, ** Sexe, Âge, Titre sera remplacé par des données de décès typiques ** afin qu'il soit toujours considéré comme mort. Réécrivez, s'il y a une ligne correspondant à ** Liste de survie **, réécrivez le sexe, l'âge, le titre en données de survie typiques ** afin qu'il soit toujours jugé vivant.

Cela semble un peu délicat, mais je pense que c'est une manière intelligente car le modèle d'estimation est simple. Comme prévu, c'est la sagesse de nos prédécesseurs.

4. Compléter les valeurs manquantes dans Fare

Le tarif est complété en prenant la médiane du tarif à partir des paramètres de valeur manquante (Embarked = S, Pclass = 3) en disant qu'il sera lié au lieu d'embarquement (Emabarked) et à la classe (P class). Cela ne devrait pas être un problème.

# ----------- Fare -------------
#Valeurs manquantes embarquées='S', Pclass=Complété par la valeur moyenne de 3
fare=df.loc[(df['Embarked'] == 'S') & (df['Pclass'] == 3), 'Fare'].median()
df['Fare']=df['Fare'].fillna(fare)

5. Créer des fonctionnalités à partir de SibSp et Parch

** SibSp ** est le nombre de frères et de conjoints sur le Titanic, ** Parch ** est le nombre de parents et d'enfants sur le Titanic. Il vaut mieux additionner ** Famille ** en tant que quantité d'entités que d'en faire une quantité d'entités indépendante. Regroupement par taux de survie. Cela ne devrait pas non plus être un problème.

# ----------- Family -------------
# Family = SibSp + Parch +Regroupement avec 1 comme quantité de caractéristiques
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  # ==Remarque
df.loc[(df['Family']>=8), 'Family_label'] = 0

6. Extraire des fonctionnalités significatives de Ticket

Dans un premier temps, sans aucune raison, j'ai fait une quantité de caractéristiques ** avec la première lettre du numéro de billet. Effectivement, je n'ai pas utilisé cette fonctionnalité comme une fonctionnalité car la précision chuterait si je l'utilisais. Après tout, il semble que ce n'est pas une bonne idée d'en faire un montant de fonction même s'il n'y a aucune raison.

Dans Notebook, une personne a créé une quantité d'entités ** en fonction du nombre de personnes ayant le même numéro de ticket. Eh bien, alors vous pouvez comprendre la raison. ** Les personnes ayant le même numéro de billet resteront probablement dans la même pièce et partageront leur destin, et la facilité de survie changera en fonction du nombre de personnes **.

Vous trouverez ci-dessous un graphique des taux de survie par nombre de personnes ayant le même numéro de billet.

# ----------- Ticket ----------------
#Extraire le nombre de personnes avec le même numéro de ticket en tant que quantités de fonctionnalités
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 Le taux de survie de 2 à 4 personnes est élevé, le taux de survie de 5 à 8 et 1 est moyen et le taux de survie de 11 est nul. Par conséquent, nous allons le regrouper en trois.

#Regroupement en 3 par taux de survie
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 Il existe de nombreuses valeurs manquantes, mais comme le taux de survie des valeurs manquantes U est clairement faible, nous ne complétons pas spécifiquement les valeurs manquantes. Cela ne devrait pas non plus être un problème.

# ------------- Cabin ----------------
#Utiliser le premier caractère de Cabine comme quantité de fonction(La valeur manquante est 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 Les valeurs manquantes sont complétées par S, qui a le plus de passagers. Cela devrait être bien aussi.

# ---------- Embarked ---------------
#Compléter les valeurs manquantes avec S
df['Embarked'] = df['Embarked'].fillna('S') 

9. Prétraitement

Il s'agit d'un prétraitement pour créer un modèle estimé dans une forêt aléatoire. ** Les caractéristiques d'étiquette peuvent être décomposées par un encodage à chaud des caractéristiques d'étiquette. ** **

Par exemple, le contenu de Embarked se compose de trois libellés: C, Q et S. Multiplier cela par un encodage à chaud crée automatiquement trois éléments, Embarked_C, Embarked_Q et Embarked_S, et change l'expression selon laquelle un seul des trois éléments est 1 et le reste 0.

En faisant cela, Embarked_C et Embarked_S sont adoptés comme quantités d'entités, mais Embarked_Q est surappris, de sorte que des mesures de prévention du surapprentissage détaillées peuvent être prises.

C'était la première fois que j'apprenais à ce sujet dans Notebook, et je pensais que ** la décomposition des quantités de fonctionnalités par encodage à chaud serait une arme puissante pour sélectionner uniquement ce dont vous avez besoin après avoir trouvé différentes quantités de fonctionnalités **. C'était.

# -------------Prétraitement---------------
#Spécifiez l'élément à utiliser pour l'estimation
df = df[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','Family_label','Cabin_label','Ticket_label']]

#Un encodage à chaud des fonctionnalités d'étiquette
df = pd.get_dummies(df)

#Divisez l'ensemble de données en train et test
train = df[df['Survived'].notnull()]
test = df[df['Survived'].isnull()].drop('Survived',axis=1)

#Convertir le bloc de données en numpy
X = train.values[:,1:]  
y = train.values[:,0] 
test_x = test.values

10. Construction d'un modèle d'estimation avec une forêt aléatoire

Au début, j'ai choisi la meilleure combinaison en ajoutant ou en soustrayant manuellement les fonctionnalités que j'avais créées et en voyant quelle serait la précision.

Cependant, dans Notbook, il y avait ** des personnes qui utilisaient SelectKbest pour sélectionner automatiquement des fonctionnalités **. C'est efficace!

Le nombre d'entités à réduire est spécifié sous la forme ** select = SelectKBest (k = 20) **.

# -----------Construction du modèle estimée---------------
from sklearn.feature_selection import SelectKBest
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_validate

#Réduisez le nombre de fonctionnalités à adopter de 25 à 20
select = SelectKBest(k = 20)

clf = RandomForestClassifier(random_state = 10, 
                             warm_start = True,  #Ajouter l'apprentissage à un modèle qui s'adapte déjà
                             n_estimators = 26,
                             max_depth = 6, 
                             max_features = 'sqrt')
pipeline = make_pipeline(select, clf)
pipeline.fit(X, y)

#Affichage des résultats d'ajustement
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 Le score moyen résultant de la réduction à 20 fonctionnalités était de 0,8417441.

Maintenant, vérifions quelle quantité de fonctionnalités a été adoptée dans le modèle construit avec le code ci-dessus.

# --------Montant de la fonctionnalité adoptée---------------
#Statut d'adoption
mask= select.get_support()

#Liste d'objets
list_col = list(df.columns[1:])

#Liste des disponibilités d'adoption par article
for i, j in enumerate(list_col):
    print('No'+str(i+1), j,'=',  mask[i])

#Vérification de la forme
X_selected = select.transform(X)
print('X.shape={}, X_selected.shape={}'.format(X.shape, X_selected.shape))

スクリーンショット 2019-11-21 11.01.14.png Sur les 25 quantités de caractéristiques préparées, Embarked_Q, Title_officer, Cabin_label_A, Cabin_label_G, Cabin_label_T n'ont pas été adoptées, et les autres ont été adoptées, et la quantité de caractéristiques a certainement été réduite à 20.

11. Création de Submit_data

# -----Création des données de soumission------- 
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 Au 21 novembre 2019, le résultat était ** précision 0,83732 ** et ** 259e place **. Le nombre de membres participants étant de 15 889, il se situe autour de ** Top 1.6% **.

12. Résumé

Cette fois, je résumerai le savoir-faire acquis de Kaggle / titanic Notebook. ** 1) L'achèvement des valeurs manquantes est une méthode permettant de créer un modèle d'estimation à partir de données complètes sans valeurs manquantes et de le compléter (âge). 2) Les fonctionnalités apparemment aléatoires devraient toujours pouvoir trouver de nouvelles fonctionnalités à partir du raisonnement rationnel (Ticket). 3) Même si une nouvelle quantité de caractéristiques est trouvée une fois, plusieurs quantités de caractéristiques peuvent être trouvées (Nom). 4) Il existe une fréquence (Nom, Ticket) comme point de vue pour rechercher de nouvelles fonctionnalités. 5) Il s'agit d'une mesure efficace de prévention du surapprentissage pour décomposer et sélectionner le montant de la fonction d'étiquette (Embarqué, Titre, Cabine). 6) Select KBset peut être utilisé pour sélectionner efficacement les quantités de caractéristiques. ** **

13. Code

Enfin, je vais résumer le code.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#Charger le jeu de données
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')

# train_données et test_concaténation de données
test_data['Survived'] = np.nan
df = pd.concat([train_data, test_data], ignore_index=True, sort=False)

#informations df
df.info()

#Relation entre le sexe et le taux de survie
sns.barplot(x='Sex', y='Survived', data=df, palette='Set3')
plt.show()

# ------------ Age ------------
#Âge à la classe, Sex, Parch,Estimation en forêt aléatoire de SibSp
from sklearn.ensemble import RandomForestRegressor

#Spécifiez l'élément à utiliser pour l'estimation
age_df = df[['Age', 'Pclass','Sex','Parch','SibSp']]

#Un encodage à chaud des fonctionnalités d'étiquette
age_df=pd.get_dummies(age_df)

#Séparé en données d'entraînement et données de test et converti en numpy
known_age = age_df[age_df.Age.notnull()].values  
unknown_age = age_df[age_df.Age.isnull()].values

#X données d'entraînement,Séparé en y
X = known_age[:, 1:]  
y = known_age[:, 0]

#Construire un modèle d'estimation dans une forêt aléatoire
rfr = RandomForestRegressor(random_state=0, n_estimators=100, n_jobs=-1)
rfr.fit(X, y)

#Prédire et compléter l'âge des données de test à l'aide d'un modèle d'estimation
predictedAges = rfr.predict(unknown_age[:, 1::])
df.loc[(df.Age.isnull()), 'Age'] = predictedAges 

#Courbes de survie et de mortalité par âge
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 --------------
#Titre du nom(Title)Extraire et grouper
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 ------------
#Nom et prénom(Nom de famille)Extrait
df['Surname'] = df['Name'].map(lambda name:name.split(',')[0].strip())

#Même nom(Nom de famille)Comptez la fréquence d'apparition(Famille si le nombre de comparutions est de 2 ou plus)
df['FamilyGroup'] = df['Surname'].map(df['Surname'].value_counts()) 

#Taux de survie des familles de moins de 16 ans ou des femmes
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())

#Taux de survie des hommes de plus de 16 ans dans la famille
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())

#Créer des listes mortes et des survivants
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)

#Afficher la liste morte et la liste des survivants
print('Dead_list = ', Dead_list)
print('Survived_list = ', Survived_list)

#Liste des morts et survivants sexuels, Age,Refléter dans le titre
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 -------------
#Valeurs manquantes embarquées='S', Pclass=Complété par la valeur moyenne de 3
fare=df.loc[(df['Embarked'] == 'S') & (df['Pclass'] == 3), 'Fare'].median()
df['Fare']=df['Fare'].fillna(fare)

# ----------- Family -------------
# Family = SibSp + Parch +Regroupement avec 1 comme quantité de caractéristiques
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  # ==Remarque
df.loc[(df['Family']>=8), 'Family_label'] = 0

# ----------- Ticket ----------------
#Extraire le nombre de personnes avec le même numéro de ticket en tant que quantités de fonctionnalités
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()

#Regroupement en 3 par taux de survie
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 ----------------
#Utiliser le premier caractère de Cabine comme quantité de fonction(La valeur manquante est 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 ---------------
#Compléter les valeurs manquantes avec S
df['Embarked'] = df['Embarked'].fillna('S') 

# -------------Prétraitement---------------
#Spécifiez l'élément à utiliser pour l'estimation
df = df[['Survived','Pclass','Sex','Age','Fare','Embarked','Title','Family_label','Cabin_label','Ticket_label']]

#Un encodage à chaud des fonctionnalités d'étiquette
df = pd.get_dummies(df)

#Divisez l'ensemble de données en train et test
train = df[df['Survived'].notnull()]
test = df[df['Survived'].isnull()].drop('Survived',axis=1)

#Convertir le bloc de données en numpy
X = train.values[:,1:]  
y = train.values[:,0] 
test_x = test.values

# -----------Construction du modèle estimée---------------
from sklearn.feature_selection import SelectKBest
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_validate

#Réduisez le nombre de fonctionnalités à adopter de 25 à 20
select = SelectKBest(k = 20)

clf = RandomForestClassifier(random_state = 10, 
                             warm_start = True,  #Ajouter l'apprentissage à un modèle qui s'adapte déjà
                             n_estimators = 26,
                             max_depth = 6, 
                             max_features = 'sqrt')
pipeline = make_pipeline(select, clf)
pipeline.fit(X, y)

#Affichage des résultats d'ajustement
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']))

# --------Montant de la fonctionnalité adoptée---------------
#Statut d'adoption
mask= select.get_support()

#Liste d'objets
list_col = list(df.columns[1:])

#Liste des disponibilités d'adoption par article
for i, j in enumerate(list_col):
    print('No'+str(i+1), j,'=',  mask[i])

#Vérification de la forme
X_selected = select.transform(X)
print('X.shape={}, X_selected.shape={}'.format(X.shape, X_selected.shape))

# -----Création des données de soumission------- 
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 Le savoir-faire Titanic pour être dans le top 2%
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 Titanic Précision 80.9% (Top 7% 0.80861)
Examinez les paramètres de RandomForestClassifier dans le didacticiel Kaggle / Titanic
Jour 66 [Introduction à Kaggle] Les prévisions Titanic les plus faciles
J'ai essayé de prédire les chevaux qui seront dans le top 3 avec LightGBM
Regardez de plus près le tutoriel Kaggle / Titanic
Cochez le bouton Vérifier dans Tkinter pour autoriser la modification de l'entrée
Programmation pour combattre dans le monde ~ 5-5,5-6
[Kaggle] Participation au concours du mélanome
Programmer pour combattre dans le monde 5-3
Programmation pour combattre dans le monde - Chapitre 4
Dans la commande python, python pointe vers python3.8
Déployer le didacticiel Django sur IIS ①
Essayez Cython dans les plus brefs délais
Programmation pour combattre dans le monde ~ 5-2
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
Changer le module à charger pour chaque environnement d'exécution en Python
Obtenez les nièmes valeurs les plus importantes dans Pandas
Défis de la compétition Titanic pour les débutants de Kaggle
Dans Jupyter, ajoutez IPerl au noyau.
Vérifiez la corrélation avec le Titanic de Kaggle (kaggle③)
Divers commentaires à écrire dans le programme
C'est normal de tomber sur Titanic! Présentation de la stratégie Kaggle pour les super débutants
Si une exception survient dans la fonction, elle sera transmise à l'appelant 2
Si une exception survient dans la fonction, elle sera transmise à l'appelant 1
django geodjango auquel j'ai fait référence quand je suis resté coincé dans le tutoriel (édition)
Comment utiliser la bibliothèque C en Python
Connectez-vous à un serveur distant avec SSH
Client de streaming Twitter à apprécier dans le terminal
Pour remplacer dynamiquement la méthode suivante en python
Dessinez des graphiques dans Julia ... Laissez les graphiques à Python
Conseils pour rédiger un aplatissement concis en python
Comment obtenir les fichiers dans le dossier [Python]
[Django] css dans le projet ne peut pas être lu
PyQtGraph peut ne pas être disponible dans l'interpréteur.
Connectez-vous avec json en utilisant pygogo.
Je veux afficher la progression en Python!
Utilisez tkinter pour déplacer le code de sortie en tant que "A et prétendant être B" en python
Que faire quand n'est pas dans le fichier sudoers. Cet incident sera signalé.
Vous devez faire attention aux commandes que vous utilisez quotidiennement dans l'environnement de production.