Previsione della sopravvivenza del Titanic | Il tuo primo progetto di data science

Contenuti

introduzione

In questo articolo, esamineremo il popolare set di dati del Titanic e proveremo a prevedere se una persona è sopravvissuta al relitto. Puoi ottenere questo set di dati da Kaggle, collegato qui. Questo articolo si concentrerà su come pensare a questi progetti, più che nella realizzazione. Molti principianti sono confusi su come iniziare, quando finire e tutto il resto, Spero che questo articolo ti serva da manuale per principianti.. Ti suggerisco di praticare il progetto in Kaggle.

L'obiettivo: prevedere se un passeggero è sopravvissuto o meno. 0 per non sopravvivere, 1 per sopravvivere.

Descrizione dei dati

In questo articolo, faremo un'analisi dei dati di base, poi un po' di ingegneria delle funzionalità e, alla fine, useremo alcuni dei modelli popolari per la previsione. Cominciamo.

Analisi dei dati

passo 1: Importazione di librerie di base

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

passo 2: leggere i dati

formazione = pd.read_csv('/kaggle/input/titanic/treno.csv')
test = pd.read_csv('/kaggle/input/titanic/test.csv')
addestramento['train_test'] = 1
test['train_test'] = 0
test['Sopravvissuto'] = np.NaN
all_data = pd.concat([addestramento,test])
all_data.columns
18686tit1-9496194

passo 3: esplorazione dei dati

In questa sezione, cercheremo di estrarre insight dai dati e familiarizzare con essi al fine di creare modelli più efficienti.

training.info()
94258tit2-3196801
training.descrivere()
46684tit3-8398010
# seperate the data into numeric and categorical
df_num = training[['Età','SibSp','Rispetto',"Tariffa"]]
df_cat = allenamento[['Sopravvissuto','classe','Sesso','Biglietto','Cabina',"Imbarcato"]]

Ora graficiamo i dati numerici:

per io in df_num.columns:
    plt.hist(df_num[io])
    plt.titolo(io)
    plt.mostra()
16822tit4-7767330

Quindi, come potete vedere, la maggior parte delle distribuzioni sono sparse, tranne l'età, è abbastanza normalizzato. Potremmo considerare di normalizzarli in seguito. Prossimo, trazamos un mappa di calore de correlación entre las columnas numéricas:

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

Qui possiamo vedere che Parch e SibSp hanno una correlazione maggiore, il che generalmente ha senso in quanto i genitori hanno maggiori probabilità di viaggiare con i loro più figli e i coniugi tendono a viaggiare insieme. Prossimo, confrontiamo i tassi di sopravvivenza tra variabili numeriche. Questo potrebbe rivelare alcune idee interessanti:

pd.pivot_table(addestramento, indice = 'Sopravvissuto', valori = ['Età','SibSp','Rispetto',"Tariffa"])
87496tit6-2688742

L'inferenza che possiamo trarre da questa tabella è:

  1. L'età media dei sopravvissuti è 28 anni, quindi i giovani tendono a sopravvivere più a lungo.
  2. Le persone che pagavano tariffe più alte avevano maggiori probabilità di sopravvivere, più del doppio. Queste potrebbero essere le persone che viaggiano in prima classe. Ecco come sono sopravvissuti i ricchi, che è una storia triste su questo palco.
  3. Nella terza colonna, se hai i genitori, ha maggiori possibilità di sopravvivere. Quindi, i genitori avrebbero potuto salvare i bambini prima di loro stessi, spiegando così le tariffe
  4. E se sei un bambino e hai fratelli, hai meno possibilità di sopravvivere.

Ora facciamo qualcosa di simile con le nostre variabili categoriali:

per io in df_cat.columns:
    sns.barplot(df_cat[io].value_counts().indice,df_cat[io].value_counts()).set_title(io)
    plt.mostra()
86996tit7-8457352

La grafica del biglietto e della cabina sembra molto disordinata, Potrebbe essere necessario progettarli! Oltre a quello, il resto dei grafici ce lo dicono:

  1. Sopravvissuto: la maggior parte delle persone è morta nel naufragio, solo alcuni 300 le persone sono sopravvissute.
  2. Pclass: La maggior parte delle persone che viaggiavano aveva biglietti di 3a classe.
  3. Sesso: c'erano più uomini che donne a bordo della nave, circa il doppio della quantità.
  4. Imbarcato: La maggior parte dei passeggeri è salita a bordo della nave da Southampton.

Ahora haremos algo similar a la tabella dinamica anteriore, ma con le nostre variabili categoriali, y las compararemos con nuestra variabile dipendente, e se le persone sopravvivessero?:

Stampa(pd.pivot_table(addestramento, indice = 'Sopravvissuto', colonne="Pclass",
                     valori="Biglietto" ,aggfunc="contare"))
Stampa()
Stampa(pd.pivot_table(addestramento, indice = 'Sopravvissuto', colonne="Sesso", 
                     valori="Biglietto" ,aggfunc="contare"))
Stampa()
Stampa(pd.pivot_table(addestramento, indice = 'Sopravvissuto', colonne="Imbarcato", 
                     valori="Biglietto" ,aggfunc="contare"))
59545tit8-8211073
  1. Pclass: Qui possiamo vedere che molte più persone della prima classe sono sopravvissute rispetto alla seconda o terza classe., anche se il numero totale di passeggeri in Prima classe era molto inferiore a quello in Terza classe. Perciò, qui viene confermata la nostra precedente supposizione che i ricchi sopravvivessero, cosa potrebbe essere rilevante per la costruzione di modelli.
  2. Sesso: la maggior parte delle donne sopravvisse e la maggior parte degli uomini morì nel naufragio. Perciò, sembra che il detto “Prima donna e bambini” si applica davvero in questo scenario.
  3. Imbarcato: Questo non sembra molto rilevante, forse se qualcuno fosse di “Cherburgo"Avevo maggiori possibilità di sopravvivere.

