KaggleのTitanicのチュートリアルをXGBoostで解く

machinelearningpython

XGBoostは高性能なGradient Boostingのライブラリ。 Boostingというのはアンサンブル学習の種類の一つで、ランダムフォレストのように弱学習器をそれぞれ並列に学習するBaggingに対して、 順番に前回までの結果を受けながら学習し、結果をまとめる際にそれぞれの重みを掛けるもの。 XGBoostではランダムフォレストと同様に決定木を弱学習器とする。

KaggleのTitanicのチュートリアルをランダムフォレストで解く - sambaiz-net

$ pip install xgboost

XGBoostは欠損値をそのまま扱うこともできるが、今回は以前と同じようにデータの前処理を行った。 パラメータの objective(目的関数)には二値分類なので binary:logistic を指定し、確率が返るのでroundして出力している。

import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

def preprocess(df):
    df['Fare'] = df['Fare'].fillna(df['Fare'].mean())
    df['Age'] = df['Age'].fillna(df['Age'].mean())
    df['Embarked'] = df['Embarked'].fillna('Unknown')
    df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
    df['Embarked'] = df['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2, 'Unknown': 3} ).astype(int)
    df = df.drop(['Cabin','Name','PassengerId','Ticket'],axis=1)
    return df

def train(df):
    train_x = df.drop('Survived', axis=1)
    train_y = df.Survived
    (train_x, test_x ,train_y, test_y) = train_test_split(train_x, train_y, test_size = 0.6, random_state = 42)
    dtrain = xgb.DMatrix(train_x, label=train_y)
    param = {'max_depth':3, 'learning_rate': 0.6, 'objective':'binary:logistic' }
    num_round = 2
    bst = xgb.train(param, dtrain, num_round)
    preds = bst.predict(xgb.DMatrix(test_x))
    print(accuracy_score(preds.round(), test_y))

    return bst

def predict(bst, df):
    return bst.predict(xgb.DMatrix(df))

df = pd.read_csv('./train.csv')
df_test_origin = pd.read_csv('./test.csv')
df = preprocess(df)
df_test = preprocess(df_test_origin)
bst = train(df)
answer = predict(bst, df_test).round().astype(int)
submit_data =  pd.Series(answer, name='Survived', index=df_test_origin['PassengerId'])
submit_data.to_csv('submit2.csv', header=True)

精度は0.78ほど。

スコアと順位

参考

ブースティング入門