前回、性別だけモデルでランダムフォレストで予想したところ、男性全員死亡、女性全員生存というずいぶんな結果になりました。
67日目 【Kaggle入門】ランダムフォレストを使ってみたが?
ランダムフォレストとはいったい何者なのか。
いろいろ実験してみました。
性別&クラスモデルの作成
前回作成した性別だけモデルにPclass
を加えます。
(前略)
#Dataframeを作る
#性別、等級
train_df = train_df.loc[:,['PassengerId','Survived','Sex','Pclass']]
test_df = test_df.loc[:,['PassengerId','Sex','Pclass']]
(以下同文)
その結果Public Score:0.75598
・・・下がりました。タイタニック (客船)のWikipediaをみる限りでは、等級ごとに死亡率は大きく異なるはずなのに、不思議です。
生存者と死者の割合のうち、三等船室を利用していた客の死者が多い。三等船室が下部の前方と後方に分断されて配置されており、沈没の際、前方の客室にいた客が脱出するためにはそのまま真上に上がるか、もしくはそのまま船体を突っ切って後方に移動してから真上に上がる2つの方法があった。ところが前者はその真上に一等船室があったためドアが施錠されており、後者の方法だけしかなかったのが、死者が増えた原因だという説もある。
(メモ)三等船室を前室と後室に分けられたら予測をあげられそうです。
クラスだけモデルを確認
(前略)
#Dataframeを作る
#等級
train_df = train_df.loc[:,['PassengerId','Survived','Pclass']]
test_df = test_df.loc[:,['PassengerId','Pclass']]
(以下同文)
Public Score:0.65550
さらに下がりました。おそらく、性別だけモデルのように、等級だけモデルでは0か1にまとめられている気がします。確かめてみます。
訓練データ
print(train_df.groupby(['Pclass','Survived']).count())
PassengerId
Pclass Survived
1 0 80
1 136
2 0 97
1 87
3 0 372
1 119
テストデータ
##確認のため予測結果(submission)にクラスを追加する。
submission['Pclass'] = test_df['Pclass']
print(submission.groupby(['Pclass','Survived']).count())
PassengerId
Pclass Survived
1 1 107
2 0 93
3 0 218
訓練データではクラスの中に0と1がありましたが
テストデータ(予測結果)は0か1にまとめられています。
ランダムフォレストは、訓練データの多い方に予測をまとめてしまうようです。
性別&クラスモデルを確認
訓練データ
print(train_df.groupby(['Sex','Pclass','Survived']).count())
PassengerId
Sex Pclass Survived
0 1 0 77
1 45
2 0 91
1 17
3 0 300
1 47
1 1 0 3
1 91
2 0 6
1 70
3 0 72
1 72
テストデータ
#確認のため予測結果(submission)に性別とクラスを追加する。
submission['Sex'] = test_df['Sex']
submission['Pclass'] = test_df['Pclass']
print(submission.groupby(['Sex','Pclass','Survived']).count())
PassengerId
Sex Pclass Survived
0 1 0 57
2 0 63
3 0 146
1 1 1 50
2 1 30
3 0 72
訓練データにあったばらつきが、テストデータではまとめられています。
ランダムフォレストは多い方にまとめてしまうようです。