Voici l’histoire de votre première participation au concours Kaggle </ b>. Dans Last "First Kaggle", ・ Comment participer à Kaggle ・ Comment participer au concours ・ Jusqu'à ce que vous rejoignez et écrivez le code ・ Comment soumettre les résultats J'ai principalement écrit. Cette fois, je voudrais passer au point d'étudier au "Titanic competition". Le taux de précision de l'échantillon de code peut-il dépasser "76%"?
C'est à partir du point de savoir à quel point une personne qui connaît l'apprentissage automatique le décrit. Il y a environ six mois (avril 2019), je me suis intéressé à l'apprentissage automatique et j'ai principalement appris des livres suivants. ・ [Théorie et pratique par un spécialiste de la programmation de l'apprentissage automatique Python](https://www.amazon.co.jp/Python-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7% BF% 92% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E9% 81 % 94% E4% BA% BA% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3 % E3% 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E7% 90% 86% E8 % AB% 96% E3% 81% A8% E5% AE% 9F% E8% B7% B5-impress-gear / dp / 4295003379 / ref = dp_ob_title_bk) ・ [Explication détaillée Apprentissage en profondeur ~ Traitement des données de séries temporelles par TensorFlow ・ Keras ~](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%83%87%E3 % 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0-TensorFlow% E3 % 83% BBKeras% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 99% 82% E7% B3% BB% E5% 88% 97% E3% 83% 87% E3% 83 % BC% E3% 82% BF% E5% 87% A6% E7% 90% 86-% E5% B7% A3% E7% B1% A0-% E6% 82% A0% E8% BC% 94 / dp / 4839962510 / ref = sr_1_2? __mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & mots-clés =% E8% A9% B3% E8% A7% A3 +% E3% 83% 87 % E3% 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0 +% 7ETensorFlow % E3% 83% BBKeras% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 99% 82% E7% B3% BB% E5% 88% 97% E3% 83% 87% E3 % 83% BC% E3% 82% BF% E5% 87% A6% E7% 90% 86 & qid = 1575853564 & s = livres & sr = 1-2)
C'est une situation où vous ne savez pas ce que sont "scikit-learn", "tensorflow" et "keras".
L'image que je comprends est la suivante.
À mon niveau, je me demande si je peux écrire du code d'apprentissage en utilisant scicit-learn ou keras.
Le flux de l'apprentissage automatique est le suivant.
Vérifiez et gérez les données.
Tout d'abord, puisque nous allons commencer avec un nouveau Notebook différent du précédent, cliquez sur "New Notebook" et sélectionnez la langue "Paython" et tapez "Notebook" comme avant.
Vérifiez train.csv. Puisque vous pouvez écrire le code, vous pouvez afficher les données avec la commande pandas.head (), mais vous pouvez également le télécharger, alors téléchargeons-le. Cliquez sur train.csv et vous verrez 100 lignes de données à l'écran. Vous pouvez le télécharger avec le bouton de téléchargement.
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 3 | Braund, | male | 22 | 1 | 0 | A/5 21171 | 7.25 | S | |
2 | 1 | 1 | Cumings, | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
3 | 1 | 3 | Heikkinen, | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | S | |
4 | 1 | 1 | Futrelle, | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
5 | 0 | 3 | Allen, | male | 35 | 0 | 0 | 373450 | 8.05 | S | |
6 | 0 | 3 | Moran, | male | 0 | 0 | 330877 | 8.4583 | Q | ||
7 | 0 | 1 | McCarthy | male | 54 | 0 | 0 | 17463 | 51.8625 | E46 | S |
8 | 0 | 3 | Palsson, | male | 2 | 3 | 1 | 349909 | 21.075 | S | |
9 | 1 | 3 | Johnson, | female | 27 | 0 | 2 | 347742 | 11.1333 | S | |
10 | 1 | 2 | Nasser, | female | 14 | 1 | 0 | 237736 | 30.0708 | C |
Vérifiez CSV avec Excel, etc. Il y a certains éléments que je ne comprends pas, mais il y a une description dans les données du concours. En aparté, comme expliqué dans OverView, l'échantillon "gender_submission.csv" semble considérer "seules les femmes ont survécu". Certes, les valeurs de "Sex" dans "test.csv" et "Survived" dans "gender_submission.csv" correspondent. C'est pourquoi le taux de réponse correcte de «76%» est tout à fait formidable.
Data Dictionary
Variable | Definition | Traduction | Key |
---|---|---|---|
survival | Survival | Survie | 0 = No, 1 = Yes |
pclass | Ticket class | Classe de billet | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | sexe | |
Age | Age in years | âge | |
sibsp | # of siblings / spouses aboard the Titanic | Frères chevauchant le Titanic/Nombre de conjoints | |
parch | # of parents / children aboard the Titanic | Parents chevauchant le Titanic/Nombre d'enfants | |
ticket | Ticket number | Numéro de billet | |
fare | Passenger fare | Tarif passager | |
cabin | Cabin number | Numéro de chambre | |
embarked | Port of Embarkation | Port d'embarquement | C = Cherbourg, Q = Queenstown, S = Southampton |
Réfléchissez aux éléments à utiliser pour l'apprentissage. Puisque "Survival" est la partie qui est demandée, je vais l'utiliser comme réponse d'apprentissage. Étant donné que les femmes et les enfants sont plus susceptibles de monter sur l'embarcation de sauvetage en priorité, les termes «sexe» et «âge» sont utilisés. De plus, selon la situation, la richesse peut avoir eu un effet. Utilisons également «classe de billet» et «tarif passager». «Nom», «numéro de billet» et «port d'embarquement» ne semblent pas liés, ils sont donc exclus. Le problème est "sibsp" et "parch". Lorsque "sibsp" et "parch" sont agrégés par Excel, etc., c'est comme suit. Cela semble être lié, mais cette fois je l'ai exclu par souci de simplicité.
valeur de sibsp | Survival=1 | Survival=0 | Taux de survie |
---|---|---|---|
0 | 210 | 608 | 26% |
1 | 112 | 209 | 35% |
2 | 13 | 28 | 32% |
3 | 4 | 16 | 20% |
4 | 3 | 18 | 14% |
5 | 0 | 5 | 0% |
8 | 0 | 7 | 0% |
valeur du parchemin | Survival=1 | Survival=0 | Taux de survie |
---|---|---|---|
0 | 233 | 678 | 26% |
1 | 65 | 118 | 36% |
2 | 40 | 80 | 33% |
3 | 3 | 5 | 38% |
4 | 0 | 4 | 0% |
5 | 1 | 5 | 17% |
6 | 0 | 1 | 0% |
Supprimez l'exemple de code et écrivez le code suivant. Chargez train.csv et extrayez uniquement les éléments requis ('Survived', 'Pclass', 'Sex', 'Age', 'Fare').
import numpy
import pandas
##############################
#Prétraitement des données 1
#Extraire les éléments requis
##############################
# train.Charger csv
df_train = pandas.read_csv('/kaggle/input/titanic/train.csv')
df_train = df_train.loc[:, ['Survived', 'Pclass', 'Sex', 'Age', 'Fare']]
df_train.head()
index | Survived | Pclass | Sex | Age | Fare |
---|---|---|---|---|---|
0 | 0 | 3 | male | 22 | 7.25 |
1 | 1 | 1 | female | 38 | 71.2833 |
2 | 1 | 3 | female | 26 | 7.925 |
3 | 1 | 1 | female | 35 | 53.1 |
4 | 0 | 3 | male | 35 | 8.05 |
J'ai pu extraire uniquement les éléments requis.
Vérifiez les valeurs manquantes.
##############################
#Prétraitement des données 2
#Gérer les valeurs manquantes
##############################
#Vérifiez les valeurs manquantes
df_train.isnull().sum()
Colonne | compter |
---|---|
Survived | 0 |
Pclass | 0 |
Sex | 0 |
Age | 177 |
Fare | 0 |
Il existe de nombreuses données sans âge. Si possible, remplissez les valeurs manquantes, mais cette fois supprimez-les.
#Supprimer les lignes avec un âge nul
# Delete rows with null age
df_train = df_train.dropna(subset=['Age']).reset_index(drop=True)
len(df_train)
compter |
---|
714 |
Les lignes dont l'âge est nul ont été supprimées.
Les genres «masculin» et «féminin» sont difficiles à gérer tels quels, alors numérisez-les. Comme il n'y a que deux types, masculin et féminin, vous pouvez les convertir vous-même, mais scikit-learn a une classe pratique appelée LabelEncoder </ b>, alors utilisons-la. LabelEncoder: la méthode fit et la méthode fit_transform remplacent la chaîne de caractères par un entier de 0 à N-1 lorsqu'il y a N types de chaînes de caractères apparaissant dans l'entrée.
##############################
#Prétraitement des données 3
#Quantifier l'étiquette (nom)
##############################
from sklearn.preprocessing import LabelEncoder
#Quantifier le sexe à l'aide de Label Encoder
encoder = LabelEncoder()
df_train['Sex'] = encoder.fit_transform(df_train['Sex'].values)
df_train.head()
index | Survived | Pclass | Sex | Age | Fare |
---|---|---|---|---|---|
0 | 0 | 3 | 1 | 22 | 7.25 |
1 | 1 | 1 | 0 | 38 | 71.2833 |
2 | 1 | 3 | 0 | 26 | 7.925 |
3 | 1 | 1 | 0 | 35 | 53.1 |
4 | 0 | 3 | 1 | 35 | 8.05 |
Le «sexe» a été quantifié. Cet encodeur sera également utilisé plus tard lors de la quantification du sexe dans test.csv.
Il semble qu'il existe de nombreux cas où il est possible de mieux apprendre en ajustant l'échelle (standardisation) plutôt qu'en entrant les valeurs numériques comme des données d'apprentissage telles qu'elles sont. Par exemple, lors de l'analyse des résultats de tests, est-il plus facile à comprendre en utilisant des valeurs d'écart qu'en utilisant des points (sur 100 ou 200)? Standardisons «âge» et «tarif». Comme pour le codage d'étiquettes, la normalisation a une classe utile dans scicit-learn. Scaler standard </ b>.
##############################
#Prétraitement des données 4
#Normaliser les nombres
# Data preprocessing 4
# Standardize numbers
##############################
from sklearn.preprocessing import StandardScaler
#Standardisation
# Standardize numbers
standard = StandardScaler()
df_train_std = pandas.DataFrame(standard.fit_transform(df_train.loc[:, ['Age', 'Fare']]), columns=['Age', 'Fare'])
#Standardiser l'âge
# Standardize Age
df_train['Age'] = df_train_std['Age']
#Tarif standard
# Standardize Fare
df_train['Fare'] = df_train_std['Fare']
df_train.head()
index | Survived | Pclass | Sex | Age | Fare |
---|---|---|---|---|---|
0 | 0 | 3 | 1 | -0.530376641 | -0.518977865 |
1 | 1 | 1 | 0 | 0.571830994 | 0.69189675 |
2 | 1 | 3 | 0 | -0.254824732 | -0.506213563 |
3 | 1 | 1 | 0 | 0.365167062 | 0.348049152 |
4 | 0 | 3 | 1 | 0.365167062 | -0.503849804 |
L'âge et le tarif ont été standardisés. À ce stade, la maintenance des données est terminée.
Une fois que les données sont prêtes, il est temps de créer le modèle. Pour le moment, construisons-le avec scicit-learn. Vous trouverez ci-dessous un organigramme de la sélection d'algorithmes sur le site sckit-learn.
Choisissons un modèle selon cet organigramme. "Catégorie" OUI ⇒ "Avec données d'étiquette" Oui, passez à "classification" en haut à gauche. Je pense que cela correspond à «l'apprentissage supervisé par classification». Il est devenu "SVC linéaire" sur le graphique.
Lors de l'apprentissage, les données à apprendre (= x_train) et la réponse (= y_train) sont transmises au modèle séparément. L'image est la suivante.
y_train | x_train | ||||
---|---|---|---|---|---|
index | Survived | Pclass | Sex | Age | Fare |
0 | 0 | 3 | 1 | -0.530376641 | -0.518977865 |
1 | 1 | 1 | 0 | 0.571830994 | 0.69189675 |
2 | 1 | 3 | 0 | -0.254824732 | -0.506213563 |
3 | 1 | 1 | 0 | 0.365167062 | 0.348049152 |
4 | 0 | 3 | 1 | 0.365167062 | -0.503849804 |
Le code est ci-dessous.
##############################
#Construire un modèle
##############################
from sklearn.svm import LinearSVC
#Préparer les données d'entraînement
x_train = df_train.loc[:, ['Pclass', 'Sex', 'Age', 'Fare']].values
y_train = df_train.loc[:, ['Survived']].values
# y_Supprimer la cote du train
y_train = numpy.reshape(y_train,(-1))
#Générer un modèle
model = LinearSVC(random_state=1)
L'entraînement transmet simplement les données d'entraînement au modèle.
##############################
#Apprentissage
##############################
model.fit(x_train, y_train)
Voyons le résultat de l'apprentissage avec les données de test. test.csv doit être similaire aux données d'entraînement (x_train). Il y a un manque d'âge et de tarif, mais même s'il est insuffisant, le résultat doit être prédit. S'il s'agit de données de test, elles seront converties en "0" sans être supprimées.
##############################
# test.Convertir csv
# convert test.csv
##############################
# test.Charger csv
# Load test.csv
df_test = pandas.read_csv('/kaggle/input/titanic/test.csv')
# 'PassengerId'Extraire(À combiner avec le résultat)
df_test_index = df_test.loc[:, ['PassengerId']]
# 'Survived', 'Pclass', 'Sex', 'Age', 'Fare'Extraire
# Extract 'Survived', 'Pclass', 'Sex', 'Age', 'Fare'
df_test = df_test.loc[:, ['Pclass', 'Sex', 'Age', 'Fare']]
#Quantifier le sexe à l'aide de Label Encoder
# Digitize gender using LabelEncoder
df_test['Sex'] = encoder.transform(df_test['Sex'].values)
df_test_std = pandas.DataFrame(standard.transform(df_test.loc[:, ['Age', 'Fare']]), columns=['Age', 'Fare'])
#Standardiser l'âge
# Standardize Age
df_test['Age'] = df_test_std['Age']
#Tarif standard
# Standardize Fare
df_test['Fare'] = df_test_std['Fare']
# Age,Convertir Fare Nan en 0
# Convert Age and Fare Nan to 0
df_test = df_test.fillna({'Age':0, 'Fare':0})
df_test.head()
Index | Pclass | Sex | Age | Fare |
---|---|---|---|---|
0 | 3 | 1 | 0.298549339 | -0.497810518 |
1 | 3 | 0 | 1.181327932 | -0.512659955 |
2 | 2 | 1 | 2.240662243 | -0.464531805 |
3 | 3 | 1 | -0.231117817 | -0.482887658 |
4 | 3 | 0 | -0.584229254 | -0.417970618 |
J'ai pu convertir les données de test de la même manière. Prédisez le résultat. Transmettez simplement les données de test et prédisez.
##############################
#Prédire les résultats
# Predict results
##############################
x_test = df_test.values
y_test = model.predict(x_test)
Le résultat est dans y_test. Enregistrez le résultat dans le même format que gender_submission.csv.
#Combinez le résultat avec le DataFrame du PassengerId
# Combine the data frame of PassengerId and the result
df_output = pandas.concat([df_test_index, pandas.DataFrame(y_test, columns=['Survived'])], axis=1)
# result.Ecrire csv dans le répertoire courant
# Write result.csv to the current directory
df_output.to_csv('result.csv', index=False)
Avec ce qui précède, nous avons pu obtenir les résultats. J'essaierai de l'exécuter avec "Commit" comme avant. Une fois l'exécution terminée, cliquez sur "Ouvrir Viersion". Vous pouvez voir que result.csv a été créé.
Cliquez sur «Soumettre au concours» pour soumettre. Que va-t-il se passer ...
Le résultat était "0,75119". 75%. C'est pire que les exemples de données ^^;
Comment était-ce. Je n'ai pas ajusté du tout les paramètres d'apprentissage, mais j'ai compris le flux d'apprentissage. La prochaine fois examinera les données et examinera les paramètres d'apprentissage afin que le score soit un peu meilleur.
2019/12/11 Première édition publiée 2019/12/26 Installation du lien suivant 2020/01/03 Commentaires corrigés sur la source 2020/03/26 Partiellement révisé le code source de "6. Prédire le résultat avec les données de test"
Recommended Posts