Kaggle(22) - タイタニック(Titanic)コンペに初めての提出

前回記事の3分割交差検証で、正解率90%となかなかの好成績となったので試しにタイタニックコンペに参加してみます。

(KaggleのNotebook環境で実行しています。)


データ読み込み

まずは、Kaggleに準備されているタイタニックの訓練データを読み込みます。

[ソース]

1
2
3
4
5
import numpy as np
import pandas as pd

df_train = pd.read_csv('/kaggle/input/titanic/train.csv')
df_train

[出力結果]


前処理

前処理として、不要列の削除・カテゴリ変数の変換を行います。

(LightGBMでは欠損値処理が不要とのことなので、今回欠損値処理は行いませんでした。)

[ソース]

1
2
3
4
5
6
7
8
9
10
11
# 不要な列の削除
df_train.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)

# 欠損値処理
# df_train['Age'] = df_train['Age'].fillna(df_train['Age'].median())
# df_train['Embarked'] = df_train['Embarked'].fillna('S')

# カテゴリ変数の変換
df_train = pd.get_dummies(df_train, columns=['Sex', 'Embarked'])

df_train

[出力結果]

訓練データを、生存(正解ラベル)とそれ以外に分割しておきます。

[ソース]

1
2
x_titanic = df_train.drop(['Survived'], axis=1)
y_titanic = df_train['Survived']

分割交差検証で学習

前回記事と同様にLightGBNアルゴリズムの3分割交差検証を使って、学習を行います。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import lightgbm as lgb
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold

# 3分割交差検証を指定しインスタンス化する
kf = KFold(n_splits=3, shuffle=True)

# スコアとモデルを格納するリスト
score_list = []
models = []

for fold_, (train_index, valid_index) in enumerate(kf.split(x_titanic, y_titanic)):
print(f'fold{fold_ + 1}start')
train_x = x_titanic.iloc[train_index]
valid_x = x_titanic.iloc[valid_index]
train_y = y_titanic.iloc[train_index]
valid_y = y_titanic.iloc[valid_index]

# lab.Datasetを使って、trainとvalidを作っておく
lgb_train = lgb.Dataset(train_x, train_y)
lgb_valid = lgb.Dataset(valid_x, valid_y)

# パラメータを定義
lgbm_params = {'objective': 'binary'}

# lgb.trainで学習
evals_result = {}
gbm = lgb.train(params=lgbm_params,
train_set=lgb_train,
valid_sets=[lgb_train, lgb_valid],
early_stopping_rounds=20,
evals_result=evals_result,
verbose_eval=-1) # 学習の状態を表示しない
# valid_xについて推論
oof = (gbm.predict(valid_x) > 0.5).astype(int)
score_list.append(round(accuracy_score(valid_y, oof) * 100, 2))
# 学習が終わったモデルをリストに入れておく
models.append(gbm)
print(f'fold_{fold_ + 1} end\n')

print(score_list, '平均score', round(np.mean(score_list), 2))

[出力結果]

平均スコアは82.04%となりました。


学習済みモデルを使って推論

学習済みモデルを使って、推論を行います。

3回推論を行い予測した生存の平均が0.5より大きい場合に、生存している(1)と予測します。

[ソース]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 検証データの読み込み
df_test = pd.read_csv('/kaggle/input/titanic/test.csv')
df_test.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
df_test = pd.get_dummies(df_test, columns=['Sex', 'Embarked'])

# テストデータの予測を格納する行列を作成
test_pred = np.zeros((len(df_test), 3))

for fold, gbm in enumerate(models):
test_pred[:, fold] = gbm.predict(df_test)

result = pd.DataFrame(df_test['PassengerId'])
# 平均が0.5より大きい場合,1(生存)とする
result['Survived'] = (np.mean(test_pred, axis=1) > 0.5).astype(int)
result
result.to_csv('result.csv', index=False)


提出用に作成したcsvファイルは下記のようなフォーマットになります。

[出力結果]


結果提出

予測したcsvファイルを提出(submit)してみます。

[提出結果]

提出結果は75.56%という正解率になりました。

もう少しいい成績なると思っていたのですが、残念です。