[Python] [Apprentissage automatique] Les débutants sans aucune connaissance essaient l'apprentissage automatique pour le moment

supposition

Moi: Un débutant qui n'a jamais étudié ou touché à l'apprentissage automatique L'apprentissage automatique est une technologie que vous devriez connaître à l'avenir, et j'ai pensé que j'aimerais l'utiliser pendant un certain temps. Je le ferai avec une position d'essayer de le mettre en œuvre en visant un état où il bouge pour le moment, sans creuser profondément dans les détails (Je me sens vraiment léger et j'ai envie de réduire l'obstacle psychologique à l'apprentissage automatique)

Préparation environnementale

Pour le moment, rendez les pandas et scikit-learn disponibles en python Si vous l'installez avec pip, il devrait être terminé ...

$ pip install pandas
Traceback (most recent call last):
File "/home/myuser/.local/bin/pip", line 7, in <module>
from pip._internal import main
ImportError: No module named 'pip._internal'

Je ne suis pas sûr des détails, mais je ne peux pas en parler à moins que cela fonctionne pour le moment. Téléchargez get-pip.py depuis le Site officiel

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

Exécuter sur python, python3

$ sudo python get-pip.py
$ sudo python3 get-pip.py

Vérifiez si la commande pip est disponible

$ pip --version
pip 20.2.4 from /Library/Python/3.7/site-packages/pip (python 3.7)

Vous pouvez utiliser pip en toute sécurité Maintenant, vous pouvez installer des pandas, scicit-learn ↓ Confirmez qu'il a été installé

$ pip show pandas
Name: pandas
Version: 1.1.4
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: https://pandas.pydata.org
Author: None
Author-email: None
License: BSD
Location:
Requires: python-dateutil, numpy, pytz
Required-by: 

$ pip show scikit-learn
Name: scikit-learn
Version: 0.23.2
Summary: A set of python modules for machine learning and data mining
Home-page: http://scikit-learn.org
Author: None
Author-email: None
License: new BSD
Location:
Requires: joblib, threadpoolctl, scipy, numpy
Required-by: sklearn

Procédure approximative pour l'apprentissage automatique

Un rapide coup d'œil révèle que l'apprentissage automatique suit à peu près le flux ci-dessous.

  1. Obtention de données
  2. Prétraitement des données
  3. Sélection de la méthode
  4. Sélection des hyper paramètres
  5. Formation sur modèle
  6. Évaluation (→ Revenez à 2 ou 3 ou 4 et essayez et faites une erreur)

Titanic: Machine Learning from Disaster (prédiction de survie du Titanic)

Pour le moment, j'essaierai la prédiction de survie Titanic de Kaggle que je vois souvent dans l'introduction à l'apprentissage automatique

Obtenir des données

Téléchargez les données à utiliser depuis le site de Kaggle

Téléchargez les données suivantes depuis Kaggle Site (Vous devez créer un compte avec Kaggle pour télécharger les données)

Quand je vérifie le contenu, ça ressemble à ça

>>> import pandas as pd
>>> gender_submission = pd.read_csv("./Data/gender_submission.csv")
>>> test = pd.read_csv("./Data/test.csv")
>>> train = pd.read_csv("./Data/train.csv")
>>> 
>>> gender_submission.head(5)
   PassengerId  Survived
0          892         0
1          893         1
2          894         0
3          895         0
4          896         1
>>> test.head(5)
   PassengerId  Pclass                                          Name     Sex   Age  SibSp  Parch   Ticket     Fare Cabin Embarked
0          892       3                              Kelly, Mr. James    male  34.5      0      0   330911   7.8292   NaN        Q
1          893       3              Wilkes, Mrs. James (Ellen Needs)  female  47.0      1      0   363272   7.0000   NaN        S
2          894       2                     Myles, Mr. Thomas Francis    male  62.0      0      0   240276   9.6875   NaN        Q
3          895       3                              Wirz, Mr. Albert    male  27.0      0      0   315154   8.6625   NaN        S
4          896       3  Hirvonen, Mrs. Alexander (Helga E Lindqvist)  female  22.0      1      1  3101298  12.2875   NaN        S
>>> train.head(5)
   PassengerId  Survived  Pclass                                               Name     Sex   Age  SibSp  Parch            Ticket     Fare Cabin Embarked
0            1         0       3                            Braund, Mr. Owen Harris    male  22.0      1      0         A/5 21171   7.2500   NaN        S
1            2         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1      0          PC 17599  71.2833   C85        C
2            3         1       3                             Heikkinen, Miss. Laina  female  26.0      0      0  STON/O2. 3101282   7.9250   NaN        S
3            4         1       1       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1      0            113803  53.1000  C123        S
4            5         0       3                           Allen, Mr. William Henry    male  35.0      0      0            373450   8.0500   NaN        S

gender_submission(PassengerId, Survived) test(PassengerId, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin, Embarked) train(PassengerId, Survived, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin)

Vérifiez le coefficient de corrélation entre chaque colonne

Chez les pandas, la méthode corr () est utilisée pour trouver le coefficient de corrélation entre chaque colonne de la trame de données. Au fait, la méthode corr () semble pouvoir spécifier trois méthodes de calcul en spécifiant la méthode argument. Je ne suis pas sûr cette fois, alors utilisez la valeur par défaut

>>> train_corr = train.corr()
>>> train_corr
             PassengerId  Survived    Pclass       Age     SibSp     Parch      Fare
PassengerId     1.000000 -0.005007 -0.035144  0.036847 -0.057527 -0.001652  0.012658
Survived       -0.005007  1.000000 -0.338481 -0.077221 -0.035322  0.081629  0.257307
Pclass         -0.035144 -0.338481  1.000000 -0.369226  0.083081  0.018443 -0.549500
Age             0.036847 -0.077221 -0.369226  1.000000 -0.308247 -0.189119  0.096067
SibSp          -0.057527 -0.035322  0.083081 -0.308247  1.000000  0.414838  0.159651
Parch          -0.001652  0.081629  0.018443 -0.189119  0.414838  1.000000  0.216225
Fare            0.012658  0.257307 -0.549500  0.096067  0.159651  0.216225  1.000000

Essayez de faire une carte de chaleur

Il semble que vous puissiez facilement la visualiser sous forme de carte thermique à l'aide d'une bibliothèque appelée seaborn essayons!

>>> import seaborn
>>> import matplotlib as mpl
>>> import matplotlib.pyplot as plt
>>> 
>>> seaborn.heatmap(train_corr,vmax=1, vmin=-1, center=0)
<AxesSubplot:>
>>> plt.show()

Figure_1.png

Je vois, c'est plus facile à voir Il y a peut-être une forte corrélation entre Pclass et Fare dans ce ...? Pclass et Fare sont faibles avec Survived prédit cette fois, mais il semble y avoir une corrélation ...?

Prétraitement des données

Complétion NA (valeur manquante), correction des chaînes de caractères telles que Sexe, Embarqué, Cabine aux valeurs numériques Cette fois, NA complète la valeur moyenne, mais Embarked complète le plus "S" La cabine est corrigée à l'acronyme uniquement (elle représente probablement le rang de la chambre d'amis), NA complète C qui est

