J'ai essayé le didacticiel Titanic de Kaggle. Enregistrez le code sur le Jupyter NoteBook ici pour apprendre à utiliser Pandas et scikit-learn.
Kaggle est un site qui concourt pour le score par apprentissage automatique basé sur des données réelles.
C'est un excellent moyen d'étudier l'apprentissage automatique, car il existe des didacticiels que vous pouvez utiliser pour l'apprentissage automatique sans avoir à participer au concours.
Pour plus d'informations sur l'utilisation de Kaggle et du didacticiel Titanic [Introduction aux débutants de Kaggle] Qui survivra au Titanic? Je l'ai mentionné.
Mon code a été modifié pour me faciliter la compréhension, en me référant à l'article ci-dessus.
Lorsque vous vous inscrivez en tant qu'utilisateur avec Kaggle Titanic: Machine Learning from Disaster | Kaggle Vous pourrez télécharger les données depuis.
L'algorithme est un arbre de décision.
Après ça, Installation et démarrage faciles de Jupyter Notebook à l'aide de Docker (prend également en charge nbextensions et Scala) --Qiita Je suis en train de l'essayer dans l'environnement de Jupyter Notebook préparé selon.
Dans cet environnement Jupyter, vous pouvez accéder au port 8888 avec un navigateur et utiliser Jupyter Notebook. Vous pouvez ouvrir une nouvelle note en suivant Nouveau> Python 3 sur le bouton en haut à droite.
import numpy as np
import pandas as pd
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
train
et test
sont des objets DataFrame.
Concaténez les données une fois pour prétraiter les données en commun avec «train» et «test». Je vais mettre un drapeau pour que je puisse le diviser à nouveau plus tard. De plus, la colonne Survived
est uniquement incluse dans train
, supprimez-la donc une fois.
train["is_train"] = 1
test["is_train"] = 0
data = pd.concat([train.drop(columns=["Survived"]), test])
train.drop (columns = [" Survived "])
renvoie un nouvel objet DataFrame avec les colonnes supprimées. Il renvoie un nouvel objet, donc la colonne reste dans le train
d'origine. C'est la même chose même si vous écrivez train.drop ([" Survived "], axis = 1)
. ʻAxis = 1` est un indicateur pour supprimer des colonnes au lieu de lignes. Cependant, le premier est plus facile à comprendre.
pd.concat
renvoie un nouveau DataFrame qui est une concaténation de plusieurs DataFrames. Au fait, si vous passez ʻaxis = 1 à
pd.concat`, il sera connecté horizontalement.
À la suite de la concaténation, les données seront comme ceci. 1309 lignes de données.
Vérifiez l'état des données manquantes. La partie affichée comme NaN
dans l'écran ci-dessus est manquante dans la partie qui était vide dans le fichier CSV d'origine.
data.isnull().sum()
Vous pouvez vérifier le type de données dont vous disposez et la valeur médiane avec le code ci-dessous.
data["Age"].unique()
data["Age"].median()
Je mettrai la valeur médiane dans la partie manquante de l'item ʻAge`.
data["Age"] = data["Age"].fillna(data["Age"].median())
Vérifiez quelles données sont dans ʻEmbarked`. Vous pouvez vérifier le nombre d'enregistrements pour chaque donnée.
data["Embarked"].value_counts()
Il semble que S
occupe la majeure partie de ʻEmbarked, donc je vais mettre
S` dans la partie manquante.
data["Embarked"] = data["Embarked"].fillna("S")
data.isnull().sum()
Ensuite, convertissez les éléments «Sex» et «Embarked» qui sont des chaînes en nombres.
ʻEmbarked` n'avait que 3 modèles de S, C et Q, donc j'aimerais le convertir comme ça. C'est ce qu'on appelle le codage à chaud.
Embarked |
---|
S |
S |
C |
Q |
↓
Embarked_C | Embarked_Q | Embarked_S |
---|---|---|
0 | 0 | 1 |
0 | 0 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
L'encodage à chaud peut être fait avec une fonction appelée pd.get_dummies
. Le code pd.get_dummies (data [" Embarked "], prefix =" Embarked ")]
produit un DataFrame à trois colonnes: ʻEmbarked_S, ʻEmbarked_C
, ʻEmbarked_Q`. L'une des trois colonnes est 1 et les autres sont 0. Concaténez-le horizontalement avec les données d'origine et supprimez la colonne d'origine «Embarqué».
data = pd.concat([data, pd.get_dummies(data["Embarked"], prefix="Embarked")], axis=1).drop(columns=["Embarked"])
Puisque "Sex" n'avait que "male" et "female", il n'est pas nécessaire d'avoir deux colonnes, une colonne de 0, 1 suffit.
Sex |
---|
male |
female |
female |
↓
Sex |
---|
1 |
0 |
0 |
Il semble que l'ajout de l'option drop_first = True
à pd.get_dummies
supprime la première colonne et ne laisse qu'une seule colonne en conséquence.
data["Sex"] = pd.get_dummies(data["Sex"], drop_first=True)
Des deux colonnes générées par pd.get_dummies
, la première colonne était une femme, donc homme était 1 et femme 0. Je pense que peu importe lequel.
Le résultat est ce type de données.
Divisez à nouveau les «données» prétraitées en données d'entraînement et en données de vérification, et limitez-vous aux seules colonnes utilisées cette fois.
feature_columns =["Pclass", "Sex", "Age", "Embarked_C", "Embarked_Q", "Embarked_S"]
feature_train = data[data["is_train"] == 1].drop(columns=["is_train"])[feature_columns]
feature_test = data[data["is_train"] == 0].drop(columns=["is_train"])[feature_columns]
La variable objective n'était pas incluse dans "data", donc extrayez-la du premier "train".
target_train = train["Survived"]
Apprenez le modèle.
from sklearn import tree
model = tree.DecisionTreeClassifier()
model.fit(feature_train, target_train)
référence sklearn.tree.DecisionTreeClassifier — scikit-learn 0.21.3 documentation
Voyons le taux de réponse correct avec les données d'entraînement.
from sklearn import metrics
pred_train = model.predict(feature_train)
metrics.accuracy_score(target_train, pred_train)
J'ai "0.9001122334455668". 90% semble être la bonne réponse.
Enregistrons le résultat de l'inférence dans Kaggle et évaluons-le.
Tout d'abord, enregistrez le résultat de l'estimation avec les données de vérification dans my_prediction.csv
.
pred_test = model.predict(feature_test)
my_prediction = pd.DataFrame(pred_test, test["PassengerId"], columns=["Survived"])
my_prediction.to_csv("my_prediction.csv", index_label=["PassengerId"])
La première ligne du fichier CSV est la ligne d'en-tête, qui est «PassengerId, Survived».
Si vous téléchargez ce fichier sur le site de Kaggle, il vous donnera un score.
C'était "0,74641".
Recommended Posts