Ana içeriğe geç

Kaggle Eğitimi: EDA & Makine Öğrenimi

Bu Kaggle eğitiminde, Titanic verileri üzerinde keşifsel veri analizi (EDA) yardımıyla gözetimli öğrenme modellerine nasıl yaklaşacağınızı ve bunları nasıl kuracağınızı öğreneceksiniz.
· 10 dk. oku

Yapay Zeka ile Keşfedin

Bu ayın başlarında, bir Facebook Live Birlikte Kodlama Oturumu yaptım; bu oturumda ben (ve birlikte kodlayan herkes), ücret, biniş limanı ve yaş gibi bilgiler verildiğinde, Titanic’te herhangi bir yolcunun hayatta kalıp kalmadığını tahmin eden, giderek karmaşıklaşan birkaç algoritma oluşturduk.

Bu yazıda, o oturumda ele aldığımız bazı konuların üzerinden geçeceksiniz. Bu yazıyı tekrar izlemek veya videoyla birlikte takip etmek isterseniz, buradan izleyebilirsiniz:

Özellikle, gözetimli öğrenme modelleri kurduğumuzu hatırlıyor olabilirsiniz.

Gözetimli öğrenme, 'Survived' ya da 'Not' gibi etiketleri tahmin etmeyi içeren Makine Öğrenimi (ML) dalıdır. Bu tür modeller, yolcunun hayatta kalıp kalmadığını içeren etiketli verilerden öğrenir ("model eğitimi" olarak adlandırılır) ve ardından etiketlenmemiş veriler üzerinde tahmin yapar.

Öngörüsel modelleme ve analitik yarışmaları için bir platform olan Kaggle’da, bunlar eğitim ve test kümeleri olarak adlandırılır çünkü

  • Eğitim kümesindeki örüntüleri öğrenen bir model oluşturmak istersiniz ve
  • Ardından modeli test kümesi üzerinde tahmin yapmak için kullanırsınız.

Sonrasında Kaggle size doğru bildiğiniz yüzdeyi söyler: buna modelinizin başarımı (accuracy) denir.

Gözetimli Öğrenmeye Nasıl Başlanır

Muhtemelen bildiğiniz gibi, gözetimli öğrenmeye iyi bir yaklaşım aşağıdaki gibidir:

  • Veri kümeniz üzerinde Keşifsel Veri Analizi (EDA) yapın;
  • Daha sonra oluşturacağınız modellere karşı bir karşılaştırma görevi görebilecek, hızlı ve kaba bir model veya bir temel (baseline) model kurun;
  • Bu süreci yineleyin. Daha fazla EDA yapacak ve başka bir model kuracaksınız;
  • Özellik mühendisliği yapın: elinizdeki özellikleri birleştirin veya onlardan daha fazla bilgi çıkarın ve sonunda şu son noktaya gelin:
  • Daha iyi performans gösteren bir model elde edin.

Bu birlikte kodlama oturumunda, bu adımların hepsini yaptınız veya yapacaksınız!

Not: Titanic veri kümesiyle makine öğrenimine hızlı bir başlangıç yapmanızı sağlayan Python ve R derslerimiz de var.

Verinizi İçe Aktarın ve İnceleyin

İlk adım, üzerinde çalışacağınız veriyi hızlıca görmek için her zaman veriyi içe aktarmaktır. Bu durumda, pandas paketini içe aktaracak ve veriyi okumak için read_csv() fonksiyonunu kullanacaksınız:

Not: Aşağıdaki kod bloklarında, matplotlib, sklearn ve seaborn gibi paketler ile bu paketlerin modülleri zaten içe aktarılmıştır. Bunları daha sonra (istatistiksel) veri görselleştirme ve makine öğrenimi amaçları için daha kapsamlı biçimde kullanacaksınız!

Ayrıca çizimlerinizin not defterinizde satır içi görünmesi için IPython sihirli komutu %matplotlib inline kullanırsınız. Görselleştirme stilini temel bir Seaborn stiline değiştirmek için kod bloğunuza sns.set() de eklersiniz:

# 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()

Daha fazla uzatmadan, veriyi içe aktaralım ve verinizi incelemenin ilk adımını atalım:

# 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

Bu özelliklerin her birinin ne olduğunu görmek isterseniz, Kaggle veri dokümantasyonuna buradan göz atın.

Devam etmeden önce, terminoloji açısından aşağıdakileri dikkate almak iyidir:

  • Hedef değişken, tahmin etmeye çalıştığınız değişkendir;
  • Diğer değişkenler "özellik" (veya "yordayıcı değişkenler", hedef değişkeni tahmin etmek için kullandığınız özellikler) olarak bilinir.

