Lewati ke konten utama

Tutorial Kaggle: EDA & Machine Learning

Dalam tutorial Kaggle ini, Anda akan mempelajari cara mendekati dan membangun model pembelajaran terawasi dengan bantuan exploratory data analysis (EDA) pada data Titanic.
· 10 mnt Baca

Jelajahi bersama AI

Awal bulan ini, saya melakukan Sesi Facebook Live Code Along di mana saya (dan semua yang ikut ngoding bersama) membangun beberapa algoritme dengan kompleksitas yang meningkat untuk memprediksi apakah penumpang tertentu di Titanic selamat atau tidak, berdasarkan data seperti tarif yang mereka bayar, pelabuhan keberangkatan, dan usia.

Pada tulisan ini, Anda akan meninjau beberapa hal yang kami bahas dalam sesi tersebut. Jika Anda ingin menonton ulang atau mengikuti tulisan ini bersama videonya, Anda bisa menontonnya di sini:

Khususnya, Anda mungkin masih ingat bahwa kita membangun model pembelajaran terawasi.

Pembelajaran terawasi adalah cabang Machine Learning (ML) yang memprediksi label, seperti 'Survived' atau 'Not'. Model semacam ini belajar dari data berlabel, yaitu data yang mencantumkan apakah seorang penumpang selamat (disebut "pelatihan model"), lalu membuat prediksi pada data tanpa label.

Di Kaggle, sebuah platform untuk pemodelan prediktif dan kompetisi analitik, ini disebut set latih dan uji karena

  • Anda ingin membangun model yang mempelajari pola dalam set latih, dan
  • Kemudian menggunakan model untuk membuat prediksi pada set uji.

Kaggle kemudian memberi tahu Anda persentase jawaban benar: ini dikenal sebagai akurasi model Anda.

Cara Memulai dengan Pembelajaran Terawasi

Seperti yang mungkin sudah Anda ketahui, pendekatan yang baik untuk pembelajaran terawasi adalah sebagai berikut:

  • Lakukan Exploratory Data Analysis (EDA) pada set data Anda;
  • Bangun model cepat-ala-kadarnya, atau model baseline, yang dapat menjadi pembanding untuk model-model berikutnya yang akan Anda bangun;
  • Ulangi proses ini. Anda akan melakukan lebih banyak EDA dan membangun model lain;
  • Rekayasa fitur: ambil fitur yang sudah ada lalu gabungkan atau ekstrak informasi lebih lanjut darinya hingga akhirnya mencapai poin terakhir, yaitu
  • Dapatkan model yang kinerjanya lebih baik.

Dalam sesi code along ini, Anda telah atau akan melakukan semua langkah ini!

Catatan kami juga memiliki kursus yang membantu Anda mulai menggunakan machine learning untuk dataset Titanic dalam Python dan R.

Impor Data Anda dan Periksa

Langkah pertama selalu mengimpor data agar cepat memeriksa data yang akan Anda gunakan. Dalam kasus ini, Anda akan mengimpor paket pandas dan menggunakan fungsi read_csv() untuk membaca data:

Catatan bahwa pada potongan kode di bawah, paket lain dan modul dari paket seperti matplotlib, sklearn, dan seaborn sudah diimpor. Anda akan menggunakannya lebih lanjut untuk visualisasi data (statistik) dan keperluan machine learning!

Anda juga menggunakan perintah IPython magic %matplotlib inline agar plot muncul langsung di notebook. Anda juga menambahkan sns.set() ke potongan kode untuk mengubah gaya visualisasi ke gaya dasar Seaborn:

# Import modules
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.metrics import accuracy_score

# Figures inline and set visualization style
%matplotlib inline
sns.set()

Tanpa berlama-lama, mari impor data dan ambil langkah pertama menelaah data Anda:

# Import test and train datasets
df_train = pd.read_csv('../data/train.csv')
df_test = pd.read_csv('../data/test.csv')

# View first lines of training data
df_train.head(n=4)
 PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S

Jika Anda ingin melihat apa saja fitur-fiturnya, lihat dokumentasi data Kaggle di sini.

Sebelum melanjutkan, ada baiknya memperhatikan hal berikut terkait terminologi:

  • Variabel target adalah variabel yang ingin Anda prediksi;
  • Variabel lainnya disebut "fitur" (atau "variabel prediktor", fitur yang Anda gunakan untuk memprediksi variabel target).

Dengan ini, Anda dapat lanjut menelaah data Anda, misalnya dengan fungsi head() untuk menampilkan lima baris pertama dari set data Anda:

