戦コンからDSへの転身なるか?

Dev, DS的な勉強と実践の継続の記録

Kaggle / Titanic - Machine Learning from Disaster / 独学 / とりあえず自分でやってみる Day6, 7

環境

Jupyter Lab / Local

今日やったこと

Day5でBest Scoreを更新して上位7.4%に入ったことに更に気をよくしてDay6は色々とやってみたが停滞。Day7では最初に現状のデータを、今まで生成してきた特徴量とともに眺めてみた。

Day5でのBest Scoreを叩き出したモデルの特徴量は'Sex', 'Pclass', 'TitleId', 'IsInfant'の4つ。性別、階級、家族的な要素が含まれたものになっていることに気づく。そして’Fare'については特徴量化していない。’Fare'も’Survived'と相関係数はまあまあ高いもののこれもモデルに入れると過学習が起こり、テストスコアが下がることも分かっている。

もう一度テーブルを眺めてみて、'Fare'を'FamiliSize(+1)'で割って'UnitFare'としてみたらどうだろうかと思いついた。

train_df_drpd['UnitFareBand'] = pd.cut(train_df_drpd['UnitFare'], 10)
train_df_drpd[['UnitFareBand', 'Survived']].groupby(['UnitFareBand'], as_index=False).mean().sort_values(by='UnitFareBand', ascending=True)

pandasの.cut()の変数を色々と変えて'Survived'の平均値を見てみたところ、'UnitFare'<50あたりで生存率が35%前後と極めて低くなることが分かった。

要するに1人あたりのチケット金額が50を超えている人は生き残る確率が高いということかなと。

ということで’IsLowUnitPrice'という特徴量を生成。

for dataset in combine:
    dataset.loc[dataset['UnitFare'] < 50, 'IsLowUnitFare'] = 0
    dataset.loc[dataset['UnitFare'] >= 50, 'IsLowUnitFare'] = 1

train_df_drpd['IsLowUnitFare'] = train_df_drpd['IsLowUnitFare'].astype(int)
test_df_drpd['IsLowUnitFare'] = test_df_drpd['IsLowUnitFare'].astype(int)

combine = [train_df_drpd, test_df_drpd]

Random Forestモデルに学習させてみたところ、モデルスコアは0.8114478114478114と、過学習も起こっていない悪くない数値(のような気がする)。結果…

submitスコア’0.79186'とベストを叩き出し、799 / 14,182で上位5.6%と更に高みへ。

所感

これが手探りで特徴量を作って手探りで組み合わせてモデルに学習している僕の今の限界かも…。

このあたりで独学を一度区切りとしてもう一度ネットの海から演繹的なお手本コードと解説を見ていこうかなと思います。

航海は続きます。