Vai al contenuto principale

Tutorial sulla competizione Kaggle: Machine Learning sul Titanic

Preparati alla tua prima competizione Kaggle con questo tutorial passo dopo passo.
Aggiornato 29 set 2026  · 9 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

In questo tutorial passeremo in rassegna il dataset del Titanic, lo analizzeremo e invieremo i risultati alla competizione reale. Hai già imparato come recuperare i dati e importarli nel tuo Kaggle Notebook in questo tutorial. Ora useremo DataLab come notebook di data science. Imparerai a usare entrambi gli strumenti su piattaforme diverse, così da poter scegliere il tuo preferito.

Per prima cosa, vai alla sezione "Competitions" su Kaggle e cerca Titanic (Figura 5.4). Prima di entrare direttamente nel notebook, dovresti comprendere tutte le informazioni condivise nelle sezioni "Description and Rules". È importante anche dare un'occhiata ai notebook degli altri utenti, perché possono darti nuove idee per la soluzione.

Figura 5.4: Titanic - Machine Learning from Disaster

La competizione riguarda l'uso del machine learning per creare un modello che preveda quali passeggeri sarebbero sopravvissuti al naufragio del Titanic. Useremo un dataset che include informazioni sui passeggeri come nome, genere, età, ecc. Ci sono 2 dataset diversi che utilizzeremo. Il primo si chiama 'train.csv'. In questo dataset, oltre alle informazioni sui passeggeri, ci sono anche i valori di verità a terra, come 'survived' e 'not survived'. Nel secondo dataset, che si chiama 'test.csv', non ci saranno valori di ground truth, perché dobbiamo predirli e inviare i nostri risultati.

Il file di submission avrà solo 2 colonne: PassengerId e Survived. Il sistema di invio produrrà errori se provi a caricare un file con più di 2 valori. Nota che puoi inviare fino a 10 submission al giorno.

Con le informazioni fornite nella sezione "Competition Description", il passo successivo è recuperare i dati nel nostro DataLab e analizzarli.

Per prima cosa, devi scaricare il dataset in Data Explorer andando nella scheda Data (Figura 5.5). Dovresti scaricare sia 'train.csv' che 'test.csv'.

Dopo aver scaricato i file, vai su DataLab. Nota che devi prima creare un account. Creare un account e usare DataLab è gratuito.

Puoi facilmente trascinare e rilasciare i file sul lato sinistro del notebook (Figura 5.6).

Figura 5.5: Download del dataset
Figura 5.6: Aggiunta del dataset a DataLab

Il passo successivo è controllare il data dictionary nella sezione di descrizione del dataset. Questo ci aiuterà a decidere quali colonne visualizzare.

  • survival: Sopravvivenza
  • pclass: Classe del biglietto
  • sex: Sesso
  • Age: Età in anni
  • sibsp: numero di fratelli/sorelle e coniugi a bordo del Titanic
  • parch: numero di genitori e figli a bordo del Titanic
  • ticket: Numero del biglietto
  • fare: Tariffa del passeggero
  • cabin: Numero di cabina
  • embarked: Porto d'imbarco

Importazione dei dati

Puoi usare comandi bash nei notebook Jupyter anteponendo un punto esclamativo alla cella. Controlleremo la posizione dei file del dataset caricati usando i comandi pwd e ls.

!pwd; ls

/work/files/workspace

notebook.ipynb test.csv train.csv

Pandas è una libreria Python usata per la manipolazione e l'analisi dei dati. Ora abbiamo rimosso le colonne Ticket, Name e PassengerId perché non contengono dati numerici o categoriali significativi. Ora potrai vedere il resto delle feature da usare.

Nelle prossime righe, i file del training e del test set vengono letti usando il metodo read_csv di Pandas. Nota che le colonne Survived e PassengerId sono aggiunte rispettivamente ai dataframe di train e test. Alimenteremo il modello separatamente usando le feature in columns_to_be_added_as_features e le etichette nella colonna Survived. Ma, per semplificare il preprocessing, per ora possiamo combinarle. La variabile test_df_matcher include anche PassengerId. La useremo per abbinare il PassengerId con le predizioni del test set, per generare il file CSV che sarà caricato su Kaggle come nostro risultato.

