satopoooonのブログ

自分向けの備忘録

kaggleに挑戦 その2 ランダムフォレスト

はじめに

ランダムフォレストを使って、

タイタニック号のデータをモデル化します。
 

ランダムフォレストって何?

ランダムフォレストは、複数の決定木を組み合わせて、
各決定木における予想結果の多数決により、結果を得ます。

アルゴリズムとしては、
1.ランダムにn個のデータを抽出、
2.1で取得したデータから決定木を成長、
3.1と2を複数回繰り返す、
4.予想結果を多数決する、

タイタニック号のデータに適用する。

まずは、簡単にするため、
説明変数を"Age"、"Pclass"、"Sex"に絞ろうと思います。

目的変数"Survived"と相関があるか調べます。

#必要なモジュールインポート
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#データの読み込み
titanic_df = pd.read_csv("train.csv")
titanic_df.info()

sns.factorplot("Pclass","Survived",data = titanic_df_main, hue = "Sex")
sns.lmplot('Age','Survived',data=titanic_df)


f:id:satopoooon:20171207215620p:plain

データの可視化には、seabornというライブラリを使ってます。
factorplot した歳の、データ点は平均値、誤差棒は標準誤差分です。
男性、3等客室は亡くなった方が多いことがわかります。

f:id:satopoooon:20171207225108p:plain

近似直線を引くと、右肩下がりになっています。
年齢が高い方が、亡くなった方が多いことがわかります。

"Age"、"Pclass"、"Sex"は説明変数として使えそうですね。

続いて、解析する前にデータを整形します。
"Age"には欠損値が多く、そのままではデータ解析できません。
欠損値を中央値で置き換えることにします。

titanic_df_main["Age"].fillna(titanic_df_main["Age"].median(),inplace = True)

続いて、"Sex"をダミー変数に変えます。

dummy = pd.get_dummies(data = titanic_df_main["Sex"],drop_first=True)
titanic_df_main = titanic_df_main.combine_first(dummy)


ダミー変数は、オプションとして、「drop_fisrt = True 」とすると第1項を落としてくれます。
説明変数としてダミー変数を使う場合、多重共線性から上記を実施する必要があります。

続いてscikit-learnのランダムフォレストを利用して、実装していきます。

ランダムフォレストを実装

ランダムフォレストの代表的パラメーターとしては、以下3種類です。
1.ランダムに選ぶデータの数
2.説明変数の数(木の深さ)
3.決定木の数
1と2に関しては、デフォルト値を採用します。

尚、1のデフォルト値はデータ数になります。
データは、復元抽出で選ばれるので、すべてのデータが使われるわけではありません。
2のデフォルト値は、説明変数のルートをとったものです。
3はとりあえずn=100とします。

titanic_df_main_random_forest = titanic_df_main.drop(["PassengerId","Sex"],axis = 1 )
train_data = titanic_df_main_random_forest.values
x_train =  train_data[:,[0,1,3]]
y_train = train_data[:,2]
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion = "entropy", n_estimators = 100)

これでランダムフォレストを実装できました。
決定木の数に関しては、当然数が多いと性能はよくなりますが、計算コストが増えます。
これはグリッドサーチにより決めれば良いと思います。
次はグリッドサーチとランダムフォレストの結果について書こうと思います。