Ana içeriğe geç

Kaggle Yarışması Eğitimi: Titanic’ten Makine Öğrenimi

İlk Kaggle Yarışmanız için bu adım adım eğitimle hazırlanınız.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Bu eğitimde Titanic veri kümesini inceleyecek, analiz edecek ve sonuçları gerçek yarışmaya göndereceğiz. Veriyi nasıl çekeceğinizi ve Kaggle Notebook’unuza nasıl aktaracağınızı zaten bu eğitimde öğrendiniz. Şimdi veri bilimi defteri olarak DataLab’i kullanacağız. Böylece her iki aracı da farklı platformlarda kullanmayı öğrenerek favorinizi seçebileceksiniz.

Önce Kaggle’daki "Competitions" bölümüne gidin ve Titanic’i arayın (Şekil 5.4). Doğrudan not defterine geçmeden önce "Description and Rules" bölümlerinde paylaşılan tüm bilgileri anladığınızdan emin olun. Çözümle ilgili daha fazla fikir verebileceği için diğer kullanıcıların not defterlerini incelemek de önemlidir.

Şekil 5.4: Titanic - Felaketten Makine Öğrenimi

Yarışmanın konusu, Titanic gemi kazasında hangi yolcuların hayatta kaldığını tahmin eden bir makine öğrenimi modeli oluşturmaktır. Ad, cinsiyet, yaş vb. gibi yolcu bilgilerini içeren bir veri kümesi kullanacağız. Kullanacağımız 2 farklı veri kümesi olacak. İlki 'train.csv' başlığını taşıyor. Bu veri kümesinde yolcu bilgilerinin yanı sıra 'survived' ve 'not survived' gibi gerçek değerler de bulunur. 'test.csv' başlıklı ikinci veri kümesinde ise, bunları bizim tahmin edip sonuçlarımızı göndermemiz istendiği için herhangi bir ground truth değeri yer almaz.

Gönderim dosyası yalnızca 2 sütun içerecektir: PassengerId ve Survived. 2’den fazla değer içeren bir dosya yüklemeye çalışırsanız gönderim sistemi hata üretir. Lütfen günde 10 gönderim yapabileceğinizi unutmayın.

"Competition Description" bölümünde verilen bilgilerle bir sonraki adım, verileri DataLab’e çekmek ve analiz etmektir.

Öncelikle Data sekmesine giderek (Şekil 5.5) Data Explorer’da veri kümesini indirmelisiniz. Hem 'train.csv' hem de 'test.csv' dosyalarını indirmelisiniz.

Dosyaları indirdikten sonra DataLab’e gitmelisiniz. Önce bir hesap oluşturmanız gerektiğini unutmayın. Hesap oluşturmak ve DataLab’i kullanmak ücretsizdir.

Dosyaları not defterinin sol tarafına kolayca sürükleyip bırakabilirsiniz (Şekil 5.6).

Şekil 5.5: Veri Kümesinin İndirilmesi
Şekil 5.6: Veri Kümesinin DataLab’e Eklenmesi

Bir sonraki adım, veri kümesi açıklamasındaki veri sözlüğünü kontrol etmektir. Bu, hangi sütunları görselleştireceğimize karar vermemize yardımcı olacaktır.

  • survival: Hayatta kalma
  • pclass: Bilet sınıfı
  • sex: Cinsiyet
  • Age: Yaş (yıl)
  • sibsp: Titanic’teki kardeş/eş sayısı
  • parch: Titanic’teki ebeveyn/çocuk sayısı
  • ticket: Bilet numarası
  • fare: Yolcu ücreti
  • cabin: Kamara numarası
  • embarked: Biniş limanı

Verilerin İçe Aktarılması

Jupyter not defterlerinde, hücrenin başına ünlem işareti koyarak bash komutlarını kullanabilirsiniz. Yüklenen veri kümesi dosyalarının konumunu pwd ve ls komutlarıyla kontrol edeceğiz.

!pwd; ls

/work/files/workspace

notebook.ipynb test.csv train.csv

Pandas, veriyi işleme ve veri analizi süreçlerinde kullanılan bir Python kütüphanesidir. Artık Ticket, Name ve PassengerId sütunlarını, anlamlı sayısal veya kategorik veri içermedikleri için kaldırdık. Şimdi kullanılacak diğer özellikleri görebileceksiniz.

Sonraki birkaç satırda eğitim ve test veri kümesi dosyaları Pandas’ın read_csv yöntemiyle okunur. Survived ve PassengerId sütunlarının sırasıyla train ve test veri çerçevelerine eklendiğine dikkat edin. Modeli, columns_to_be_added_as_features içindeki özellikleri ve Survived sütunundaki etiketleri ayrı ayrı kullanarak besleyeceğiz. Ancak ön işleme adımlarını basitleştirmek için şimdilik bunları birleştirebiliriz. test_df_matcher değişkeni PassengerId’yi de içerir. Bunu, PassengerId’yi test kümesi tahminleriyle eşleştirip Kaggle’a sonuç olarak yükleyeceğimiz CSV dosyasını üretmek için kullanacağız.

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]

