ランダムフォレスト(機械学習)を使って、タイタニックで生き残れるかどうか予測する。
先の決定木を、たくさん用意して判定するから、ランダムフォレストらしい。
1, データの1/3しか使わない。残り2/3は同じデータで水増し。たくさん用意する事で過学習防止で予測精度が上がるらしい。
2, 特徴点も全部使わない。平方根個だけ(全部で16なら4個だけ。9なら3個だけ)
こうやって個性の違う決定木を100個以上使って、それぞれの結論を多数決(分類)・平均(回帰)で判定するらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import seaborn as sns # データ・ライブラリ。 import pandas as pd # DataFrame # 機械学習ライブラリ from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # タイタニックのデータを取得して、データフレームに格納 df = sns.load_dataset('titanic') # カラム毎にNaNじゃないレコード数をカウント # df.count() # ランダムフォレストでは欠損値(NaN)は扱えないので、変換する df.isnull().sum() # survived 0 # pclass 0 # sex 0 # age 177 # sibsp 0 # parch 0 # fare 0 # embarked 2 # class 0 # who 0 # adult_male 0 # deck 688 # embark_town 2 # alive 0 # alone 0 # dtype: int64 # 年齢が不明の場合は、平均年齢で上書き(けっこう雑だな…。) age_mean = df['age'].mean() df['age'] = df['age'].fillna(age_mean) # 正解カラムを削ってから学習データにする(なんで二個あるの?) df_x = df.drop(['survived','alive'], axis=1) df_y = df['survived'] # get_dummiesで文字列型のデータを数値型(0-1)に変換します df_x = pd.get_dummies(df_x) # データを、学習用データ(train)と検証テスト用データ(test)に分ける。 test_size=0.25がデフォ # xがその人の色々な要素。yがsurvived(生き残れたら1, 死んだら0) train_x, test_x, train_y, test_y = train_test_split(df_x,df_y,random_state=1) # ランダムフォレスト・モデルを生成(決定木200個、デフォは10。) model = RandomForestClassifier(n_estimators=300,random_state=1) # 機械学習、開始! model.fit(train_x, train_y) # 25%残しておいた検証テスト用データ(test_x)を使って、その人たちが生き残れるかどうか予測する model.predict(test_x) # 答え合わせして、スコア(正解率)を出してみる。 model.score(test_x,test_y) |
なぜか、決定木の方が予測精度が高い…。
ランダムフォレスト: 0.757847533632287
決定木: 0.8071748878923767
1 2 3 4 5 6 7 8 9 10 |
from sklearn.ensemble import RandomForestClassifier model_randomforest = RandomForestClassifier(n_estimators=300,random_state=1) model_randomforest.fit(train_x,train_y) from sklearn import tree model_tree = tree.DecisionTreeClassifier(max_depth=5, random_state=1) model_tree.fit(train_x, train_y) print('ランダムフォレスト:',model_randomforest.score(test_x,test_y)) print('決定木:',model_tree.score(test_x,test_y)) |