import pandas as pd
columns_to_be_added_as_features = ['Sex','Age','SibSp','Parch','Pclass','Fare','Embarked']
train_df = pd.read_csv('train.csv', usecols=columns_to_be_added_as_features + ['Survived'])
test_df_matcher = pd.read_csv('test.csv', usecols=columns_to_be_added_as_features + ['PassengerId'])
test_df = test_df[columns_to_be_added_as_features]

Con il metodo head() possiamo vedere le prime 5 righe insieme ai nomi delle colonne. Puoi definire quante righe iniziali mostrare passando il numero come parametro dentro il metodo head(). Il numero di righe nel training set e nel test set viene stampato rispettivamente nella cella seguente.

print(train_df.head())
Figura 5.7: Dataframe
print("Number of rows in training set: {}".format(len(train_df)))
print("Number of rows in test set: {}".format(len(test_df)))

Number of rows in training set: 891 Number of rows in test set: 418

Preprocessing

Dovremmo convertire il tipo dei valori in float, che sarà usato come feature nel modello. Questa conversione ci permetterà di eseguire alcune operazioni numeriche durante la normalizzazione dei dati.

for column_title in columns_to_be_added_as_features:
    if column_title in ['Embarked', "Sex"]:
        continue
    train_df[column_title] = pd.to_numeric(train_df[column_title], downcast="float")
    test_df[column_title] = pd.to_numeric(test_df[column_title], downcast="float")

train_df["Survived"] = pd.to_numeric(train_df["Survived"], downcast="float")

Dobbiamo alimentare il modello usando valori numerici. Nel pezzo di codice sotto, le stringhe sono convertite in valori numerici

train_df['Embarked'].replace('Q', 0,inplace=True)
train_df['Embarked'].replace('S', 1,inplace=True)
train_df['Embarked'].replace('C', 2,inplace=True)

test_df['Embarked'].replace('Q', 0,inplace=True)
test_df['Embarked'].replace('S', 1,inplace=True)
test_df['Embarked'].replace('C', 2,inplace=True)

train_df['Sex'].replace('male', 0,inplace=True)
train_df['Sex'].replace('female', 1,inplace=True)

test_df['Sex'].replace('male', 0,inplace=True)
test_df['Sex'].replace('female', 1,inplace=True)

print(train_df.head())
Figura 5.8: Dataframe con valori numerici

Qui sotto, tutte le feature vengono normalizzate, cioè scalate tra 0 e 1 in questo caso.

#Credit: Michael Aquilina,
#https://stackoverflow.com/questions/26414913/normalize-columns-of-pandas-data-frame
def normalize(df):
    result = df.copy()
    for feature_name in df.columns:
        max_value = df[feature_name].max()
        min_value = df[feature_name].min()
        result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)
    return result

train_df = normalize(train_df)
test_df = normalize(test_df)

print(train_df.head())
Figura 5.9: Dataframe normalizzato

Poiché il dataset sarà suddiviso in training e validation, prima mescoleremo il dataset per evitare raggruppamenti in un solo set.

#Credit: Kris, https://stackoverflow.com/questions/29576430/shuffle-dataframe-rows
train_df = train_df.sample(frac=1).reset_index(drop=True)

Tutti i valori vuoti saranno sostituiti con 0; questa scelta è stata fatta per risparmiare tempo. Tuttavia, puoi leggere questo tutorial per imparare a gestire i valori mancanti nel machine learning.

train_df = train_df.fillna(0)
test_df = test_df.fillna(0)

Di seguito, il rapporto per la validation è impostato a 0,2, il che significa che il 20% dei dati sarà usato per validare. Per dividere il dataset in training e validation set, useremo il metodo train_test_split di Sklearn. Poi separeremo feature ed etichette come mostrato nelle ultime 4 righe del codice seguente.