>>> train.Embarked.value_counts()
S    644
C    168
Q     77
Name: Embarked, dtype: int64

↓ Fonction de correction utilisée

def CorrectTitanicData(df):
    #Age : NA ->Valeur moyenne
    df.Age = df.Age.fillna(df.Age.median())
    #Sex : male -> 0, female -> 1
    df.Sex = df.Sex.replace(['male', 'female'],[0,1])
    #Embarked : NA -> S, C -> 0, S -> 1, Q -> 2
    df.Embarked = df.Embarked.fillna("S")
    df.Embarked = df.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])
    #Fare : NA ->Valeur moyenne
    df.Fare = df.Fare.fillna(df.Fare.median())
    #Cabin : NA -> C, A~G -> 0~6, T -> 7
    df.Cabin = df.Cabin.fillna('C')
    df.Cabin = df.Cabin.replace('A(.*)','A',regex=True)
    df.Cabin = df.Cabin.replace('B(.*)','B',regex=True)
    df.Cabin = df.Cabin.replace('C(.*)','C',regex=True)
    df.Cabin = df.Cabin.replace('D(.*)','D',regex=True)
    df.Cabin = df.Cabin.replace('E(.*)','E',regex=True)
    df.Cabin = df.Cabin.replace('F(.*)','F',regex=True)
    df.Cabin = df.Cabin.replace('G(.*)','G',regex=True)
    df.Cabin = df.Cabin.replace(['A','B','C','D','E','F','G','T'], [0,1,2,3,4,5,6,7])
    
    return df

