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)
データの可視化には、seabornというライブラリを使ってます。
factorplot した歳の、データ点は平均値、誤差棒は標準誤差分です。
男性、3等客室は亡くなった方が多いことがわかります。
近似直線を引くと、右肩下がりになっています。
年齢が高い方が、亡くなった方が多いことがわかります。
"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)
これでランダムフォレストを実装できました。
決定木の数に関しては、当然数が多いと性能はよくなりますが、計算コストが増えます。
これはグリッドサーチにより決めれば良いと思います。
次はグリッドサーチとランダムフォレストの結果について書こうと思います。