Ich habe an einem Wettbewerb für Kaggle-Anfänger gearbeitet Ich habe versucht, es kurz zusammenzufassen.
【Überblick】 ・ Titanic: Maschinelles Lernen aus Katastrophen ・ Unterscheiden Sie anhand der Passagierinformationen des sinkenden Schiffes "Titanic" zwischen denen, die gerettet wurden, und denen, die es nicht sind.
Dieses Mal erstellen wir ein Modell mit logistischer Regression.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.metrics import accuracy_score, f1_score
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.feature_selection import RFE
%matplotlib inline
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
print(train.shape)
print(test.shape)
# (891, 12)
# (418, 11)
train.head()
【Datenelement】 ・ PassengerId: Passagier-ID ・ Überlebt: Ob Sie überlebt haben oder nicht (0: nicht gespeichert, 1: gespeichert) ・ Klasse - Ticketklasse (1: Oberklasse, 2: Mittelklasse, 3: Unterklasse) ・ Name: Name des Passagiers ・ Geschlecht: Geschlecht ・ Alter: Alter ・ SibSp: Anzahl der Brüder und Ehepartner an Bord ・ Parch: Anzahl der Eltern / Kinder an Bord ・ Ticket: Ticketnummer ・ Tarif: Gebühr ・ Kabine: Zimmernummer ・ Eingeschifft: Hafen an Bord (C: Cherbourg, Q: Queenstown, S: Southampton)
test.head()
Speichern Sie die Passagiernummer (PassengerId) der Testdaten.
PassengerId = test['PassengerId']
Tatsächlich wird das Modell nur mit Zugdaten erstellt Für die Eingabe von Testdaten in das Modell ist dieselbe Merkmalsmenge erforderlich.
Wenn One-Hot-Encoding usw. für die Vorverarbeitung verwendet wird Weil die Anzahl der Merkmale von Zug- und Testdaten unterschiedlich ist Beide Daten werden zusammen kombiniert und vorverarbeitet.
Erstens haben Zugdaten ein weiteres Element (Zielvariable: Überlebt), also trennen Sie es.
y = train['Survived']
train = train[[col for col in train.columns if col != 'Survived']]
print(train.shape)
print(test.shape)
# (891, 11)
# (418, 11)
Nachdem die Anzahl der Elemente (Merkmale) in den Zugdaten und Testdaten gleich ist, kombinieren Sie sie.
X = pd.concat([train, test], axis=0)
print(X.shape)
X.head()
# (1309, 11)
Überprüfen Sie zunächst, wie viele Werte fehlen.
X.isnull().sum()
'''
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 263
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 1014
Embarked 2
dtype: int64
'''
Weil es nicht möglich ist, ein Modell mit den Zeichenfolgendaten so wie sie sind zu erstellen Wir werden es nach Bedarf in numerische Werte umwandeln.
Konvertieren Sie für das Geschlecht in "männlich: 0, weiblich: 1".
def code_transform(x):
if x == 'male':
y = 0
else:
y = 1
return y
X['Sex'] = X['Sex'].apply(lambda x: code_transform(x))
X.head()
Konvertiert den Hafen, an dem das Schiff an Bord ist, in "0: C, 1: Q, 2: S".
def code_transform(x):
if x == 'C':
y = 0
elif x == 'Q':
y = 1
else:
y = 2
return y
X['Embarked'] = X['Embarked'].apply(lambda x: code_transform(x))
X.head()
Schauen wir uns nun Spalten an, die nur Zahlen und Spalten enthalten, die nur Buchstaben enthalten.
numerical_col = [col for col in X.columns if X[col].dtype != 'object']
categorical_col = [col for col in X.columns if X[col].dtype == 'object']
print(numerical_col)
print(categorical_col)
# ['PassengerId', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
# ['Name', 'Ticket', 'Cabin']
Ich möchte eine separate Vorverarbeitung für die numerische Spalte und die Zeichenfolgenspalte durchführen, daher werde ich sie trennen.
X_num = X[numerical_col]
X_cat = X[categorical_col]
print(X_num.shape)
print(X_cat.shape)
# (1309, 8)
# (1309, 3)
Überprüfen Sie den Inhalt der Daten.
X_num.head()
Füllen Sie die fehlenden Werte mit dem Medianwert jeder Spalte aus.
X_num.fillna(X_num.median(), inplace=True)
Überprüfen Sie den Status fehlender Werte.
X_num.isnull().sum()
'''
PassengerId 0
Pclass 0
Sex 0
Age 0
SibSp 0
Parch 0
Fare 0
Embarked 0
dtype: int64
'''
Überprüfen Sie den Inhalt der Daten.
X_cat.head()
Fehlende Werte enthalten durchweg das Wort "Auslassen".
X_cat.fillna(value='missing', inplace=True)
Überprüfen Sie den Status fehlender Werte.
X_cat.isnull().sum()
'''
Name 0
Ticket 0
Cabin 0
dtype: int64
'''
Führen Sie eine One-Hot-Codierung durch, um alle Zeichenfolgen in Zahlen umzuwandeln.
X_cat = pd.get_dummies(X_cat)
print(X_cat.shape)
X_cat.head()
# (1309, 2422)
Da sowohl X_num als auch X_cat keine fehlenden Werte haben und nur numerische Daten sind. Kombinieren Sie und kehren Sie zu den gesamten Daten zurück.
X_total = pd.concat([X_num, X_cat], axis=1)
print(X_total.shape)
X_total.head()
# (1309, 2431)
Ich möchte ein Modell erstellen, das nur Zugdaten verwendet Da X_total auch Testdaten enthält, wird nur der erforderliche Teil extrahiert.
train_rows = train.shape[0]
X = X_total[:train_rows]
std = StandardScaler()
X = std.fit_transform(X)
print(X.shape)
print(y.shape)
# (891, 2431)
# (891,)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
# (623, 2431)
# (623,)
# (268, 2431)
# (268,)
logreg = LogisticRegression(class_weight='balanced')
logreg.fit(X_train, y_train)
'''
LogisticRegression(C=1.0, class_weight='balanced', dual=False,
fit_intercept=True, intercept_scaling=1, l1_ratio=None,
max_iter=100, multi_class='auto', n_jobs=None, penalty='l2',
random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)
'''
Als nächstes finden Sie den vorhergesagten Wert.
Durch Angabe von [:, 1] für y_proba wird die Wahrscheinlichkeit vorhergesagt, Klasse 1 (Survived = 1) zu werden. Wenn y_pred größer als 0,5 ist, wird ihm 1 zugewiesen, und wenn es kleiner als 0,5 ist, wird ihm 0 zugewiesen.
y_proba = logreg.predict_proba(X_test)[: , 1]
print(y_proba[:5])
y_pred = logreg.predict(X_test)
print(y_pred[:5])
# [0.90784721 0.09948558 0.36329043 0.18493678 0.43881127]
# [1 0 0 0 0]
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
auc_score = roc_auc_score(y_test, y_proba)
plt.plot(fpr, tpr, label='AUC = %.3f' % (auc_score))
plt.legend()
plt.title('ROC curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.grid(True)
print('accuracy:',accuracy_score(y_test, y_pred))
print('f1_score:',f1_score(y_test, y_pred))
# accuracy: 0.7723880597014925
# f1_score: 0.6013071895424837
Lassen Sie uns auch anhand einer Verwirrungsmatrix bewerten.
classes = [1, 0]
cm = confusion_matrix(y_test, y_pred, labels=classes)
cmdf = pd.DataFrame(cm, index=classes, columns=classes)
sns.heatmap(cmdf, annot=True)
print(classification_report(y_test, y_pred))
'''
precision recall f1-score support
0 0.76 0.95 0.84 170
1 0.84 0.47 0.60 98
accuracy 0.77 268
macro avg 0.80 0.71 0.72 268
weighted avg 0.79 0.77 0.75 268
'''
6. Submit
Da konnte ich anhand von Zugdaten ein Modell erstellen und auswerten
Geben Sie die Informationen der Testdaten und den vorhergesagten Wert an.
Extrahieren Sie zunächst den den Testdaten entsprechenden Teil aus den Gesamtdaten (X_total).
X_submit = X_total[train_rows:]
X_submit = std.fit_transform(X_submit)
print(X_train.shape)
print(X_submit.shape)
# (623, 2431)
# (418, 2431)
Im Vergleich zu X_train, mit dem das Modell erstellt wurde, verfügt es über die gleiche Anzahl von Funktionen (2431). Senden Sie X_submit in das Modell, um den vorhergesagten Wert zu erhalten.
y_proba_submit = logreg.predict_proba(X_submit)[: , 1]
print(y_proba_submit[:5])
y_pred_submit = logreg.predict(X_submit)
print(y_pred_submit[:5])
# [0.02342065 0.18232356 0.06760457 0.06219097 0.76277487]
# [0 0 0 0 1]
Bereiten Sie die CSV-Daten für die Übermittlung an Kaggle vor.
Erstellen Sie zunächst einen Datenrahmen mit den erforderlichen Informationen.
df_submit = pd.DataFrame(y_pred_submit, index=PassengerId, columns=['Survived'])
df_submit.head()
Konvertieren Sie es dann in CSV-Daten.
df_submit.to_csv('titanic_submit.csv')
Dies ist das Ende der Einreichung.
Dieses Mal haben wir einen Artikel für Kaggle-Anfänger zusammengestellt. Ich hoffe es hat dir sogar ein bisschen geholfen.
Danke fürs Lesen.
Recommended Posts