Vérifiez à nouveau la corrélation entre chaque colonne après le prétraitement

>>> train = CorrectTitanicData(train)
>>> train_corr = train.corr()
>>> train_corr
             PassengerId  Survived    Pclass       Sex       Age     SibSp     Parch      Fare     Cabin  Embarked
PassengerId     1.000000 -0.005007 -0.035144 -0.042939  0.034212 -0.057527 -0.001652  0.012658 -0.035748 -0.017443
Survived       -0.005007  1.000000 -0.338481  0.543351 -0.064910 -0.035322  0.081629  0.257307  0.080643 -0.125953
Pclass         -0.035144 -0.338481  1.000000 -0.131900 -0.339898  0.083081  0.018443 -0.549500  0.009851  0.305762
Sex            -0.042939  0.543351 -0.131900  1.000000 -0.081163  0.114631  0.245489  0.182333  0.070780 -0.022521
Age             0.034212 -0.064910 -0.339898 -0.081163  1.000000 -0.233296 -0.172482  0.096688 -0.032105 -0.040166
SibSp          -0.057527 -0.035322  0.083081  0.114631 -0.233296  1.000000  0.414838  0.159651  0.000224  0.030874
Parch          -0.001652  0.081629  0.018443  0.245489 -0.172482  0.414838  1.000000  0.216225  0.018232 -0.035957
Fare            0.012658  0.257307 -0.549500  0.182333  0.096688  0.159651  0.216225  1.000000 -0.098064 -0.268865
Cabin          -0.035748  0.080643  0.009851  0.070780 -0.032105  0.000224  0.018232 -0.098064  1.000000  0.069852
Embarked       -0.017443 -0.125953  0.305762 -0.022521 -0.040166  0.030874 -0.035957 -0.268865  0.069852  1.000000
>>> 
>>> seaborn.heatmap(train_corr,vmax=1, vmin=-1, center=0)
<AxesSubplot:>
>>> plt.show()

Figure_2.png Il est devenu clair que le sexe a une corrélation plus forte

Sélection de méthode

Huit éléments (autres que le Passenger ID) utilisés comme prédicteurs cette fois sont «Classe P», «Sexe», «Âge», «SibSp», «Parch», «Fare», «Cabine» et «Embarqué». La vérification croisée est effectuée en mettant en œuvre les sept méthodes suivantes comme méthodes d'apprentissage.

>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.svm import SVC, LinearSVC
>>> from sklearn.neighbors import KNeighborsClassifier
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.neural_network import MLPClassifier
>>> from sklearn.model_selection import cross_val_score
>>> 
>>> predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Cabin", "Embarked"]
>>> models = []
>>> models.append(("LogisticRegression",LogisticRegression()))
>>> models.append(("SVC",SVC()))
>>> models.append(("LinearSVC",LinearSVC()))
>>> models.append(("KNeighbors",KNeighborsClassifier()))
>>> models.append(("DecisionTree",DecisionTreeClassifier()))
>>> models.append(("RandomForest",RandomForestClassifier()))
>>> models.append(("MLPClassifier",MLPClassifier(solver='lbfgs', random_state=0)))
>>> 
>>> results = []
>>> names = []
>>> 
>>> for name,model in models:
...     result = cross_val_score(model, train[predictors], train["Survived"],  cv=3)
...     names.append(name)
...     results.append(result)
... 

>>> for i in range(len(names)):
...     print(names[i],results[i].mean())
... 
LogisticRegression 0.7811447811447811
SVC 0.6554433221099888
LinearSVC 0.7317620650953985
KNeighbors 0.7070707070707071
DecisionTree 0.7721661054994389
RandomForest 0.7957351290684623
MLPClassifier 0.7901234567901234

Random Forest semble être la meilleure note

Enregistrer les résultats de prédiction dans un fichier CSV pour soumission

Apprenez les données d'entraînement dans une forêt aléatoire et faites des prédictions avec des données de test. Enregistrez le résultat au format CSV