Bunu aklınızda tutarak, veri kümenizin ilk beş satırını getirmek için kullanabileceğiniz head() fonksiyonu gibi yöntemlerle verinizi incelemeye devam edebilirsiniz:

# 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

df_test DataFrame’inin 'Survived' sütununa sahip olmadığını unutmayın; çünkü tahmin etmeye çalışacağınız şey bu!

  • Ayrıca, veri tiplerini, eksik değerleri ve daha fazlasını kontrol etmek için ( df_train’in) DataFrame .info() metodunu kullanabilirsiniz.
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

Bu durumda, 891 satırlık bir DataFrame’de 'Age' sütunu için yalnızca 714 non-null değer olduğunu görüyorsunuz. Bu, 177 null veya eksik değer olduğu anlamına gelir.

  • Ayrıca, sayısal sütunların özet istatistiklerini kontrol etmek için ( df_train’in) DataFrame .describe() metodunu kullanın.
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

Görsel Keşifsel Veri Analizi (EDA) ve İlk Modeliniz

Artık verinizin nasıl göründüğüne dair bir fikriniz olduğuna ve bazı istatistikleri incelediğinize göre, seaborn paketinin yardımıyla verinizi görselleştirmenin zamanı geldi:

  • Örneğin, hedef değişkeniniz olan Titanic’te hayatta kalmayı gösteren bir çubuk grafik oluşturmak için seaborn kullanın.
sns.countplot(x='Survived', data=df_train);

bar chart

Çıkarım: Eğitim kümesinde, hayatta kalanların sayısı, kalmayanlardan daha az. O halde, kimsenin hayatta kalmadığını tahmin eden bir ilk model kuralım.

Bu, biliyorsunuz ki kötü bir model; çünkü hayatta kalanlar var. Ancak bize bir temel sağlar: daha sonra kuracağımız herhangi bir modelin bundan daha iyi olması gerekir.

Bunu şu adımları izleyerek yapabilirsiniz:

  • df_test için tüm satırlarda 'hayatta kalmadı' bilgisini kodlayan bir 'Survived' sütunu oluşturun;
  • df_test’in 'PassengerId' ve 'Survived' sütunlarını bir .csv dosyasına kaydedin ve Kaggle’a gönderin.
df_test['Survived'] = 0
df_test[['PassengerId', 'Survived']].to_csv('data/predictions/no_survivors.csv', index=False)

Bu size ne kadar doğruluk verdi? Kaggle’daki doğruluk 62,7.

kaggle

Fena değil!

Önemli not! Doğruluk (accuracy) dışında metrikler de kullanmak isteyeceksiniz!

Özellik Değişkenlerinde EDA

Hızlı ve kaba bir model oluşturduğunuza göre, yineleme zamanı: Biraz daha Keşifsel Veri Analizi yapalım ve yakında başka bir model kuralım!

  • df_train’in Titanic veri kümesindeki 'Sex' özelliğinin bir çubuk grafiğini oluşturmak için seaborn kullanabilirsiniz.
sns.countplot(x='Sex', data=df_train);

bar plot

  • Ayrıca, Titanic veri kümesinin 'Survived' özelliğinin, 'Sex' özelliğine göre ayrılmış (facet) çubuk grafiklerini oluşturmak için seaborn kullanın.
sns.factorplot(x='Survived', col='Sex', kind='count', data=df_train);

bar plot

Çıkarım: Kadınların hayatta kalma olasılığı erkeklerden daha yüksekti.

  • Bu çıkarımla, kaç kadının ve kaç erkeğin hayatta kaldığını bulmak için pandas kullanabilirsiniz:
df_train.groupby(['Sex']).Survived.sum()
Sex
female    233
male      109
Name: Survived, dtype: int64
  • Kadınların hayatta kalma oranını ve erkeklerin oranını bulmak için pandas kullanın:
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

Kadınların %74’ü hayatta kaldı, erkeklerin ise %19’u hayatta kaldı.

Şimdi ikinci bir model kuralım ve tüm kadınların hayatta kaldığını, tüm erkeklerin de kalmadığını tahmin edelim. Bu da gerçekçi olmayan bir modeldir; ancak gelecekteki modelleri karşılaştırmak için bir temel sağlar.

  • df_test için yukarıdaki tahmini kodlayan bir 'Survived' sütunu oluşturun.
  • df_test’in 'PassengerId' ve 'Survived' sütunlarını bir .csv’ye kaydedin ve Kaggle’a gönderin.
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)

