[PYTHON] Kaguru pour la première fois

Cet article est le 17e jour du Calendrier de l'Avent Akatsuki 2016.

Ravi de vous rencontrer. Je m'appelle @chosty et je suis ingénieur serveur chez Akatsuki Co., Ltd. Récemment, j'ai dit que «le travail est mauvais pour ma santé» au travail.

Personnellement, je m'intéresse au machine learning et à l'analyse de données, et j'y travaille de temps en temps. Jusqu'à présent, je faisais ce domaine avec R, mais il y avait un endroit où je voulais toucher Python, alors j'écrirai un article disant que j'ai essayé un tutoriel rapide avec Kaggle.

Qu'est-ce que Kaggle

Ceci est un site de compétition d'analyse de données. Le site officiel est ici. Les ensembles de données et les thèmes (objectifs) sont présentés par des entreprises et des chercheurs et ils se disputent les scores. Il semble que si vous donnez un bon score, vous obtiendrez un prix et parlerez de recrutement. C'est une bonne histoire. L'année dernière, Recruit parlait du premier concours organisé par une entreprise japonaise. Il semble qu'environ 340 000 analystes de données étaient enregistrés chez Kaggle à ce moment-là.

C'est un service comme ça, mais en plus des concours proposés par les entreprises et les chercheurs, il y a aussi des concours d'apprentissage proposés par Kaggle. Cette fois, j'essaierai l'un d'entre eux, et je m'attaquerai au problème de prédiction des survivants du Titanic. https://www.kaggle.com/c/titanic

Tâche

Le problème de prédiction du survivant du Titanic prédit la vie ou la mort d'une personne à bord du Titanic à partir de données données. Téléchargez train.csv et test.csv sur le site ci-dessus et voyez quels types de fonctionnalités sont fournis.

Valeur de la fonctionnalité sens
PassengerID Juste une pièce d'identité donnée par Kaggle
Survived As-tu survécu(0 = NO, 1 = Yes)
Pclass Classe de chambre
Name Nom
Sex sexe
Age âge
SibSp Nombre de frères et de conjoints chevauchant ensemble
Parch Nombre de parents et d'enfants chevauchant ensemble
Ticket Numéro de billet
Fare Tarif passager
Cabin cabine
Embarked Lieu d'embarquement

À partir des quantités de caractéristiques ci-dessus, il semble que ce sera un flux pour en rechercher une qui semble être efficace pour la prédiction et créer un modèle de prédiction en l'utilisant. Lors de la création d'un modèle, il est bon de faire une hypothèse et d'enquêter. Par exemple, il peut être bon de penser que les personnes qui étaient dans des chambres de première classe ont un taux de survie élevé, ou que de nombreuses familles roulent ensemble et que les hommes ont un faible taux de survie. En plus de cela, je pense qu'il est plus logique cette fois de supprimer les fonctionnalités qui ne fonctionnent pas et d'ajouter quelque chose qui semble fonctionner par vous-même. Cependant, cette fois, le but est de le faire rapidement, je vais donc le mettre de côté. Au fait, bien sûr, Survived n'est disponible que dans train.csv.

Regardez les données et essayez-les pour le moment

À partir de là, prenons les données avec Python et voyons quelles valeurs sont stockées.

##Préparation
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

train = pd.read_csv("train.csv")
train.head() #Sortie des 5 premières lignes de données
train.info() #Confirmation du type de données
train.isnull().sum() #Confirmation des valeurs manquantes
train.describe() #Résumé

Un tel résultat est renvoyé.

head.png info.png is_null.png describe.png

jupyter pratique, le meilleur.

Puisque la moyenne des survivants est de 0,38, on peut constater qu'environ 60% des personnes sont décédées. Même si tout le monde n'aide pas pour le moment, la précision sera telle qu'elle est.