head() yöntemiyle ilk 5 satırı, sütun adlarıyla birlikte görebiliriz. head() yönteminin içine parametre olarak kaç satır gösterileceğini belirleyebilirsiniz. Aşağıdaki hücrede eğitim ve test kümelerindeki satır sayıları sırasıyla yazdırılır.

print(train_df.head())
Şekil 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)))

Eğitim kümesindeki satır sayısı: 891 Test kümesindeki satır sayısı: 418

Ön İşleme

Modelde özellik olarak kullanılacak değerlerin türünü float’a dönüştürmeliyiz. Bu dönüşüm, veriyi normalize ederken bazı sayısal işlemleri yapmamıza olanak tanır.

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")

Modeli sayısal değerlerle beslememiz gerekir. Aşağıdaki kod parçasında dizgiler sayısal değerlere dönüştürülüyor

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())
Şekil 5.8: Sayısal Değerlerle Dataframe

Aşağıda tüm özellikler normalize ediliyor; bu durumda 0 ile 1 arasına ölçekleniyor demektir.

#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())
Şekil 5.9: Normalize Edilmiş Dataframe

Veri kümesi eğitim ve doğrulamaya bölüneceğinden, tek bir sette gruplaşmaları önlemek için önce veri kümesini karıştıracağız.

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

Tüm boş değerler 0 ile değiştirilecektir; bu tercih zaman kazandırmak amacıyla yapılmıştır. Ancak, eksik değerlerin makine öğreniminde nasıl ele alınacağını öğrenmek için bu eğitimi okuyabilirsiniz.

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

Aşağıda doğrulama oranı 0,2 olarak ayarlanmıştır; bu da verinin %20’sinin doğrulama için kullanılacağı anlamına gelir. Veri kümesini eğitim ve doğrulama setlerine ayırmak için Sklearn’in train_test_split yöntemini kullanacağız. Ardından, aşağıdaki kod parçasının son 4 satırında gösterildiği gibi özellikleri ve etiketleri ayıracağız.

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']]

Eğitim

Destek vektör makineleri, sınıflandırma ve regresyon analizi için kullanılan denetimli öğrenme modelleridir. Bu model aşağıdaki parametrelerle seçilmiştir. Farklı parametre kombinasyonlarıyla diğer modelleri de denemelisiniz. Bir parametreyi değiştirmek veya başka bir modeli denemek istediğinizde her seferinde kodu başlatıp durdurmanıza gerek yoktur; bu süreci otomatikleştirebilirsiniz. Destek Vektör Makineleriyle ilgileniyorsanız DataCamp’teki Scikit-learn ile Destek Vektör Makineleri eğitimine göz atabilirsiniz.

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)

Doğrulama Kümesi Tahminlerinin Alınması

Bu bölümde modele doğrulama kümesi özelliklerini verip tahminleri alacağız. Ardından bunları gerçek değerlerle karşılaştıracağız. Doğruluk hesabını kolaylaştırmak için Sklearn’in metrics.accuracy_score yöntemi kullanıldı. Doğrulama kümesi doğruluğu 0,799 olarak hesaplandı; bu iyi bir başlangıç.

from sklearn import metrics

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

Accuracy: 0.7988826815642458

Test Kümesi Tahminlerinin Alınması

Şimdi gerçek test kümesi için tahminleri almaya geçiyoruz. Test kümesi için gerçek değerler olmadığından, doğruluğu yalnızca tahmin dosyası Kaggle’a yüklendikten sonra öğrenebiliriz.

test_pred = svm_model.predict(test_df)

Çıktı DataFrame’inin Oluşturulması

PassengerId sütunu test_df_matcher adlı dataframe’den alınır. Doğrudan döndürüldüğünde dönüş değerinin türü Series olacaktır. Bu nedenle, bunu Pandas DataFrame türüne dönüştüreceğiz. Ardından test kümesi tahminlerini dataframe’in ikinci sütunu olarak ekleyeceğiz.

result = pd.DataFrame(test_df_matcher['PassengerId'])
print(result.head(10))
Şekil 5.10: PassengerId Dataframe’i
result.insert(1, "Survived", test_pred, True)
result["Survived"] = pd.to_numeric(result["Survived"], downcast="integer")
print(result.head(10))
Şekil 5.11: Son Haliyle Dataframe

Çıktı Dosyasının Oluşturulması

Son olarak çıktı formatı hazır. Son adımda index parametresine False vererek indeks değerleri kaldırılacaktır. Artık oluşturulan dosyayı indirip Kaggle’a yükleyebilirsiniz. Bu şekilde test kümesi doğruluğunu öğrenecek ve ardından sıralama tablosunda yerinizi alacaksınız.

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

Şimdi yarışma sayfasına dönüp "Submit Predictions" butonuna tıklayacak ve ardından tahmin dosyasını yükleyeceğiz. Birkaç saniye sonra test doğruluğunuzu alacaksınız (Şekil 5.12).

Şekil 5.12: Test Kümesinin Doğruluğu

Sonuç

Bu eğitimde bir veri kümesini nasıl analiz edeceğinizi ve sonuçlarınızı bir Kaggle yarışmasına nasıl göndereceğinizi öğrendiniz. Veri bilimi yarışmalarını seviyorsanız DataCamp Competitions hakkında daha fazla bilgiyi buradan edinebilirsiniz.

Konular

İlgili