Als Tutorial zum Erlernen des maschinellen Lernens werde ich als Erinnerung die Methode aufzeichnen, mit der ich die Überlebenden der Titanic vorhergesagt habe. Dies ist ein Muss für alle.
Über die verwendete Version
Die verwendeten Daten wurden nach der Registrierung bei Kaggle von hier heruntergeladen. https://www.kaggle.com/c/titanic
import pandas as pd
import numpy as np
df = pd.read_csv('train.csv')
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
Definiert als Datenrahmen df. Schauen wir uns nun die ersten fünf Zeilen der gelesenen Daten an.
df.head()
Überlebt ist 1 für das Überleben und 0 für den Tod. Auf der offiziellen Website finden Sie Informationen zu anderen Faktoren.
Schauen wir uns als nächstes das Histogramm an.
df.hist(figsize=(12,12))
plt.show()
Sie können sehen, dass die meisten von ihnen in den 20ern und 30ern sind und die meisten von ihnen eine Klasse von 3 haben (die billigsten).
plt.figure(figsize = (15,15))
sns.heatmap(df.corr(),annot = True)
Indikatoren mit einem hohen Korrelationskoeffizienten für Survived sind 0,26: Fare und -0,34: Pclass. Wenn die Pclass-Note festgelegt wird, Tarif: Ich denke, dass der Tarif natürlich festgelegt wird, aber die beiden sind unterschiedliche Indikatoren. ..
df.isnull().sum()
PassengerId 0 Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
Alter: Alter und Kabine: Sie können sehen, dass es viele Beträge ohne Besatzungsnummer gibt. Informationen zum Umgang mit fehlenden Werten finden Sie im Folgenden. https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203
Dieses Mal habe ich beschlossen, das Alter durch den Medianwert zu ersetzen. Auch eingeschifft: Die Pension ersetzt die meisten S. Andere fehlende Werte wurden entfernt.
from sklearn.model_selection import train_test_split
#Verarbeitung fehlender Werte
df['Fare'] = df['Fare'].fillna(df['Fare'].median())
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Embarked'] = df['Embarked'].fillna('S')
#Konvertierung kategorialer Variablen
df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
df['Embarked'] = df['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)
#Löschen Sie nicht benötigte Spalten
df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis =1)
train_X = df.drop('Survived',axis = 1)
train_y = df.Survived
(train_X , test_X , train_y , test_y) = train_test_split(train_X, train_y , test_size = 0.3 , random_state = 0)
Diesmal betragen die Testdaten 30% (test_size = 0,3).
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(criterion='gini', random_state = 0)
clf = clf.fit(train_X , train_y)
pred = clf.predict(test_X)
#Berechnung der richtigen Antwortrate
from sklearn.metrics import (roc_curve , auc ,accuracy_score)
pred = clf.predict(test_X)
fpr, tpr, thresholds = roc_curve(test_y , pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)
Ich habe hier auf die Behandlung von Entscheidungsbaumparametern verwiesen. http://data-analysis-stats.jp/2019/01/14/%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A7%A3%E8%AA%AC/
criterion='gini', 0.7798507462686567 criterion='entropy', 0.7910447761194029
Die richtige Antwortrate war für die Entropie etwas höher. Laut der Referenz-URL
Aus Gründen der ordnungsgemäßen Verwendung wird gesagt, dass der Gini-Koeffizient bei kontinuierlichen Daten besser ist und die Entropie bei Kategoriedaten besser ist. Der Gini-Koeffizient minimiert die Fehlklassifizierung, während die Entropie explorativ nach einem Referenzwert sucht.
... anscheinend ... Dieses Mal gab es viele Kategoriedaten wie Geschlecht und Internat, sodass Entropie angebracht sein kann.
Dies ist auch hilfreich, da es detaillierte Informationen zum Entscheidungsbaum enthält. https://qiita.com/3000manJPY/items/ef7495960f472ec14377
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators = 10,max_depth=5,random_state = 0) #Erstellen Sie eine Instanz einer zufälligen Gesamtstruktur.
clf = clf.fit(train_X , train_y) #Trainieren Sie das Modell mit der Anpassungsmethode unter Verwendung von Lehrerbezeichnungen und Lehrerdaten
pred = clf.predict(test_X)
fpr, tpr , thresholds = roc_curve(test_y,pred,pos_label = 1)
auc(fpr,tpr)
accuracy_score(pred,test_y)
0.8283582089552238
Zufällige Wälder stehen zur Klassifizierung (Classifier) und zur Regressionsanalyse (Regressor) zur Verfügung. Dieses Mal werden wir es zur Klassifizierung verwenden, da der Zweck darin besteht, zu klassifizieren, ob es lebt oder tot ist.
Ich habe versucht, die Lernparameter und Argumente der RandomForestClassifier-Klasse zu verschieben, während ich mir das ansah. https://data-science.gr.jp/implementation/iml_sklearn_random_forest.html
Als ich n_estimators erhöhte, erhöhte sich die Genauigkeitsrate. Es wird gesagt, dass n_Stimatoren und Epochen, die in neuronalen Netzen verwendet werden, häufig in Schwierigkeiten geraten, selbst wenn sie mit großen Werten berechnet werden. Informationen zu Inhalt und Gegenmaßnahmen finden Sie weiter unten. https://amalog.hateblo.jp/entry/hyper-parameter-search
Aus den vorherigen Ergebnissen wurde festgestellt, dass die richtige Antwortrate in der zufälligen Gesamtstruktur höher ist als im Entscheidungsbaum. Aus diesem Grund haben wir uns dieses Mal für eine zufällige Gesamtstruktur entschieden.
fin = pd.read_csv('test.csv')
fin.head()
passsengerid = fin['PassengerId']
fin.isnull().sum()
fin['Fare'] = fin['Fare'].fillna(fin['Fare'].median())
fin['Age'] = fin['Age'].fillna(fin['Age'].median())
fin['Embarked'] = fin['Embarked'].fillna('S')
#Konvertierung kategorialer Variablen
fin['Sex'] = fin['Sex'].apply(lambda x: 1 if x == 'male' else 0)
fin['Embarked'] = fin['Embarked'].map( {'S': 0 , 'C':1 , 'Q':2}).astype(int)
#Löschen Sie nicht benötigte Spalten
fin= fin.drop(['Cabin','Name','Ticket','PassengerId'],axis =1)
#In einem zufälligen Wald vorhergesagt
predictions = clf.predict(fin)
submission = pd.DataFrame({'PassengerId':passsengerid, 'Survived':predictions})
submission.to_csv('submission.csv' , index = False)
Es war 4900./16000. Ich würde mich gerne mehr widmen.
Recommended Posts