Dies ist die Geschichte der erstmaligen Teilnahme am Kaggle </ b> -Wettbewerb. Im vorherigen "Überprüfen der Korrelation mit Kaggles Titanic" (https://qiita.com/sudominoru/items/840e87cc77de29f10ca2) haben wir die Korrelation überprüft und Pclass (Ticketklasse), Geschlecht (Geschlecht), Tarif untersucht. Ich entschied mich für drei Eingabedaten von (Tarif). Dieses Mal möchte ich einige Modelle ausprobieren.
Geschichte
Aus dem Ergebnis stieg die Punktzahl ein wenig auf "0,77511". Das Ergebnis sind die besten 58% (Stand 29. Dezember 2019). Ich möchte den Fluss bis zur erneuten Einreichung sehen.
Das letzte Mal habe ich "Linear SVC" gemäß scikit-learn algorithm sheet verwendet. Ich habe zuerst maschinelles Lernen gelernt [dieses Buch](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) greift das folgende Modell von Scikit-Learn zum Klassifizierungsproblem auf. Ich bin. ・ Sklearn.svm.LinearSVC ・ Sklearn.svm.SVC ・ Sklearn.ensemble.RandomForestClassifier ・ Sklearn.linear_model.LogisticRegression ・ Sklearn.linear_model.SGDClassifier
Dieses Mal möchte ich das obige Modell ausprobieren.
Das Verfahren zur Bewertung des Modells ist wie folgt.
In Kaggles Titanic gibt es Trainingsdaten [train.csv](Daten, die das Ergebnis anzeigen) und Testdaten [test.csv](Daten, die das Ergebnis nicht kennen). Wenn Sie test.csv für 2 "Vorhersagen" und 3 "Bestätigen" verwenden, ist dies ineffizient, da Sie das Ergebnis jedes Mal festschreiben und senden müssen. Trainingsdaten [train.csv] mit bekannten Ergebnissen können effizient ausgewertet werden, indem sie in Trainingsdaten und Testdaten unterteilt werden. scikit-learn bietet eine Funktion "train_test_split", die Trainingsdaten und Testdaten unterteilt.
from sklearn.model_selection import train_test_split
######################################
#Trainingsdaten und Testdaten trennen
# Split training data and test data
######################################
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1, shuffle=True)
Das Bild ist wie folgt. Wenn test_size = 0,3 ist, werden die Trainingsdaten und die Testdaten durch "7: 3" geteilt.
〇Daten vor der Teilung
y | x | |||
Survived | Pclass | Sex | Fare | |
1 | 0 | 3 | male | 7.25 |
2 | 1 | 1 | female | 71.2833 |
3 | 1 | 3 | female | 7.925 |
4 | 1 | 1 | female | 53.1 |
5 | 0 | 3 | male | 8.05 |
6 | 0 | 3 | male | 8.4583 |
7 | 0 | 1 | male | 51.8625 |
8 | 0 | 3 | male | 21.075 |
9 | 1 | 3 | female | 11.1333 |
10 | 1 | 2 | female | 30.0708 |
〇 Trainingsdaten nach der Teilung
y_train | x_train | |||
Survived | Pclass | Sex | Fare | |
1 | 0 | 3 | male | 7.25 |
2 | 1 | 1 | female | 71.2833 |
4 | 1 | 1 | female | 53.1 |
5 | 0 | 3 | male | 8.05 |
6 | 0 | 3 | male | 8.4583 |
8 | 0 | 3 | male | 21.075 |
10 | 1 | 2 | female | 30.0708 |
〇 Testdaten nach der Teilung
y_test | x_test | |||
Survived | Pclass | Sex | Fare | |
3 | 1 | 3 | female | 7.925 |
7 | 0 | 1 | male | 51.8625 |
9 | 1 | 3 | female | 11.1333 |
Als nächstes kommt Lernen und Vorhersage.
Das Scikit-Lernmodell bietet eine Methode "fit" für das Lernen und eine Methode "Score" für die Bewertung von Vorhersagen. Sie sind "fit" und "Punktzahl".
from sklearn.svm import LinearSVC
model = LinearSVC(random_state=1)
######################################
#lernen
# training
######################################
model.fit(x_train, y_train)
######################################
#Bewerten Sie die vorhergesagten Ergebnisse
# Evaluate predicted results
######################################
score = model.score(x_test, y_test)
"Fit" lernt. "Score" sagt das Ergebnis mit "x_test" voraus, stimmt das Ergebnis mit "y_test" überein und gibt die richtige Antwortrate zurück. Im obigen Fall wäre die Punktzahl "0,753731343283582". Das Ergebnis ist eine zu 75% korrekte Antwortrate.
Sie können die Leistung eines Modells bewerten, indem Sie verschiedene Modelle ausprobieren und deren Ergebnisse vergleichen. Probieren Sie das Modell unter "2. Über das zu verwendende Modell" aus.
Der Gesamtcode ist unten.
Vorbereitung
import numpy
import pandas
# train.Laden Sie csv
# Load train.csv
df = pandas.read_csv('/kaggle/input/titanic/train.csv')
##############################
#Datenvorverarbeitung
#Extrahieren Sie die erforderlichen Elemente
# Data preprocessing
# Extract necessary items
##############################
# 'Survived', 'Pclass', 'Sex', 'Fare'Extrahieren
# Extract 'Survived', 'Pclass', 'Age', 'Fare'
df = df[['Survived', 'Pclass', 'Sex', 'Fare']]
##############################
#Datenvorverarbeitung
#Quantifizieren Sie das Etikett (Name)
# Data preprocessing
# Digitize labels
##############################
from sklearn.preprocessing import LabelEncoder
#Quantifizieren Sie das Geschlecht mit dem Label Encoder
# Digitize gender using LabelEncoder
encoder_sex = LabelEncoder()
df['Sex'] = encoder_sex.fit_transform(df['Sex'].values)
##############################
#Datenvorverarbeitung
#Zahlen standardisieren
# Data preprocessing
# Standardize numbers
##############################
from sklearn.preprocessing import StandardScaler
#Standardisierung
# Standardize numbers
standard = StandardScaler()
df_std = pandas.DataFrame(standard.fit_transform(df[['Pclass', 'Fare']]), columns=['Pclass', 'Fare'])
#Tarif standardisieren
# Standardize Fare
df['Pclass'] = df_std['Pclass']
df['Fare'] = df_std['Fare']
from sklearn.model_selection import train_test_split
x = df.drop(columns='Survived')
y = df[['Survived']]
Trainingsdaten, Testdatenerstellung
#######################################
#Trainingsdaten und Testdaten trennen
# Split training data and test data
#######################################
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1, shuffle=True)
y_train = numpy.ravel(y_train)
y_test = numpy.ravel(y_test)
Modellbewertung
#######################################
#Bewerten Sie das Modell
# Evaluate the model
#######################################
from sklearn.svm import LinearSVC
model = LinearSVC(random_state=1)
model.fit(x_train, y_train)
score = model.score(x_test, y_test)
score
Durch Ersetzen des Modelldefinitionsteils der "Modellbewertung" können Sie mit verschiedenen Modellen bewerten. Probieren Sie das unter "2. Über das zu verwendende Modell" beschriebene Modell aus. Das Ergebnis ist wie folgt.
Modell- | score |
---|---|
sklearn.svm.LinearSVC | 0.753 |
sklearn.svm.SVC | 0.783 |
sklearn.ensemble.RandomForestClassifier | 0.805 |
sklearn.linear_model.LogisticRegression | 0.753 |
sklearn.linear_model.SGDClassifier | 0.753 |
Das Ergebnis ist, dass der zufällige Wald der beste ist. Als nächstes passen wir die Parameter des zufälligen Gesamtstrukturmodells an.
Verwenden Sie die Rastersuche (GridSearchCV) in scikit-learn, um die Parameter anzupassen. Die Rastersuche wertet die angegebenen Parameter in allen Mustern aus und findet die optimale Kombination von Parametern. Da jedoch alle Muster ausgewertet werden, dauert der Vorgang umso länger, je mehr Parameter Sie haben. Überprüfen Sie die Random Forest-Dokumentation (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html) und passen Sie die folgenden Parameter an:
Parameter | Muster |
---|---|
criterion | gini / entropy |
n_estimators | 25 / 100 / 500 / 1000 / 2000 |
min_samples_split | 0.5 / 2 / 4 / 10 |
min_samples_leaf | 1 / 2 / 4 / 10 |
bootstrap | Ture / False |
Sie können eine Rastersuche durchführen, indem Sie "Modellbewertung" durch die folgende "Rastersuche" ersetzen.
Rastersuche
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
###############################################
#Probieren Sie LogisticRegression-Parameter mit der Rastersuche aus
# Tuning LogisticRegression parameters with grid search
###############################################
pipe_svc = RandomForestClassifier(random_state=1)
param_grid = {'criterion':['gini','entropy'],
'n_estimators':[25, 100, 500, 1000, 2000],
'min_samples_split':[0.5, 2,4,10],
'min_samples_leaf':[1,2,4,10],
'bootstrap':[True, False]
}
grid = GridSearchCV(estimator=RandomForestClassifier(random_state=1), param_grid=param_grid)
grid = grid.fit(x_train, y_train)
print(grid.best_score_)
print(grid.best_params_)
Das Ergebnis ist wie folgt. In meiner Umgebung dauerte die Ausführung der Rastersuche ungefähr 10 Minuten.
Raster-Suchergebnisse
0.8105939004815409
{'bootstrap': False, 'criterion': 'entropy', 'min_samples_leaf': 10, 'min_samples_split': 2, 'n_estimators': 100}
Lassen Sie uns die Parameter angeben, die durch Rastersuche, Lernen und Vorhersagen eingestellt wurden. Schreiben Sie den Code "Trainingsdaten, Testdatenerstellung" und "Rastersuche" wie folgt um, um das Lernen und die Vorhersage durchzuführen.
Lernen, Vorfreude
##############################
#Ein Modell bauen
# Model building
##############################
from sklearn.ensemble import RandomForestClassifier
#Generieren Sie ein Modell
# Generate a model
model = RandomForestClassifier(n_estimators=100, \
criterion='entropy', \
min_samples_split=2, \
min_samples_leaf=10, \
bootstrap=False, \
random_state=1)
##############################
#Lernen
# Trainig
##############################
y = numpy.ravel(y)
model.fit(x, y)
# test.CSV konvertieren
# convert test.csv
##############################
# test.Laden Sie csv
# Load test.csv
df_test = pandas.read_csv('/kaggle/input/titanic/test.csv')
#Tarif Nan umrechnen
# Convert Fare Nan to 0
df_test = df_test.fillna({'Fare':0})
# 'PassengerId'Extrahieren(Mit dem Ergebnis kombinieren)
# Extract 'PassengerId'(To combine with the result)
df_test_index = df_test[['PassengerId']]
# 'Pclass', 'Sex', 'Fare'Extrahieren
# Extract 'Pclass', 'Sex', 'Fare'
df_test = df_test[['Pclass', 'Sex', 'Fare']]
#Standardisierung
# Standardize
df_test_std = pandas.DataFrame(standard.transform(df_test[['Pclass', 'Fare']]), columns=['Pclass', 'Fare'])
df_test['Pclass'] = df_test_std['Pclass']
df_test['Fare'] = df_test_std['Fare']
#Etikettencodierung
# Label Encoding
df_test ['Sex'] = encoder_sex.transform(df_test ['Sex'].values)
##############################
#Ergebnisse vorhersagen
# Predict results
##############################
x_test = df_test.values
y_test = model.predict(x_test)
#Kombinieren Sie das Ergebnis mit dem DataFrame der 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.Schreiben Sie csv in das aktuelle Verzeichnis
# Write result.csv to the current directory
df_output.to_csv('result.csv', index=False)
Beschreiben Sie die obigen Informationen in der Kaggle-Umgebung. Führen Sie "Alle ausführen" aus und überprüfen Sie, ob result.csv erstellt wurde.
Senden Sie mit "Commit" ⇒ "Open Version" ⇒ "Submit to Competition".
Die Punktzahl ist jetzt "0,77511".
Dieses Mal konnte ich die Punktzahl ein wenig erhöhen, indem ich 5 Modelltypen verglich und die Parameter abstimmte. Nächstes Mal möchte ein geeigneteres Modell aus verschiedenen Modellen von Scikit-Learn finden.
29.12.2019 Erstausgabe veröffentlicht 2020/01/01 Nächsten Link hinzufügen 2020/01/03 Kommentare zur Quelle korrigiert
Recommended Posts