>>> test = pd.read_csv("./Data/test.csv")
>>> test = CorrectTitanicData(test)
>>> algorithm = RandomForestClassifier()
>>> algorithm.fit(train[predictors], train["Survived"])
RandomForestClassifier()
>>> predictions = algorithm.predict(test[predictors])
>>> submission = pd.DataFrame({
...     "PassengerId":test["PassengerId"],
...     "Survived":predictions
... })
>>> submission.to_csv("submission.csv", index=False)

Résultat de la soumission

Je l'ai soumis avec Kaggle parce que c'était un gros problème Le score de résultat est 0.74162

スクリーンショット 2020-11-07 19.28.55.png

Je voudrais augmenter le taux de réponse correcte par essais et erreurs à partir d'ici, mais cette fois, c'est à ici Il semble que scikit-learn ait GridSearchCV qui recherche des hyper paramètres, donc Si vous l'utilisez, le pourcentage de réponses correctes est susceptible d'augmenter ...

Recommended Posts

[Python] [Apprentissage automatique] Les débutants sans aucune connaissance essaient l'apprentissage automatique pour le moment
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
[Apprentissage de renforcement d'introduction] Renforcement de l'apprentissage pour bouger pour le moment
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Utilisez Logger avec Python pour le moment
Essayez d'utiliser LINE Notify pour le moment
Exécutez avec CentOS7 + Apache2.4 + Python3.6 pour le moment
Flux d'apprentissage pour les débutants en Python
Pour le moment, essayez d'utiliser l'API de dialogue de discussion docomo
Résumé de l'apprentissage automatique par les débutants de Python
Voir python pour la première fois
[Apprentissage automatique Python] Recommandation d'utilisation de Spyder pour les débutants (à partir d'août 2020)
Comprendre la classe python Struggle (1) Déplaçons-la pour le moment
Touchons l'API Vision de Google de Python pour le moment
Amplifiez les images pour l'apprentissage automatique avec Python
Premiers pas pour les débutants en apprentissage automatique (IA)
Pourquoi Python est choisi pour l'apprentissage automatique
[Shakyo] Rencontre avec Python pour l'apprentissage automatique
MongoDB avec Python pour la première fois
Appelez le débogueur python à tout moment
[Python] Conception d'applications Web pour l'apprentissage automatique
Essayons Linux pour la première fois
Une introduction à Python pour l'apprentissage automatique
[Pour les débutants] Essayez le web scraping avec Python
[Exemple d'amélioration de Python] Quel est le site d'apprentissage recommandé pour les débutants en Python?
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer jusqu'à la fin du chapitre 2
Le moyen le plus rapide pour les débutants de maîtriser Python
L'histoire selon laquelle le coût d'apprentissage de Python est faible
Ordre d'étude recommandé pour les débutants en apprentissage automatique / apprentissage en profondeur
Pour le moment, importez-les dans jupyter
Faire un histogramme pour le moment (matplotlib)
Essayez d'ajouter un module externe au poivre. Pour le moment, en demandes.
Exécutez yolov4 "pour le moment" dans Windows
J'ai joué avec Floydhub pour le moment
J'ai essayé la programmation python pour la première fois.
[Python] Collectez des images avec Icrawler pour l'apprentissage automatique [1000 feuilles]
Essayez de calculer RPN avec Python (pour les débutants)
Retour sur le concours d'apprentissage automatique sur lequel j'ai travaillé pour la première fois
Alignez le nombre d'échantillons entre les classes de données pour l'apprentissage automatique avec Python
virtualenv Pour le moment, c'est tout!
GTUG Girls + PyLadiesTokyo Meetup Je suis allé au premier machine learning
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
Essayez de publier sur Qiita pour la première fois
J'essaierai de résumer les liens qui me semblent utiles pour le moment
Prédire le temps objectif d'un marathon complet avec l'apprentissage automatique-③: j'ai essayé de visualiser les données avec Python-
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
Jusqu'à ce que vous puissiez installer Blender et l'exécuter avec python pour le moment
Script Python de collection d'images pour créer des ensembles de données pour l'apprentissage automatique
Créez un environnement interactif pour l'apprentissage automatique avec Python
J'ai essayé Python sur Mac pour la première fois.
Mémo de flux pour déplacer LOCUST pour le moment
[Python] Mesure et affiche le temps nécessaire au traitement
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer du chapitre 2
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer chapitres 1 et 2
J'ai essayé python pour la première fois avec heroku
Préparation au démarrage de «Python Machine Learning Programming» (pour macOS)