Şimdi, bunu Kaggle’a gönderdiğinizde bu model size ne kadar doğruluk verdi?

Kaggle’daki doğruluk %76,6:

kaggle

Bu gönderimle, liderlik tablosunda yaklaşık 2.000 sıra yükseldiniz! Ayrıca puanınızı da geliştirdiniz; harika iş çıkardınız!

Verinizi Daha Fazla Keşfedin!

  • df_train’deki Titanic veri kümesi özelliği 'Survived'’ın, 'Pclass' özelliğine göre ayrılmış (facet) çubuk grafiklerini oluşturmak için seaborn kullanın.
sns.factorplot(x='Survived', col='Pclass', kind='count', data=df_train);

bar plot

Çıkarım: Birinci sınıfta seyahat eden yolcuların hayatta kalma olasılığı daha yüksekti. Öte yandan, üçüncü sınıfta seyahat eden yolcuların hayatta kalmama olasılığı daha yüksekti.

  • df_train’deki Titanic veri kümesi özelliği 'Survived'’ın, 'Embarked' özelliğine göre ayrılmış (facet) çubuk grafiklerini oluşturmak için seaborn kullanın.
sns.factorplot(x='Survived', col='Embarked', kind='count', data=df_train);

bar plot

Çıkarım: Southampton’dan binen yolcuların hayatta kalma olasılığı daha düşüktü.

Sayısal Değişkenlerle EDA

  • df_train’in 'Fare' sütununun bir histogramını çizmek için seaborn kullanın.
sns.distplot(df_train.Fare, kde=False);

histogram

Çıkarım: Yolcuların çoğu Titanic ile yolculuk için 100’den az ödeme yapmış.

  • Aynı grafikte, 'Survived'’ın her değeri için 'Fare' sütununu çizmek üzere bir pandas çizim metodunu kullanın.
df_train.groupby('Survived').Fare.hist(alpha=0.6);

bar plot

Çıkarım: Daha fazla ödeme yapanların hayatta kalma şansının daha yüksek olduğu görülüyor.

  • df_train’in 'Age' sütununun bir histogramını çizmek için seaborn kullanın. Bunu yapmadan önce null değerleri düşürmeniz gerekecek.
df_train_drop = df_train.dropna()
sns.distplot(df_train_drop.Age, kde=False);

histogram

  • 'Fare' için, x ekseninde 'Survived' olacak şekilde bir strip plot ve bir swarm plot çizin.
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

Çıkarım: Ücretin (Fare) Titanic’te hayatta kalmayla kesinlikle ilişkili olduğu görülüyor.

  • Hayatta kalmaya bağlı olarak 'Fare'’in özet istatistiklerini kontrol etmek için DataFrame .describe() metodunu kullanın.
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
  • 'Survived'’a göre renklendirilmiş şekilde, 'Age' ile 'Fare' arasındaki saçılım grafiğini çizmek için seaborn kullanın.
sns.lmplot(x='Age', y='Fare', hue='Survived', data=df_train, fit_reg=False, scatter_kws={'alpha':0.5});

scatter plot

Çıkarım: Hayatta kalanların ya biletleri için epey ödeme yaptığı ya da genç olduğu görülüyor.

  • 'Survived'’a göre renklendirilmiş şekilde, df_train için bir pairplot oluşturmak üzere seaborn kullanın. Pairplot, şimdiye dek keşfettiğiniz bilgilerin çoğunu tek bir grafik ızgarasında göstermenin harika bir yoludur.
sns.pairplot(df_train_drop, hue='Survived');

plots

EDA’dan Makine Öğrenimi Modeline

Bu eğitimde başarıyla:

  • verimizi yükledik ve göz attık.
  • hedef değişkenimizi görsel olarak keşfettiniz ve ilk tahminlerinizi yaptınız.
  • bazı özellik değişkenlerimizi görsel olarak keşfettiniz ve EDA’mıza dayanarak daha iyi sonuç veren daha fazla tahmin yaptınız.
  • özellik değişkenlerinde, kategorik ve sayısal, kapsamlı bir EDA yaptınız.

Bir sonraki yazıda, burada EDA’dan öğrendiklerinize dayanarak bazı Makine Öğrenimi modelleri kurmaya zaman ayıracaksınız. Bunu bu projenin bir sonraki yazısında yapacağız (27 Aralık’ta yayımlanacak).

Konular

İlgili