Lassen Sie uns mit einem praktischen Ansatz in die aufregende Welt des maschinellen Lernens eintauchen. In diesem spannenden Blogbeitrag arbeiten wir an einer Kaggle-Herausforderung mit dem Titel „Titanic – Maschinelles Lernen aus einer Katastrophe“ und erkunden die wesentlichen Schritte, um Ihre Reise zum maschinellen Lernen anzukurbeln.
In dieser zweiteiligen Serie werden wir die folgenden Themen behandeln:
- Datenvorverarbeitung zur Kodierung und Verarbeitung fehlender Werte
- Funktionsauswahl mittels Heatmap
- Datenaufteilung zur Validierung und zum Testen
- Coaching mit Entscheidungsbäumen und Random-Forest-Algorithmen
- Hyperparameter-Tuning
Wenn Sie wie ich ein Software program-Ingenieur sind, der sich für ML und KI interessiert, werde ich am Ende dieses Artikels einige hilfreiche Ressourcen vorstellen, die mir den Einstieg in meine ML-Reise erleichtert haben.
Dieses Downside warfare das erste, das ich gelöst habe, nachdem ich einige Schlüsselkonzepte kennengelernt hatte, die auf jedes ML-Downside anwendbar sind und die wir in diesem Artikel praxisnah behandeln werden.
Indem Sie dieses Downside von Anfang bis Ende lösen, erhalten Sie einen Überblick über alle notwendigen Schritte zur Lösung eines ML-Issues und gewinnen Sicherheit für die Bewältigung zukünftiger Herausforderungen. Es ist eine großartige Möglichkeit, Ihr Gelerntes in die Praxis umzusetzen und eine solide Grundlage in ML aufzubauen.
Um den Code zu implementieren, habe ich mich auf die folgenden Python-Bibliotheken verlassen:
- Pandas: Zum Laden und Bearbeiten von Daten.
- scikit-lernen: Zur Anwendung von Algorithmen für maschinelles Lernen.
- matplotlib Und seegeboren: Zum Erstellen informativer Diagramme.
Der Titanic-Datensatz enthält wertvolle Informationen über die Passagiere, die auf der Titanic gesegelt sind, einschließlich Particulars wie Geschlecht, Alter, sozioökonomischen Standing und Überlebensergebnis.
Unsere Mission ist es, diese Daten zu analysieren und anhand ihrer Informationen vorherzusagen, ob ein Passagier überlebt hat oder nicht.
Eine detaillierte Beschreibung des Datensatzes finden Sie unter folgendem Hyperlink: Titanic – Maschinelles Lernen aus der Katastrophe.
Zunächst laden wir den Datensatz mithilfe der Pandas-Bibliothek aus CSV-Dateien und untersuchen die ersten fünf Zeilen.
import numpy as np
import pandas as pd
train_data = pd.read_csv('/kaggle/enter/titanic/prepare.csv')
test_data = pd.read_csv('/kaggle/enter/titanic/take a look at.csv')
train_data.head()
Warten! Was sehen wir? Einige Spalten, wie „
Cabin',
haben fehlende Werte dargestellt alsNaN
. Und es gibt auch kategorische (nicht numerische) Spalten wie „Intercourse’
Und ‚Embarked’
die unsere cleveren ML-Algorithmen nicht sofort verstehen.
Kein Downside! Wir werden unser Bestes bei der Datenvorverarbeitung geben. Wir werden diese fehlenden Werte mit behandeln Anrechnung Methoden und wandeln diese kategorialen Werte mithilfe von in numerische Darstellungen um Function-Kodierung Techniken.
Function-Kodierung
Um unsere kategorialen Daten in numerische Type umzuwandeln, stehen uns zwei Techniken zur Verfügung:
1. Eine Scorching-Kodierung: Das können wir nutzen Nominale Variablen deren Werte haben keine logische Reihenfolge. Zum Beispiel:
- Geschlecht: männlich und weiblich
- Kabine: wahr oder falsch
Diese Technik schafft neue binäre Spalten für jede eindeutige Kategorie in der ursprünglichen kategorialen Variablen.
Zum Beispiel die Intercourse
Spalte würde werden Sex_male
Und Sex_female
wobei der entsprechende Spaltenwert auf 1 und der andere Spaltenwert auf 0 gesetzt ist.
2. Ordinal- oder Label-Kodierung: Das können wir nutzen Ordinale Variablen wessen Daten folgen a logische Reihenfolge. Zum Beispiel,
- Größe: klein, mittel und groß
- Bewertung: schlecht, impartial und intestine
Diese Kodierungsmethode weist zu Ganzzahlwerte entsprechend ihrer Reihenfolge den Kategorien zuordnen. Zum Beispiel, Dimension
kann als klein=1, mittel=2, groß=3 kodiert werden.
Anrechnung
Fehlende Daten können Probleme in Algorithmen für maschinelles Lernen verursachen und zu verzerrten Ergebnissen führen.
Diese Lücken können wir mit verschiedenen Imputationsmethoden schließen:
- Mittelwert/Median-Imputation (für numerische Daten): Ersetzen Sie fehlende Werte durch den Mittelwert oder Medianwert der Variablen. Es wird davon ausgegangen, dass die fehlenden Werte ungefähr dem Durchschnitt oder der zentralen Tendenz der verfügbaren Daten entsprechen.
- Modusimputation (für kategoriale Daten): Ersetzen Sie das Fehlende kategorisch Werte mit dem Modus, der der am häufigsten vorkommende Wert in der Variablen ist.
- Regressionsimputation: Schätzen Sie fehlende Werte basierend auf einem Regressionsmodell, das auf den nicht fehlenden Werten trainiert wurde. Das Modell sagt die fehlenden Werte basierend auf den Beziehungen zwischen anderen Variablen voraus.
- kNN-Imputation: Ergänzen Sie fehlende Werte, indem Sie den Mittelwert der nächsten Nachbarn im Datensatz berechnen.
Implementierung in unserem Datensatz
Schauen wir uns nun genauer an, wie wir mit fehlenden Werten umgehen und eine Function-Kodierung in unserem Titanic-Datensatz durchführen können.
Wir untersuchen die Informationen jeder Spalte, z. B. Datentypen und die Anzahl der Nicht-Null-Einträge.
train_data.data()
test_data.data()
Durch die Überprüfung der Ausgabe können wir feststellen, dass der Datensatz sowohl nicht numerische Spalten (Title, Geschlecht, Ticket, Kabine, eingeschifft) als auch Spalten mit fehlenden Werten (Alter, Kabine, eingeschifft) enthält.
1. Kombinieren Sie Coaching und Check
Um die Konsistenz der Datenvorverarbeitungsschritte sowohl für die Trainings- als auch für die Testdaten sicherzustellen, können wir die Datensätze kombinieren und eine neue Spalte mit dem Namen hinzufügen supply
um zu identifizieren, ob jeder Datensatz zum „Zug“- oder „Check“-Satz gehört.
train_data['source'] = 'prepare'
test_data['source'] = 'take a look at'
total_data = pd.concat((train_data, test_data), axis=0)
total_data.reset_index(inplace=True, drop=True)
total_data.data()
2. Neue Funktion erstellen HasCabin
Aus dem Datensatz können wir ersehen, dass einige Passagiere Kabinencodes haben, während andere leere Einträge haben (NaN
).
Wir werden diese Spalte in eine umwandeln neue Funktion genannt HasCabin
. Wenn ein Passagier einen Kabinencode hat, wird dieser als gekennzeichnet true
. Andernfalls wird es als gekennzeichnet false
.
# Modify characteristic
total_data["HasCabin"] = pd.notna(total_data["Cabin"])# drop the unique column
total_data.drop(['Cabin'], axis=1, inplace=True)
total_data.head()
3. Neue Funktion erstellen IsAlone
Unser gesunder Menschenverstand sagt, dass die Überlebenschancen hoch sind, wenn der Passagier alleine reist. Erstellen wir additionally eine neue Spalte IsAlone
bezogen auf SibSp
Und Parch
Wie unten:
total_data['IsAlone'] = (total_data['SibSp'] + total_data['Parch'] == 0)
4. Unterstellen Embarked
Von den 891 Einträgen in unseren Daten haben wir 889 Einträge, die nicht null sind Embarked
Spalte, was bedeutet, dass uns 2 Werte fehlen.
Wir können diese fehlenden Werte mit dem häufigsten Wert ergänzen (Modusimputation) von Embarked
das im Datensatz erscheint.
# Lacking worth - fill majority worth for embarked
embarked_top = total_data["Embarked"].describe().high
total_data["Embarked"] = total_data["Embarked"].fillna(embarked_top)
4. Kodieren Intercourse
, Cabin
Und Embarked
Säulen
Da die Werte in diesen drei Spalten keiner logischen Reihenfolge folgen, können wir verwenden One-Scorching-Encoder um diese Werte in Zahlen umzuwandeln.
from sklearn.preprocessing import OneHotEncoderohe = OneHotEncoder(sparse=False)
sex_df = pd.DataFrame(ohe.fit_transform(total_data[['Sex']]), columns=ohe.get_feature_names_out())
has_cabin_df = pd.DataFrame(ohe.fit_transform(total_data[['HasCabin']]), columns=ohe.get_feature_names_out())
embarked_df = pd.DataFrame(ohe.fit_transform(total_data[['Embarked']]), columns=ohe.get_feature_names_out())
# since one scorching encoding creates new columns we will drop the unique columns
total_data.drop(['Sex', 'HasCabin', 'Embarked'], axis=1, inplace=True)
total_data= pd.concat((total_data, sex_df, has_cabin_df, embarked_df), axis=1)
5. Löschen Sie unnötige Spalten
Wir können unnötige Spalten wie löschen Title
Und Ticket
die für die Vorhersage nicht nützlich sind.
total_data.drop(['Name', 'Ticket'], axis=1, inplace=True)
6. Teilen Sie die Daten wieder auf
Bevor wir mit dem Auffüllen fehlender Werte für fortfahren Age
lasst uns das aufteilen total_data
in Zug und Prüfung. Warum? Nun, Sie werden es gleich herausfinden.
train_data_p = total_data[total_data["source"]=="prepare"]
test_data_p = total_data[total_data["source"]=="take a look at"]
train_data_p.drop(['source'], axis=1, inplace=True)
test_data_p.drop(['source'], axis=1, inplace=True)
7. Unterstellen Age
Da uns viele Werte fehlen für Age
Spalte können wir einen etwas komplexeren Algorithmus verwenden, z k-nächste Nachbarn Algorithmus zum Auffüllen der fehlenden Werte.
from sklearn.impute import KNNImputerimputer = KNNImputer(n_neighbors=8)
# study the parameters of kNN and apply the mannequin
# on train_data which incorporates goal variable (Survived)
train_data_p = pd.DataFrame(imputer.fit_transform(train_data_p), columns = train_data_p.columns)
# Apply the kNN mannequin on test_data to foretell the lacking Age values
test_data_p = pd.DataFrame(imputer.rework(test_data_p), columns = test_data_p.columns)
Was sind match
, rework
Und fit_transform
?
Wenn Sie die Dokumentation von OneHotEncoder oder kNNImputer von scikit-learn durchgehen, werden Sie feststellen, dass diese Instruments die oben genannten drei Methoden bereitstellen, die Sie verwenden können. Schauen wir uns jeden einzelnen genauer an:
match
lernt die Parameter aus den Daten. Zum Beispiel,
OneHotEncoder
Verwendet match, um das zu lernen Anzahl der Kategorien in einer SpaltekNNImputer
lernt das Ähnlichkeit zwischen Datenpunkten basierend auf ihren Merkmalswerten.
rework
wendet die gelernten Parameter auf die neuen Daten an. Zum Beispiel,
OneHotEncoder
wandelt kategoriale Variablen in numerische Werte umkNNImputer
füllt fehlende Werte basierend auf dem, was es gelernt hat, aus.
Wann sollten Sie es verwenden?
fit_transform
ist ein praktischer Combo-Zug, der kombiniert match
Und rework
in einen Schritt. Dies wird normalerweise verwendet, wenn die erste Transformation durchgeführt wird Trainingsdaten.
rework
allein wird verwendet, wenn wir die gelernten Parameter bereits von einem vorherigen haben fit_transform
oder match
Betrieb. Es übernimmt die zuvor erfassten Parameter und wendet sie auf neue Daten an, ohne alles neu zu lernen. Dies wird häufig bei der Transformation verwendet Check- oder Validierungsdaten nach der Anpassung der Transformation an die Trainingsdaten.
Notiz: Beim Ausfüllen der fehlenden Werte für
Age
wir wollen verstehen, wie verschiedene Spalten, einschließlich derSurvived
Spalte, beziehen sich auf Alter. Dann können wir diese Muster verwenden, um das Fehlende abzuschätzenAge
Werte in den Testdaten. Deshalb teilen wir die Daten vor diesem Schritt wieder auf, um sie zu trainieren und zu testen.
Erfolgreiche Datenvorverarbeitung
Durch Überprüfen der Ausgabe von train_data_p.data()
Und test_data_p.data()
Wir können sehen, dass alle Spalten numerisch sind und jede Spalte Nicht-Null-Einträge enthält.
Wenn es um die Vorhersage des Überlebensergebnisses geht, möchten wir die besten Merkmale auswählen, die für die Vorhersage related sind. Aber woher wissen wir, welche Funktionen die besten sind? Hier kommt die Heatmap ins Spiel!
A Wärmekarte ist eine farbcodierte Matrix, die die ‚
correlation coefficients'
zwischen allen Merkmalspaaren in unserem Datensatz. Der Korrelationskoeffizient stellt die Stärke und Richtung der linearen Beziehung zwischen zwei Variablen dar.
Wir können die besten Merkmale identifizieren, die einen starken Einfluss auf das Überlebensergebnis haben, indem wir diejenigen auswählen, die einen starken Einfluss haben starke constructive oder adverse Korrelation mit der Zielvariablen (dargestellt durch hellere oder dunklere Farbe).
Lassen Sie uns die Heatmap mithilfe unseres Trainingsdatensatzes zeichnen:
import matplotlib.pyplot as plt
import seaborn as snsplt.determine(figsize=(15,15))
sns.heatmap(train_data_p.corr(), cbar=True, cmap='vlag', vmin=-1, vmax=1, annot=True)
Aus der Heatmap können wir erkennen, dass die Spalten ‚
Pclass'
‚Fare'
‚IsAlone'
‚Intercourse'
‚Embarked'
Und ‚HasCabin' s
wie eine stärkere Korrelation mit unserer Zielvariablen ‚Survived'
. Achten Sie auf die 2. Zeile bzw. 2. Spalte, wo die absoluten Korrelationswerte größer als 0,1 sind
Basierend auf dieser Analyse werden wir diese sechs Funktionen als die wichtigsten für den Aufbau unseres maschinellen Lernmodells betrachten.
Notiz: Wenn es darum geht, die besten Funktionen auszuwählen und unsere Daten zu untersuchen, können wir auch andere Methoden verwenden, aber für unser Beispiel beginnen wir mit diesen Schritten.
Lustige Aktivität:
Bevor wir mit den nächsten Schritten fortfahren, probieren wir eine unterhaltsame Übung aus. Anhand der Heatmap haben wir beobachtet, dass die Intercourse
Spalte spielt eine wichtige Rolle bei der Vorhersage des Überlebensergebnisses.
girls = train_data[train_data.Sex=="female"]["Survived"]
males = train_data[train_data.Sex=="male"]["Survived"]
survivalRateForWomen = sum(girls)/len(girls)
survivalRateForMen = sum(males)/len(males)
print("survivalRateForWomen: ", survivalRateForWomen)
print("survivalRateForMen: ", survivalRateForMen)
Als Experiment nehmen wir additionally an, dass alle Weibchen überlebt haben (wahr) und alle Männchen nicht (falsch), und schauen wir uns an, was die Ergebnisse in Kaggle zeigen.
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': (test_data.Intercourse=='feminine').astype('int')})
output.to_csv('submission.csv', index=False)
Durch Ausführen dieses Codes generieren Sie eine Übermittlungsdatei mit dem Namen submission.csv
die Sie auf Kaggle hochladen und sehen können, welche Punktzahl Sie erhalten. In meinem Fall erhielt ich eine Punktzahl von 0,76555 für diesen Beitrag. Probieren Sie es aus und sehen Sie, wie intestine Sie das Überleben basierend auf dem Geschlecht vorhersagen können!
Entdecken Sie den zweiten Teil unserer Artikelserie, in dem wir uns mit der Implementierung des ML-Algorithmus für die Daten und dem Prozess der Optimierung von Hyperparametern befassen.