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)
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
Un rapide coup d'œil révèle que l'apprentissage automatique suit à peu près le flux ci-dessous.
Pour le moment, j'essaierai la prédiction de survie Titanic de Kaggle que je vois souvent dans l'introduction à l'apprentissage automatique
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)
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
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()
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 ...?
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()
Il est devenu clair que le sexe a une corrélation plus forte
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
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)
Je l'ai soumis avec Kaggle parce que c'était un gros problème Le score de résultat est 0.74162
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