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以上を狙おうと思います。
航海は続きます。