Je veux compenser les valeurs manquantes liées à l'âge. Il existe diverses méthodes complémentaires, et il serait préférable de décider de la similitude avec d'autres enregistrements ou d'estimer à partir d'autres quantités d'entités, mais pour le moment, remplacez-la par la valeur médiane. J'ai pensé changer le sexe et le lieu d'embarquement en mannequin, et laisser tomber la cabine car il y a trop de valeurs manquantes, alors je vais le faire. J'aimerais gérer le nom, mais c'est gênant, alors je vais le laisser tomber pour le moment. Les billets sont également un obstacle, alors laissez-les tomber. Supprimez l'enregistrement avec la valeur manquante à la fin. Si la précision est mauvaise, il serait bon de créer des fonctionnalités utiles à partir des informations déposées ici.

##Mise en forme des données
train.Age = train.Age.fillna(train.Age.mean())
train = train.replace("male",0).replace("female",1).replace("C",0).replace("Q",1).replace("S",2)
train = train.drop(["Name", "Ticket", "Cabin", "PassengerID"], axis=1)
train = train.dropna()
train_data = train.values

En regardant le coefficient de corrélation dans cet état, c'est comme suit.

corr.png

Le sexe a la corrélation la plus élevée avec Survived, suivi du tarif d'embarquement, du nombre de parents et d'enfants, puis de la classe de la chambre d'hôtes. Le tarif d'embarquement est-il corrélé positivement mais la classe de la chambre d'hôtes est-elle corrélée négativement? (Les classes de chambre sont 1 = 1er, 2 = 2ème, 3 = 3ème.) Je pensais que le nombre de fonctionnalités était trop petit, mais certaines fonctionnalités étaient corrélées, je vais donc créer un modèle en utilisant les données formatées telles quelles.

Cette fois, je vais construire un modèle en utilisant Random Forest et prédire la vie et la mort de la personne dans les données de test. En ce qui concerne Random Forest, je pense que ce serait plus facile à comprendre si vous regardez les documents de M. Hamada. http://www.slideshare.net/hamadakoichi/randomforest-web C'est bien de frapper l'œuvre originale, mais il y en a pas mal et je veux l'implémenter! Je veux en savoir plus! Si vous n'êtes pas une personne, vous n'avez pas à le lire. Quoi qu'il en soit, si vous êtes ennuyé, vous devriez faire beaucoup d'arbres de décision et prendre une décision à la majorité, ou quelque chose du genre.

##Construction de modèles
from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100)
forest = forest.fit(train_data[0::,1::],train_data[0::,0])

##Prévoir
test = pd.read_csv("test.csv")
ids = test["PassengerId"].values
test.Age = test.Age.fillna(test.Age.mean())
test.Fare = test.Fare.fillna(test.Fare.mean())
test = test.replace("male",0).replace("female",1).replace("C",0).replace("Q",1).replace("S",2)
test = test.drop(["Name", "Ticket", "Cabin", "PassengerId"], axis=1)
test_data = test.values
output = forest.predict(test_data)

##Exportation
import csv
output_file = open("output.csv", "w")
file = csv.writer(output_file)
file.writerow(["PassengerId","Survived"])
file.writerows(zip(ids, output.astype(np.int64)))
output_file.close()

Si vous soumettez le csv exporté à kaggle, le score sortira. Comme ça.

result.png

C'était exact à environ 75%. C'est plus précis que la prédiction que tout le monde est mort, mais ce n'est pas si élevé, et il semble que ce sera raisonnable même si vous le faites correctement. Vous pouvez voir que je regarde l'échelle, mais je devine toutes les 14 meilleures personnes. Comment puis je faire ça ...

Impressions et avenir

C'est assez facile à soumettre, et bien sûr, vous pouvez voir votre propre score, et c'est bien de pouvoir le comparer avec les scores d'autres personnes. Il y a des tonnes de messages sur les forums, alors jetez un œil à ma méthode de prédiction! !! !! C'est amusant et éducatif à voir. Cette fois, mon objectif était de construire rapidement un modèle, de le prédire et de le soumettre, mais j'aurais aimé prendre un peu plus de temps. Vous devriez peut-être tracer ou faire quelque chose pour chaque fonctionnalité. Donc, j'ai l'impression que je vais continuer à trouver du temps et à essayer un peu plus. Il semble bon d'essayer d'autres défis.

