KaggleのTitanic予想。前回は全員生存モデル
とGender Based Model
(男性死亡・女性生存)を作りました。66日目 【Kaggle入門】一番カンタンなTitanic予想
今回は機械学習ということで、ランダムフォレストを使ってみました。
元ネタはこちら。KaggleのNotebookで一番人気のレシピです。Titanic Data Science Solutions
書いてあるのが英語なので、とりあえず上から下までざーっと眺めます。
結論、ランダムフォレストが一番使いやすかったようです。
さっそく前回のGender Based Model
を元に実行してみました。
###train.csv
とtest.csv
からデータを切り出します。
この辺は前回といっしょ。
import pandas as pd
# pandasでCSVを読み込む
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
#性別を男0女1に変換
train_df.replace({'Sex': {'male': 0, 'female': 1}}, inplace=True)
test_df.replace({'Sex': {'male': 0, 'female': 1}}, inplace=True)
#Dataframeを作る
train_df = train_df.loc[:,['PassengerId','Survived','Sex']]
test_df = test_df.loc[:,['PassengerId','Sex']]
###訓練用データから予測モデルを作ります。
・訓練用データtrain.csv
を説明変数(x)と目的変数(y)に縦割りします。
・さらに擬似訓練データ(X_train, y_train)と擬似テストデータ((X_valid, y_valid)に横割りします。
#ベースラインモデルの構築
#データ分割のモジュールをインポート
from sklearn.model_selection import train_test_split
#訓練用データを元データから切り出して、.valuesでnumpy.ndarray型に変換する
X = train_df.iloc[:, 2:].values #原因となる要素群
y = train_df.iloc[:, 1].values #結果
#テストデータ
X_test = test_df.iloc[:, 1:].values #原因となる要素群
#訓練用データを分割して予測モデルを作る
#データの分割には、scikit-learnのtrain_test_split関数を使用
#分割をランダムにするシード値を42にする(銀河ヒッチハイクガイドによる)
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.3, random_state=42)
####擬似訓練データで学習させ、予測モデルをつくります。
予測モデルで擬似テストデータを予測します。
結果のスコアが近いほどいい予測モデルとされています。
訓練データのスコアが良すぎる過学習や、低すぎる学習不足の場合は予測モデルを見直します。
#ランダムフォレストで予測モデルを作成する
from sklearn.ensemble import RandomForestClassifier
#擬似訓練データを学習し予測モデルを作成する。
rfc = RandomForestClassifier(n_estimators=100)
rfc.fit(X_train, y_train)
#擬似訓練データX_train, y_train)のスコアを見る
print('Train Score: {}'.format(round(rfc.score(X_train, y_train), 3)))
#擬似テストデータ(X_valid, y_valid)のスコアを見る
print(' Test Score: {}'.format(round(rfc.score(X_valid, y_valid), 3)))
####擬似訓練スコアと擬似テストスコアを確認します。
Train Score: 0.785
Test Score: 0.791
今回の結果は・・・いいんでしょうか、どうなんでしょうか。人間が学習不足ですね。
まあともかくモデルができたし予測してみましょう。
###作成した予測モデルでテストデータを予測します。
#作成した予測モデル( rfc.predict)でテストデータ(X_test)を予測する
y_pred = rfc.predict(X_test)
#結果をPandasデータフレームに変換する。
submission = pd.DataFrame({
"PassengerId": test_df["PassengerId"],
"Survived": y_pred
})
#CSVに出力する。
submission.to_csv('titanic1-2.csv', index=False)
#完成!
さっそくKaggleにアップします。
Public Score:0.76555
???
これは前回の男性死亡女性生存モデルと同じ結果です。
CSVファイルを確認すると確かにまったく同一でした。
元データのtrain.csvを見ると、女性の生存率は75%、男性は18%なので、ある程度は異なる予測がでると思っていたので以外でした。
予測モデルは890件のtrain.csvを7:3分けにした600件余りのデータを元にしました。予測に十分な数に足りていないのかもしれません。あるいは、ランダムフォレストはあいまいな予測が苦手なのかもしれませんし、もしかしたらどこかでコーディングを間違っているのかもしれません。
この辺、ちょっとよくわからないので保留にします。