Titanic-Überlebensvorhersage | Ihr erstes Data-Science-Projekt

Inhalt

Einführung

In diesem Artikel, Wir werden den beliebten Titanic-Datensatz durchgehen und versuchen vorherzusagen, ob eine Person das Wrack überlebt hat. Sie erhalten diesen Datensatz von Kaggle, verlinkt hier. Dieser Artikel wird sich darauf konzentrieren, wie man über diese Projekte nachdenkt, mehr als in der Umsetzung. Viele Anfänger sind verwirrt, wie sie anfangen sollen, wann fertig und alles andere, Ich hoffe, dieser Artikel dient Ihnen als Einsteigerhandbuch.. Ich schlage vor, Sie üben das Projekt in Kaggle.

Das Ziel: vorhersagen, ob ein Passagier überlebt hat oder nicht. 0 um nicht zu überleben, 1 Zum Überleben.

Beschreibung der Daten

In diesem Artikel, Wir werden eine grundlegende Datenanalyse durchführen, dann ein wenig Feature Engineering und, schließlich, Wir werden einige der beliebtesten Modelle für die Vorhersage verwenden. Lasst uns beginnen.

Datenanalyse

Paso 1: Importieren von Basisbibliotheken

numpy als np importieren
Pandas als pd importieren
import seaborn als sns
import matplotlib.pyplot als plt
%matplotlib inline

Paso 2: Daten lesen

training = pd.read_csv('/kaggle/input/titanic/train.csv')
test = pd.read_csv('/kaggle/input/titanic/test.csv')
Ausbildung['train_test'] = 1
Prüfung['train_test'] = 0
Prüfung['Survived'] = np.NaN
all_data = pd.concat([Ausbildung,Prüfung])
all_data.columns
18686tit1-9496194

Paso 3: Datenexploration

In diesem Abschnitt, Wir werden versuchen, Wissen aus den Daten zu extrahieren und uns damit vertraut zu machen, um effizientere Modelle zu erstellen.

training.info()
94258tit2-3196801
Ausbildung.beschreiben()
46684tit3-8398010
# Trennen Sie die Daten in numerische und kategoriale
df_num = Ausbildung[['Alter','SibSp','Parch','Fare']]
df_cat = Ausbildung[['Survived','Pclass','Sex','Ticket','Cabin','Embarked']]

Lassen Sie uns nun die numerischen Daten grafisch darstellen:

für i in df_num.columns:
    plt.hist(df_num[ich])
    plt.titel(ich)
    plt.zeigen()
16822tit4-7767330

Dann, Wie du siehst, die meisten Verteilungen sind verstreut, außer Alter, ist ziemlich normal. Wir könnten später in Erwägung ziehen, sie zu normalisieren. Dann, Wir zeichnen eine Heatmap Korrelation zwischen numerischen Spalten:

sns.heatmap(df_num.corr())
72575tit5-9042536

Hier sehen wir, dass Parch und SibSp eine höhere Korrelation aufweisen, was im Allgemeinen sinnvoll ist, da Eltern eher mit ihren mehreren Kindern reisen und Ehepartner dazu neigen, zusammen zu reisen. Dann, Vergleichen wir die Überlebensraten zwischen numerischen Variablen. Dies könnte einige interessante Ideen enthüllen:

pd.pivot_table(Ausbildung, index = 'Survived', Werte = ['Alter','SibSp','Parch','Fare'])
87496tit6-2688742

Die Schlussfolgerung, die wir aus dieser Tabelle ziehen können, ist:

  1. Das Durchschnittsalter der Überlebenden beträgt 28 Jahre, junge Leute überleben also länger.
  2. Menschen, die höhere Raten zahlten, überlebten eher, mehr als doppelt. Das könnten die Leute sein, die First Class reisen. So haben die Reichen überlebt, das ist eine traurige geschichte auf dieser bühne.
  3. In der dritten Spalte, wenn du eltern hast, hat eine höhere Überlebenschance. Dann, Eltern hätten die Kinder vor sich selbst retten können, so erklären die preise
  4. Und wenn du ein Kind bist und Geschwister hast, du hast weniger Chancen zu überleben.

Jetzt machen wir etwas Ähnliches mit unseren kategorialen Variablen:

für i in df_cat.columns:
    sns.barplot(df_cat[ich].value_counts().Index,df_cat[ich].value_counts()).set_title(ich)
    plt.zeigen()
86996tit7-8457352