Après avoir fait une analyse des données un peu plus détaillée pour ce tutoriel, j'ai pensé que la précision serait améliorée si les éléments suivants étaient pris en compte. J'essaierai de trouver du temps. --Comment compléter l'âge (valeur manquante) --Lier les informations de famille en utilisant le nom

La fin

Recommended Posts

Kaguru pour la première fois
Voir python pour la première fois
Démarrez Django pour la première fois
J'ai essayé tensorflow pour la première fois
MongoDB avec Python pour la première fois
Essayons Linux pour la première fois
Comment utiliser MkDocs pour la première fois
J'ai essayé Mind Meld pour la première fois
Essayez de publier sur Qiita pour la première fois
J'ai essayé Python sur Mac pour la première fois.
J'ai essayé python pour la première fois avec heroku
Pour la première fois, j'ai découvert Unix (Linux).
AI Gaming Je l'ai essayé pour la première fois
Résumé des points d'achoppement à Django pour la première fois
Se présenter à Qiita pour la première fois (test post)
J'ai essayé l'API Google Cloud Vision pour la première fois
Si vous apprenez Linux pour la première fois, faites-le!
Premier Python
Premier message de Qiita (la raison du départ)
Premier Python
Impressions et mémorandum lors de la première utilisation de VScode
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
Une note utile lors de l'utilisation de Python après une longue période
Depuis que je suis libre, l'ingénieur front-end a essayé Python (v3.7.5) pour la première fois
Pour le moment, importez-les dans jupyter
Utilisez Logger avec Python pour le moment
Exécutez yolov4 "pour le moment" dans Windows
J'ai joué avec Floydhub pour le moment
Essayez d'utiliser LINE Notify pour le moment
virtualenv Pour le moment, c'est tout!
Le premier "JDBC" OR
La première «fonction» GOLD
Retour sur le concours d'apprentissage automatique sur lequel j'ai travaillé pour la première fois
Affichons un template simple idéal pour le premier Django
GTUG Girls + PyLadiesTokyo Meetup Je suis allé au premier machine learning
Mémo de flux pour déplacer LOCUST pour le moment
Exécutez avec CentOS7 + Apache2.4 + Python3.6 pour le moment
[Python] Mesure et affiche le temps nécessaire au traitement
Essayez d'installer Arch Linux pour le moment.
À côté d'Excel, le notebook Jupyter pour le moment
Importez audit.log dans Splunk et vérifiez le comportement lorsque Splunk est démarré pour la première fois.
J'ai fréquenté l'école et j'ai participé pour la première fois au concours limité BEGINNER de SIGNATE.
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Pour se préparer au test G 2020 # 2
Je veux déplacer le sélénium pour le moment [pour mac]
J'ai essayé d'exécuter PIFuHD sur Windows pour le moment
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Introduction au Deep Learning pour la première fois (Chainer) Reconnaissance des caractères japonais Chapitre 1 [Construction de l'environnement]
[Apprentissage de renforcement d'introduction] Renforcement de l'apprentissage pour bouger pour le moment
A quoi sert l'interface ...
Qu'est-ce qu'un chien? Django - Essayez d'utiliser Form pour la première fois Volume de transmission POST
Pour le moment, essayez d'utiliser l'API de dialogue de discussion docomo
Quel type d'environnement les personnes qui apprennent Python pour la première fois devraient-elles créer?
Mettre en majuscule uniquement la première lettre
Je veux créer un Dockerfile pour le moment.
Code dont j'aurais aimé me souvenir lors de ma première participation à AtCoder (Réflexion 1 pour la prochaine fois)