passo 4: Ingegneria delle funzioni

Abbiamo visto che il nostro biglietto e cabina i dati non hanno molto senso per noi, e questo potrebbe ostacolare le prestazioni del nostro modello, quindi dobbiamo semplificare alcuni di questi dati con l'ingegneria delle funzioni.

Se guardiamo i dati reali della cabina, vediamo che in fondo c'è una lettera e poi un numero. Le lettere possono significare che tipo di cabina è, dove sei sulla nave, su quale piano, per che classe è, eccetera. E i numeri possono significare il numero della cabina. Per prima cosa dividiamoli in cabine individuali e vediamo se qualcuno aveva più di una cabina..

df_cat.Cabin
training['cabin_multiple'] = formazione. Cabin.apply(lambda x: 0 se pd.isna(X) 
                                                    else len(x.split(' ')))
addestramento['cabin_multiple'].value_counts()
90167tit9-4178663

Sembra che la stragrande maggioranza non avesse cabine individuali, e solo poche persone avevano più di una cabina. Ora vediamo se i tassi di sopravvivenza dipendono da questo.:

pd.pivot_table(addestramento, indice = 'Sopravvissuto', colonne="cabin_multiple",
               valori="Biglietto" ,aggfunc="contare")
13261tit10-6439403

Prossimo, vediamo la grafia effettiva della cabina in cui si trovavano. Perciò, ci si potrebbe aspettare che le cabine con la stessa lettera si trovino all'incirca nelle stesse posizioni o sugli stessi piani e, logicamente, se una cabina era vicino a scialuppe di salvataggio, aveva maggiori possibilità di sopravvivere. Diamo un'occhiata a questo.:

# n sta per null
# in this case we will treat null values like it's own category
training['cabin_adv'] = formazione. Cabin.apply(lambda x: str(X)[0])
#comparing survival rates by cabin
print(training.cabin_adv.value_counts())
pd.pivot_table(addestramento,index='Sopravvissuto',colonne="cabin_adv", 
                        valori="Nome", aggfunc="contare")
13955tit11-9018078

Ho fatto un po 'di ingegneria futura nel biglietto e non ha prodotto molte conoscenze importanti, che non sappiamo ancora, quindi salterò quella parte per mantenere l'articolo conciso. Divideremo semplicemente i biglietti in numerici e non numerici per un uso efficiente:

addestramento['numeric_ticket'] = formazione. Ticket.apply(lambda x: 1 se x.isnumerico() altro 0)
addestramento['ticket_letters'] = formazione. Ticket.apply(lambda x: ''.join(x.split(' ')[:-1])
                                            .sostituire('.','').sostituire('/','')
                                            .inferiore() se len(x.split(' ')[:-1]) >0 altro 0)

Un'altra cosa interessante che possiamo osservare è il titolo dei singoli passeggeri. E se ha avuto un ruolo nell'ottenere loro un posto nelle scialuppe di salvataggio.

training.Nome.testa(50)
addestramento['nome_titolo'] = training.Nome.applica(lambda x: x.split(',')[1]
                                                        .diviso('.')[0].striscia())
addestramento['nome_titolo'].value_counts()
81866tit12-6063805

Come potete vedere, la nave è stata abbordata da persone di molte classi diverse, questo potrebbe essere utile nel nostro modello.

passo 5: pre-elaborazione dei dati per il modello

In questo segmento, prepariamo i nostri dati per i modelli. Gli obiettivi che dobbiamo raggiungere sono elencati di seguito:

  1. Rimuovi i valori null dalla colonna Spedito
  2. Includi solo dati rilevanti
  3. Trasforma categoricamente tutti i dati, usando qualcosa chiamato trasformatore.
  4. Calcolo dei dati con trend centrali per età e tasso.
  5. Normalizza il Vota colonna per avere una distribuzione più normale.
  6. utilizzando dati di scala standard 0-1

passo 6: Implementazione del modello

Aquí simplemente implementaremos los diversos modelos con parametri predeterminados y veremos cuál produce el mejor resultado. I modelli possono essere ulteriormente regolati per prestazioni migliori, ma non rientrano nell'ambito di questo articolo. I modelli che eseguiremo sono:

  • Regressione logistica
  • K Il vicino più vicino
  • Classificatore vettoriale di supporto

Primo, importiamo i modelli necessari

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

1) Regressione logistica

lr = LogisticRegression(max_iter = 2000)
cv = cross_val_score(lr,X_train_scaled,y_train,cv=5)
Stampa(CV)
Stampa(cv.mean())
69064tit13-7080871

2) K Il vicino più vicino

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

3) Classificatore vettoriale di supporto

svc = SVC(probabilità = Vero)
cv = cross_val_score(Svc,X_train_scaled,y_train,cv=5)
Stampa(CV)
Stampa(cv.mean())
75340tit15-9492439

Perciò, la precisione dei modelli è:

  • Regressione logistica: 82,2%
  • K Il vicino più vicino: 81,4%
  • SVC: 83,3%

Come potete vedere, otteniamo una precisione decente con tutti i nostri modelli, ma il migliore è SVC. E pronto, ecco come hai completato il tuo primo progetto di data science! Sebbene si possa fare molto di più per ottenere risultati migliori, questo è più che sufficiente per iniziare e vedere come pensi come uno scienziato dei dati. Spero che questo tutorial ti abbia aiutato, Mi sono divertito molto a realizzare il progetto da solo e spero che piaccia anche a voi. Salute!!

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.