[PYTHON] [Kaggle für Super-Anfänger] Titanic (Logistic Return)

■ Einführung

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.

1. Vorbereitung des Moduls


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

## 2. Datenaufbereitung

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

print(train.shape)
print(test.shape)

# (891, 12)
# (418, 11)

train.head()

image.png 【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()

image.png 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)

image.png

3-1. Vorbehandlung (ganz)

Ü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()

image.png 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()

image.png 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)

3-2 Vorverarbeitung (numerische Spalte)

Überprüfen Sie den Inhalt der Daten.


X_num.head()

image.png 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
'''

3-3. Vorverarbeitung (Zeichenkettenspalte)

Überprüfen Sie den Inhalt der Daten.

X_cat.head()

image.png 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)

image.png

3-4. Vorbehandlung (ganz)

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)

image.png 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,)

# 4. Erstellen Sie ein Modell Da der Merkmalsbetrag und die Zielvariable entsprechend den Zugdaten verfügbar sind Darüber hinaus erstellen wir ein Modell, indem wir es in Trainingsdaten und Testdaten unterteilen.

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]

## 5. Leistungsbewertung Auswertung mit ROC-Kurve und AUC.

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

image.png 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

'''

image.png
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()

image.png Konvertieren Sie es dann in CSV-Daten.


df_submit.to_csv('titanic_submit.csv')

Dies ist das Ende der Einreichung. image.png

■ Endlich

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

[Kaggle für Super-Anfänger] Titanic (Logistic Return)
[Für Kaggle-Anfänger] Titanic (LightGBM)
Logistic Return (für Anfänger) -Code Edition-
Herausforderungen des Titanic-Wettbewerbs für Kaggle-Anfänger
[Für Anfänger] Kaggle-Übung (Merucari)
Es ist okay, über die Titanic zu stolpern! Einführung in die Kaggle-Strategie für Super-Anfänger
Python #Funktion 2 für Super-Anfänger
Python #Funktion 1 für Super-Anfänger
Python #Liste für Super-Anfänger
Python für Super-Anfänger Super-Anfänger Python # Wörterbuch Typ 1
Python #index für Super-Anfänger, Slices
Python #len Funktion für Super-Anfänger
Python #Hello World für Super-Anfänger
Lineare Regression (für Anfänger) -Code Edition-
Python für Super-Anfänger Super-Anfänger Python # Wörterbuch Typ 2
Ridge Return (für Anfänger) -Code Edition-
Logistische Rückgabe
Logistische Rückgabe
Lassen Sie uns Python für Super-Anfänger zusammenstellen
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
Python für Super-Anfänger Super-Anfänger Python # Einfach loszuwerden
Fordern Sie die Kaggle Titanic heraus
Einfaches Verständnis von Python für & Arrays (für Super-Anfänger)
Über den Import von externen Python-Modulen <Für Super-Anfänger>
So konvertieren Sie den Python # -Typ für Super-Anfänger von Python: str
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
Spacemacs-Einstellungen (für Anfänger)
Logistische Regression beim maschinellen Lernen
Python Lehrbuch für Anfänger
Dikstra-Algorithmus für Anfänger
OpenCV für Python-Anfänger
■ Kaggle-Übung für Anfänger - Einführung von Python - von Google Colaboratory
So konvertieren Sie den Python # -Typ für Python-Superanfänger: int, float