En guise de tutoriel sur l'apprentissage de l'apprentissage automatique, j'enregistrerai pour rappel la méthode que j'ai utilisée pour prédire les survivants du Titanic, qui est un chemin incontournable pour tout le monde.
À propos de la version utilisée
Les données utilisées ont été téléchargées à partir d'ici après l'enregistrement auprès de Kaggle. https://www.kaggle.com/c/titanic
import pandas as pd
import numpy as np
df = pd.read_csv('train.csv')
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
Défini comme trame de données df. Regardons maintenant les cinq premières lignes des données lues.
df.head()
Survived est 1 pour la survie et 0 pour la mort. Veuillez consulter le site Web officiel pour connaître les autres facteurs auxquels se réfèrent.
Ensuite, regardons l'histogramme.
df.hist(figsize=(12,12))
plt.show()
Vous pouvez voir que la plupart d'entre eux ont entre 20 et 30 ans, et la plupart d'entre eux ont une classe P de 3 (la moins chère).
plt.figure(figsize = (15,15))
sns.heatmap(df.corr(),annot = True)
Les indicateurs avec un coefficient de corrélation élevé pour Survived sont 0,26: Fare et -0,34: Pclass. Si la note Pclass est décidée, Fare: Je pense que le tarif sera décidé naturellement, mais les deux sont des indicateurs différents. ..
df.isnull().sum()
PassengerId 0 Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
Âge: Âge et cabine: Vous pouvez voir qu'il y a beaucoup de montants sans le numéro d'équipage. Pour la gestion des valeurs manquantes, reportez-vous à ce qui suit. https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203
Cette fois, j'ai décidé de substituer la valeur médiane à l'âge. Aussi, embarqué: le lieu d'embarquement remplace le plus S. Les autres valeurs manquantes ont été supprimées.
from sklearn.model_selection import train_test_split
#Traitement de la valeur manquante
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Embarked'] = df['Embarked'].fillna('S')
#Conversion de variables catégorielles
df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
df['Embarked'] = df['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)
#Supprimer les colonnes inutiles
df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis =1)
train_X = df.drop('Survived',axis = 1)
train_y = df.Survived
(train_X , test_X , train_y , test_y) = train_test_split(train_X, train_y , test_size = 0.3 , random_state = 0)
Cette fois, les données de test sont de 30% (test_size = 0,3).
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion='gini', random_state = 0)
clf = clf.fit(train_X , train_y)
pred = clf.predict(test_X)
#Calcul du taux de réponse correcte
from sklearn.metrics import (roc_curve , auc ,accuracy_score)
pred = clf.predict(test_X)
fpr, tpr, thresholds = roc_curve(test_y , pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)
Je me suis référé ici pour le traitement des paramètres de l'arbre de décision. http://data-analysis-stats.jp/2019/01/14/%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A7%A3%E8%AA%AC/
criterion='gini', 0.7798507462686567 criterion='entropy', 0.7910447761194029
Le taux de réponse correcte était légèrement plus élevé pour l'entropie. Selon l'url de référence
Pour une bonne utilisation, on dit que le coefficient de Gini est meilleur pour les données continues et l'entropie est meilleure pour les données de catégorie. Le coefficient de Gini minimise les erreurs de classification, tandis que l'entropie recherche une valeur de référence de manière exploratoire.
... Apparemment ... Cette fois, il y avait beaucoup de données sur les catégories telles que le sexe et le lieu d'embarquement, donc l'entropie peut être appropriée.
Ceci est également utile car il contient des informations détaillées sur l'arbre de décision. https://qiita.com/3000manJPY/items/ef7495960f472ec14377
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators = 10,max_depth=5,random_state = 0) #Créez une instance d'une forêt aléatoire.
clf = clf.fit(train_X , train_y) #Entraînez le modèle avec la méthode d'ajustement à l'aide des étiquettes et des données de l'enseignant
pred = clf.predict(test_X)
fpr, tpr , thresholds = roc_curve(test_y,pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)
0.8283582089552238
Des forêts aléatoires sont disponibles pour la classification (classificateur) et pour l'analyse de régression (régresseur). Cette fois, puisque le but est de classer s'il est vivant ou mort, nous l'utiliserons pour le classement.
J'ai essayé de déplacer les paramètres d'apprentissage et les arguments de la classe RandomForestClassifier tout en regardant cela. https://data-science.gr.jp/implementation/iml_sklearn_random_forest.html
Au fur et à mesure que j'augmentais n_estimators, le taux de précision augmentait. On dit que les n_estimateurs et époques utilisés dans les réseaux de neurones se retrouvent souvent en difficulté même s'ils sont calculés avec de grandes valeurs. Veuillez voir ci-dessous pour le contenu et les contre-mesures. https://amalog.hateblo.jp/entry/hyper-parameter-search
D'après les résultats précédents, il a été constaté que le taux de réponse correcte est plus élevé dans la forêt aléatoire que dans l'arbre de décision. Par conséquent, nous avons décidé d'utiliser une forêt aléatoire cette fois.
fin = pd.read_csv('test.csv')
fin.head()
passsengerid = fin['PassengerId']
fin.isnull().sum()
fin['Fare'] = fin['Fare'].fillna(fin['Fare'].median())
fin['Age'] = fin['Age'].fillna(fin['Age'].median())
fin['Embarked'] = fin['Embarked'].fillna('S')
#Conversion de variables catégorielles
fin['Sex'] = fin['Sex'].apply(lambda x: 1 if x == 'male' else 0)
fin['Embarked'] = fin['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)
#Supprimer les colonnes inutiles
fin= fin.drop(['Cabin','Name','Ticket','PassengerId'],axis =1)
#Prédite dans une forêt aléatoire
predictions = clf.predict(fin)
submission = pd.DataFrame({'PassengerId':passsengerid, 'Survived':predictions})
submission.to_csv('submission.csv' , index = False)
C'était le 4900e / 16000e. Je voudrais me consacrer davantage.
Recommended Posts