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

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

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

環境

Jupyter Lab / Local

今日やったこと

Day4で'IsInfant'と特徴量として加えることで上位26.4%に入ったのに気を良くして、'SibSp'と'Parch'を加算した'FamilySize'を生成。Survivedの平均値を算出。

for dataset in combine:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch']
train_df_drpd[['FamilySize', 'Survived']].groupby(['FamilySize'], as_index=False).mean().sort_values(by='FamilySize', ascending=True)

自分以外に親族が1〜3人いる場合に生存率が約55〜72%となることに注目。その場合をに1をフラグとして建てる特徴量'IsSmallFamily'を生成。

for dataset in combine:
    dataset.loc[(dataset['FamilySize'] >= 1) & (dataset['FamilySize'] <= 3), 'IsSmallFamily'] = 1
    dataset.loc[(dataset['FamilySize'] < 1) | (dataset['FamilySize'] >= 4), 'IsSmallFamily'] = 0

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

combine = [train_df_drpd, test_df_drpd]

Day4で良い結果を出した’Sex’, 'Pclass', 'IsInfant'に'IsSmallFamily'を加えてRandom Forestで学習。

t = train_df_drpd['Survived'].values
x = train_df_drpd[['Sex', 'Pclass', 'IsInfant', 'IsSmallFamily']].values
x_test = test_df_drpd[['Sex', 'Pclass', 'IsInfant', 'IsSmallFamily']].values

rf.fit(x, t)
pred_rf = rf.predict(x_test)
rf.score(x, t)

モデルのスコアは'0.813692480359147'と悪くないものの、submitした結果は’0.77272’とDay4の結果に及ばず。

次に、'FamilySize'が0となる場合に1をフラグとして建てる特徴量'IsSingle'を生成。

for dataset in combine:
    dataset.loc[dataset['FamilySize'] == 0, 'IsSingle'] = 1
    dataset.loc[dataset['FamilySize'] != 0, 'IsSingle'] = 0

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

combine = [train_df_drpd, test_df_drpd]

モデルのスコアは’0.8204264870931538’となるものの、submitした結果は’0.77272’と先ほどと全く同じ。

ここで基本に立ち返る意味で相関変数をもう一度見直してみる。

train_df_drpd_corr = train_df_drpd.corr()
print(train_df_drpd_corr)

submitしたスコアが良い特徴量である'Sex', 'Pclass', 'IsInfant'は目的変数'Survived'に対して良い相関係数が出ている。よく見ると’TitleId'も高い。そう言えば…この4つの特徴量で学習させていなかった、ことに気づく。

t = train_df_drpd['Survived'].values
x = train_df_drpd[['Sex', 'Pclass', 'IsInfant', 'TitleId']].values
x_test = test_df_drpd[['Sex', 'Pclass', 'IsInfant', 'TitleId']].values

rf.fit(x, t)
pred_rf = rf.predict(x_test)
rf.score(x, t)

学習したモデルのスコアは'0.8080808080808081', これは過学習も効いていない感じの良い数値では?(感覚です…)

結果、submitスコア’0.78947'とベストスコアを叩き出し、1,038 / 14,269で上位7.2%を記録!!!

所感

アイヤー、こんな簡単なことだったのね…。

僕が組み合わせた特徴量は'IsInfant'だけなので、Day6では'FamilySize'の解読からの'Survived'に影響の強い特徴量を掴みに行きSubmitスコア0.8以上を狙おうと思います。

航海は続きます。