LoginSignup
0
1

More than 3 years have passed since last update.

67日目 【Kaggle入門】ランダムフォレストを使ってみたが?

Last updated at Posted at 2020-01-19

KaggleのTitanic予想。前回は全員生存モデルGender Based Model(男性死亡・女性生存)を作りました。66日目 【Kaggle入門】一番カンタンなTitanic予想 

今回は機械学習ということで、ランダムフォレストを使ってみました。
元ネタはこちら。KaggleのNotebookで一番人気のレシピです。Titanic Data Science Solutions

書いてあるのが英語なので、とりあえず上から下までざーっと眺めます。
結論、ランダムフォレストが一番使いやすかったようです。

さっそく前回のGender Based Modelを元に実行してみました。


train.csvtest.csvからデータを切り出します。

この辺は前回といっしょ。

11.py
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)に横割りします。

12.py
#ベースラインモデルの構築
#データ分割のモジュールをインポート
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)

擬似訓練データで学習させ、予測モデルをつくります。

予測モデルで擬似テストデータを予測します。
結果のスコアが近いほどいい予測モデルとされています。
訓練データのスコアが良すぎる過学習や、低すぎる学習不足の場合は予測モデルを見直します。

13.py
#ランダムフォレストで予測モデルを作成する
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

今回の結果は・・・いいんでしょうか、どうなんでしょうか。人間が学習不足ですね。
まあともかくモデルができたし予測してみましょう。

作成した予測モデルでテストデータを予測します。

14.py
#作成した予測モデル( 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件余りのデータを元にしました。予測に十分な数に足りていないのかもしれません。あるいは、ランダムフォレストはあいまいな予測が苦手なのかもしれませんし、もしかしたらどこかでコーディングを間違っているのかもしれません。

この辺、ちょっとよくわからないので保留にします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1