# View first lines of test data
df_test.head()
 PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS

Perhatikan bahwa DataFrame df_test tidak memiliki kolom 'Survived' karena inilah yang akan Anda prediksi!

  • Anda juga dapat menggunakan metode DataFrame .info() untuk memeriksa tipe data, nilai hilang, dan lainnya (dari df_train).
df_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

Dalam kasus ini, Anda melihat bahwa hanya ada 714 nilai non-null untuk kolom 'Age' pada DataFrame dengan 891 baris. Ini berarti ada 177 nilai null atau hilang.

  • Juga, gunakan metode DataFrame .describe() untuk memeriksa statistik ringkas kolom numerik (dari df_train).
df_train.describe()
 PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000714.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607114.5264971.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000020.1250000.0000000.0000007.910400
50%446.0000000.0000003.00000028.0000000.0000000.00000014.454200
75%668.5000001.0000003.00000038.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200

Visual Exploratory Data Analysis (EDA) dan Model Pertama Anda

Sekarang Anda sudah punya gambaran tentang data dan telah melihat beberapa statistik, saatnya juga memvisualisasikan data Anda dengan bantuan paket seaborn:

  • Misalnya, gunakan seaborn untuk membuat bar plot dari kelangsungan hidup di Titanic, yang merupakan variabel target Anda.
sns.countplot(x='Survived', data=df_train);

bar chart

Inti: pada set latih, lebih sedikit orang yang selamat daripada yang tidak. Mari kita bangun model pertama yang memprediksi tidak ada yang selamat.

Ini model yang buruk karena Anda tahu ada yang selamat. Namun ini memberi baseline: model apa pun yang kita bangun nanti harus lebih baik dari ini.

Anda dapat melakukannya dengan langkah-langkah berikut:

  • Buat kolom 'Survived' untuk df_test yang mengodekan 'tidak selamat' untuk semua baris;
  • Simpan kolom 'PassengerId' dan 'Survived' dari df_test ke .csv dan kirimkan ke Kaggle.
df_test['Survived'] = 0
df_test[['PassengerId', 'Survived']].to_csv('data/predictions/no_survivors.csv', index=False)

Akurasi berapa yang Anda dapatkan? Akurasi di Kaggle adalah 62,7.

kaggle

Tidak terlalu buruk!

Catatan penting! Anda juga ingin menggunakan metrik selain akurasi!

EDA pada Variabel Fitur

Setelah Anda membuat model cepat-ala-kadarnya, saatnya mengulangi: mari lakukan lebih banyak Exploratory Data Analysis dan segera bangun model lain!

  • Anda dapat menggunakan seaborn untuk membuat bar plot fitur dataset Titanic 'Sex' (dari df_train).
sns.countplot(x='Sex', data=df_train);

bar plot

  • Juga, gunakan seaborn untuk membuat bar plot fitur dataset Titanic 'Survived' yang dibagi (di-facet) menurut fitur 'Sex'.
sns.factorplot(x='Survived', col='Sex', kind='count', data=df_train);

bar plot

Inti: Perempuan lebih mungkin selamat daripada laki-laki.

  • Dengan temuan ini, Anda dapat menggunakan pandas untuk menghitung berapa banyak perempuan dan berapa banyak laki-laki yang selamat:
df_train.groupby(['Sex']).Survived.sum()
Sex
female    233
male      109
Name: Survived, dtype: int64
  • Gunakan pandas untuk mengetahui proporsi perempuan yang selamat, serta proporsi laki-laki:
print(df_train[df_train.Sex == 'female'].Survived.sum()/df_train[df_train.Sex == 'female'].Survived.count())
print(df_train[df_train.Sex == 'male'].Survived.sum()/df_train[df_train.Sex == 'male'].Survived.count())
0.742038216561
0.188908145581

74% perempuan selamat, sedangkan 19% laki-laki selamat.

Sekarang mari bangun model kedua dan prediksi bahwa semua perempuan selamat dan semua laki-laki tidak. Sekali lagi, ini model yang tidak realistis, tetapi akan memberikan baseline untuk membandingkan model berikutnya.

  • Buat kolom 'Survived' untuk df_test yang mengodekan prediksi di atas.
  • Simpan kolom 'PassengerId' dan 'Survived' dari df_test ke .csv dan kirimkan ke Kaggle.
df_test['Survived'] = df_test.Sex == 'female'
df_test['Survived'] = df_test.Survived.apply(lambda x: int(x))
df_test.head()
 PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSurvived
08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ0
18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS1
28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ0
38953Wirz, Mr. Albertmale27.0003151548.6625NaNS0
48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS1
df_test[['PassengerId', 'Survived']].to_csv('../data/predictions/women_survive.csv', index=False)

Nah, akurasi berapa yang diberikan model ini saat Anda mengirimkannya ke Kaggle?

Akurasi di Kaggle adalah 76,6%:

kaggle

Dengan submission ini, Anda naik sekitar 2.000 peringkat di leaderboard! Selain itu, skor Anda meningkat, jadi kerja Anda sangat bagus!

Jelajahi Data Anda Lebih Jauh!

  • Gunakan seaborn untuk membuat bar plot fitur dataset Titanic 'Survived' yang dibagi (di-facet) menurut fitur 'Pclass'.
sns.factorplot(x='Survived', col='Pclass', kind='count', data=df_train);

bar plot

Inti: Penumpang kelas satu lebih mungkin selamat. Sebaliknya, penumpang kelas tiga lebih tidak mungkin selamat.

  • Gunakan seaborn untuk membuat bar plot fitur dataset Titanic 'Survived' yang dibagi (di-facet) menurut fitur 'Embarked'.
sns.factorplot(x='Survived', col='Embarked', kind='count', data=df_train);

bar plot

Inti: Penumpang yang berangkat dari Southampton lebih kecil kemungkinannya untuk selamat.

EDA dengan Variabel Numerik

  • Gunakan seaborn untuk membuat histogram kolom 'Fare' dari df_train.
sns.distplot(df_train.Fare, kde=False);

histogram

Inti: Sebagian besar penumpang membayar kurang dari 100 untuk bepergian dengan Titanic.

  • Gunakan metode plotting pandas untuk memplot kolom 'Fare' untuk tiap nilai 'Survived' pada plot yang sama.
df_train.groupby('Survived').Fare.hist(alpha=0.6);

bar plot

Inti: Tampaknya mereka yang membayar lebih memiliki peluang bertahan hidup yang lebih tinggi.

  • Gunakan seaborn untuk membuat histogram kolom 'Age' dari df_train. Anda perlu menghapus nilai null sebelum melakukannya.
df_train_drop = df_train.dropna()
sns.distplot(df_train_drop.Age, kde=False);

histogram

  • Plotkan strip plot & swarm plot dari 'Fare' dengan 'Survived' pada sumbu x.
sns.stripplot(x='Survived', y='Fare', data=df_train, alpha=0.3, jitter=True);

strip plot

sns.swarmplot(x='Survived', y='Fare', data=df_train);

swarm plot

Inti: Tarif jelas tampak berkorelasi dengan kelangsungan hidup di Titanic.

  • Gunakan metode DataFrame .describe() untuk memeriksa statistik ringkas 'Fare' sebagai fungsi dari kelangsungan hidup.
df_train.groupby('Survived').Fare.describe()
 countmeanstdmin25%50%75%max
Survived        
0549.022.11788731.3882070.07.854210.526.0263.0000
1342.048.39540866.5969980.012.475026.057.0512.3292
  • Gunakan seaborn untuk membuat scatter plot 'Age' terhadap 'Fare', diwarnai menurut 'Survived'.
sns.lmplot(x='Age', y='Fare', hue='Survived', data=df_train, fit_reg=False, scatter_kws={'alpha':0.5});

scatter plot

Inti: Tampaknya mereka yang selamat entah membayar cukup mahal untuk tiketnya atau mereka masih muda.

  • Gunakan seaborn untuk membuat pairplot dari df_train, diwarnai menurut 'Survived'. Pairplot adalah cara yang bagus untuk menampilkan sebagian besar informasi yang sudah Anda temukan dalam satu kisi plot.
sns.pairplot(df_train_drop, hue='Survived');

plots

Dari EDA ke Model Machine Learning

Dalam tutorial ini, Anda telah berhasil:

  • memuat data kita dan meninjaunya.
  • menjelajahi variabel target secara visual dan membuat prediksi pertama Anda.
  • menjelajahi beberapa variabel fitur secara visual dan membuat lebih banyak prediksi yang lebih baik berdasarkan EDA kita.
  • melakukan EDA mendalam pada variabel fitur, kategorikal dan numerik.

Pada tulisan berikutnya, Anda akan meluangkan waktu untuk membangun beberapa model Machine Learning, berdasarkan apa yang Anda pelajari dari EDA di sini. Kita akan melakukannya pada tulisan berikutnya untuk proyek ini (akan diluncurkan pada 27 Desember).

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026