Ticket- und Kabinengrafiken sehen sehr unordentlich aus, Wir müssen sie vielleicht entwerfen! Abgesehen davon, der Rest der Grafiken verrät es uns:

  1. Überlebt: die meisten Menschen starben bei dem Schiffbruch, nur ein paar 300 Menschen haben überlebt.
  2. PKlasse: Die meisten Reisenden hatten Fahrkarten für die 3. Klasse.
  3. Sex: es waren mehr Männer als Frauen an Bord des Schiffes, etwa die doppelte Menge.
  4. Eingeschifft: Die meisten Passagiere bestiegen das Schiff aus Southampton.

Jetzt machen wir etwas Ähnliches wie das dynamische Tabelle anterior, aber mit unseren kategorialen Variablen, und vergleichen Sie diese mit unseren Variable abhängig, Was wäre, wenn die Leute überlebten?:

drucken(pd.pivot_table(Ausbildung, index = 'Survived', Spalten="PKlasse",
                     Werte="Fahrkarte" ,aggfunc="zählen"))
drucken()
drucken(pd.pivot_table(Ausbildung, index = 'Survived', Spalten="Sex", 
                     Werte="Fahrkarte" ,aggfunc="zählen"))
drucken()
drucken(pd.pivot_table(Ausbildung, index = 'Survived', Spalten="Eingeschifft", 
                     Werte="Fahrkarte" ,aggfunc="zählen"))
59545tit8-8211073
  1. PKlasse: Hier sehen wir, dass viel mehr Menschen aus der ersten Klasse überlebten als aus der zweiten oder dritten Klasse., obwohl die Gesamtzahl der Passagiere in der ersten Klasse viel niedriger war als in der dritten Klasse. Deswegen, hier bestätigt sich unsere frühere Annahme, dass die Reichen überlebt haben, was für den Modellbau relevant sein könnte.
  2. Sex: die meisten Frauen überlebten und die meisten Männer starben bei dem Schiffbruch. Deswegen, es scheint, dass das Sprichwort „Frau und Kinder zuerst“ trifft in diesem Szenario tatsächlich zu.
  3. Eingeschifft: Dies scheint nicht sehr relevant zu sein., vielleicht wäre jemand von „Cherburgo"Ich hatte eine größere Chance zu überleben.

Paso 4: Funktionsengineering

Wir haben gesehen, dass unser Fahrkarte Ja Kabine die daten machen für uns nicht wirklich sinn, und dies könnte die Leistung unseres Modells beeinträchtigen, Daher müssen wir einige dieser Daten mit Function Engineering vereinfachen.

Wenn wir uns die echten Daten der Kabine ansehen, Wir sehen, dass es im Grunde einen Buchstaben und dann eine Zahl gibt. Buchstaben können bedeuten, um was für eine Kabine es sich handelt, wo du auf dem schiff bist, auf welcher Etage, für welche klasse ist es, etc. Und die Zahlen können die Kabinennummer bedeuten. Teilen wir sie zuerst in einzelne Kabinen auf und sehen, ob jemand mehr als eine Kabine hatte.

df_cat.Kabine
Ausbildung['cabin_multiple'] = training.Kabine.apply(Lambda x: 0 wenn pd.isna(x) 
                                                    sonst len(x.split('Review')))
Ausbildung['cabin_multiple'].value_counts()
90167tit9-4178663

Es scheint, dass die überwiegende Mehrheit keine individuellen Kabinen hatte, und nur wenige Leute hatten mehr als eine Kabine. Mal sehen, ob die Überlebensraten davon abhängen:

pd.pivot_table(Ausbildung, index = 'Survived', Spalten="kabine_multiple",
               Werte="Fahrkarte" ,aggfunc="zählen")
13261tit10-6439403

Dann, Sehen wir uns den tatsächlichen Brief der Kabine an, in der sie sich befanden. Deswegen, Sie könnten erwarten, dass sich Kabinen mit demselben Buchstaben an ungefähr denselben Standorten oder auf denselben Etagen befinden und, logisch, wenn eine Kabine in der Nähe der Rettungsboote wäre, sie hatten eine bessere Chance zu überleben. Schauen wir uns das an:

# n steht für null
# in this case we will treat null values like it's own category
training['cabin_adv'] = training.Kabine.apply(Lambda x: str(x)[0])
#Vergleich der Überlebensraten nach Kabine
drucken(training.cabin_adv.value_counts())
pd.pivot_table(Ausbildung,index='Survived',Spalten="kabine_adv", 
                        Werte="Name", aggfunc="zählen")
13955tit11-9018078

Ich habe etwas Zukunftstechnik in der Fahrkarte Kolumne und brachte nicht viele wichtige Erkenntnisse, das wissen wir noch nicht, Also überspringe ich diesen Teil, um den Artikel prägnant zu halten. Wir werden die Tickets einfach in numerische und nicht-numerische unterteilen, um eine effiziente Verwendung zu gewährleisten:

Ausbildung['numeric_ticket'] = training.Ticket.beantragen(Lambda x: 1 wenn x.isnumeric() anders 0)
Ausbildung['ticket_letters'] = training.Ticket.beantragen(Lambda x: ''.join(x.split('Review')[:-1])
                                            .ersetzen('.','').ersetzen('/','')
                                            .untere() wenn len(x.split('Review')[:-1]) >0 anders 0)

Eine weitere interessante Sache, die wir beobachten können, sind die Titel der einzelnen Passagiere. Und wenn er eine Rolle gespielt hat, um ihnen einen Platz in den Rettungsbooten zu verschaffen?.

Ausbildung.Name.Kopf(50)
Ausbildung['name_title'] = training.Name.apply(Lambda x: x.split(',')[1]
                                                        .Teilt('.')[0].Streifen())
Ausbildung['name_title'].value_counts()
81866tit12-6063805

Wie du siehst, das Schiff wurde von Menschen vieler verschiedener Klassen bestiegen, Das könnte in unserem Modell nützlich sein.

Paso 5: Datenvorverarbeitung für das Modell

In diesem Segment, wir bereiten unsere Daten für Modelle auf. Die Ziele, die wir erreichen müssen, sind unten aufgeführt:

  1. Entfernen Sie die Nullwerte aus der Spalte Versand
  2. Nur relevante Daten einbeziehen
  3. Alle Daten kategorisch transformieren, mit einem sogenannten Transformator.
  4. Imputation von Daten mit zentralen Trends nach Alter und Rate.
  5. Normalisieren Sie die Bewertung Spalte, um eine normalere Verteilung zu haben.
  6. unter Verwendung von Standardskaladaten 0-1

Paso 6: Modellimplementierung

Hier werden wir die verschiedenen Modelle einfach mit Parameter Standardeinstellungen und sehen Sie, welche das beste Ergebnis liefert. Modelle können für eine bessere Leistung weiter angepasst werden, aber sie sind nicht Gegenstand dieses Artikels. Die Modelle, die wir betreiben werden, sind:

  • Logistische Regression
  • K Nächster Nachbar
  • Unterstützungsvektorklassifikator

Zuerst, wir importieren die benötigten Modelle

aus sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
von sklearn.neighbors importieren KNeighborsClassifier
aus sklearn.svm SVC importieren

1) Logistische Regression

lr = LogistikRegression(max_iter = 2000)
cv = cross_val_score(lr,X_train_scaled,y_train,cv=5)
drucken(Lebenslauf)
drucken(cv.mean())
69064tit13-7080871

2) K Nächster Nachbar

knn = KNeighborsClassifier()
cv = cross_val_score(knn,X_train_scaled,y_train,cv=5)
drucken(Lebenslauf)
drucken(cv.mean())
92742tit14-6077970

3) Unterstützungsvektorklassifikator

svc = SVC(Wahrscheinlichkeit = Wahr)
cv = cross_val_score(svc,X_train_scaled,y_train,cv=5)
drucken(Lebenslauf)
drucken(cv.mean())
75340tit15-9492439

Deswegen, die Genauigkeit der Modelle ist:

  • Logistische Regression: 82,2%
  • K Nächster Nachbar: 81,4%
  • SVC: 83,3%

Wie du siehst, Wir erreichen eine anständige Genauigkeit mit allen unseren Modellen, aber das beste ist SVC. Und fertig, So haben Sie Ihr erstes Data Science Projekt abgeschlossen! Obwohl viel mehr getan werden kann, um bessere Ergebnisse zu erzielen, Dies ist mehr als genug, um Ihnen den Einstieg zu erleichtern und zu sehen, wie Sie wie ein Datenwissenschaftler denken. Ich hoffe dieses Tutorial hat dir geholfen, Ich hatte eine tolle Zeit das Projekt selbst zu machen und ich hoffe es gefällt euch auch. Gesundheit!!

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.

Datenlautsprecher