validation_set_ratio = 0.2
validation_set_size = int(len(train_df)*validation_set_ratio)
training_set_size = len(train_df) - validation_set_size

print("Total set size: {}".format(len(train_df)))
print("Training set size: {}".format(training_set_size))
print("Validation set size: {}".format(validation_set_size))

from sklearn.model_selection import train_test_split

train, val = train_test_split(train_df, test_size=validation_set_ratio)

train_X = train[columns_to_be_added_as_features]
train_Label = train[['Survived']]

val_X = val[columns_to_be_added_as_features]
val_Label = val[['Survived']]

Training

Le support vector machine sono modelli di apprendimento supervisionato usati per classificazione e regressione. Questo modello è stato scelto con i parametri sotto. Dovresti provare anche altri modelli con diverse combinazioni di parametri. Non è necessario avviare e fermare il codice ogni volta che vuoi modificare un parametro o provare un altro modello, perché puoi automatizzare questo processo. Se ti interessano le Support Vector Machines, puoi consultare il tutorial Support Vector Machines con Scikit-learn su DataCamp.

from sklearn.svm import SVC

SVM_KERNEL = "linear"
SVM_C = 10
SVM_GAMMA = 0.00001

svm_model = SVC(kernel = SVM_KERNEL, C = SVM_C, gamma = SVM_GAMMA)
svm_model.fit(train_X, train_Label)

Ottenere le predizioni sul validation set

In questa parte, passeremo al modello le feature del validation set e otterremo le predizioni. Poi le confronteremo con i valori di ground truth. Il metodo metrics.accuracy_score di Sklearn è stato usato per semplificare il calcolo dell'accuratezza. L'accuratezza sul validation set è calcolata come 0,799, un buon inizio.

from sklearn import metrics

y_pred = svm_model.predict(val_X)
print("Accuracy:",metrics.accuracy_score(val_Label, y_pred))

Accuracy: 0.7988826815642458

Ottenere le predizioni sul test set

Ora procediamo a ottenere le predizioni per il test set effettivo. Poiché non ci sono valori di ground truth per il test set, potremo conoscere l'accuratezza solo dopo che il file delle predizioni sarà caricato su Kaggle.

test_pred = svm_model.predict(test_df)

Generare il dataframe di output

La colonna PassengerId viene recuperata dal dataframe chiamato test_df_matcher. Se restituita direttamente, il tipo di valore restituito sarà Series. Per questo motivo, la convertiremo in tipo DataFrame di Pandas. Poi inseriremo le predizioni del test set come seconda colonna del dataframe.

result = pd.DataFrame(test_df_matcher['PassengerId'])
print(result.head(10))
Figura 5.10: Dataframe PassengerId
result.insert(1, "Survived", test_pred, True)
result["Survived"] = pd.to_numeric(result["Survived"], downcast="integer")
print(result.head(10))
Figura 5.11: Dataframe finalizzato

Generare il file di output

Infine, il formato di output è pronto. Come ultimo passo, i valori dell'indice verranno rimossi passando False al parametro index. Ora puoi scaricare il file generato e caricarlo su Kaggle. In questo modo conoscerai l'accuratezza sul test set, dopodiché verrai inserito nella classifica.

result.to_csv("out.csv", index=False)

Ora torneremo alla pagina della competizione, cliccheremo su "Submit Predictions" e poi caricheremo il file con le predizioni. Dopo pochi secondi, otterrai la tua accuratezza sul test (Figura 5.12).

Figura 5.12: Accuratezza del test set

Conclusione

In questo tutorial hai imparato come analizzare un dataset e inviare i tuoi risultati a una competizione Kaggle. Se ti piace partecipare a competizioni di data science, puoi saperne di più sulle DataCamp Competitions qui.

Argomenti
Machine Learning
DataLab
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro