1 RandomForestClassifierとは
RandomForestClassifierとは、複数の決定木を集めたものです。だから森なんですね。
アンサンブル学習と言って、別々の決定木が出した結果を統一させて総合的な分析結果を得ることができるものです。
このサイトがわかりやすかったです。
「cacoo」決定木分析(ディシジョンツリー)とは?概要や活用方法、ランダムフォレストも解説
https://cacoo.com/ja/blog/what-is-decision-tree/
2 RandomForestClassifierの実装
データフレーム(df)のデータ部分と目標値部分(column名はClass)をx,tとして、モデルを学習させる時は、このように書きます。
x = df.drop('Class', axis=1).values
t = df['Class'].values
# モデルの定義
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=0)
model.fit(x, t)
そして、学習したモデルをもとにdf_test
のClass
を推論します。
# 推論
x_test = df_test.drop('Class', axis=1).values
t_test = df_test['Class'].values
y_pred = model.predict(x_test)
これでy_pred
の中に、x,tで学習したモデルによって推論された、df_test
のClass
値が入ります。
2.1 混合行列を表示する
混合行列を sklearn.metrics
を用いて表示します。
from sklearn import metrics
# 混同行列の作成
labels = list(set(t))
c_matrix = metrics.confusion_matrix(t_test, y_pred, labels=labels)
# DataFrameに整形
df_matrix = pd.DataFrame(c_matrix, columns=labels, index=labels)
2.2 precision, recall, F値を調べる
それぞれのスコアは、metrics
モジュール内の関数に目標値と予測値を渡すことで確認できます。
precision = metrics.precision_score(t_test, y_pred, average=None)
recall = metrics.recall_score(t_test, y_pred, average=None)
f1_score = metrics.f1_score(t_test, y_pred, average=None)
average=None
と指定することで、それぞれのクラスを正例としたスコアを確認することができます。
3 閾値の設定
precision, recall, F値を調整するために、予測確率における分類の閾値を調整します。
y_proba = model.predict_proba(x_test)
これで、x_test
の一つ一つの行に対してのClass=0
である確率とClass=1
である確率を求め、y_proba
に代入します。元のデータにもよりますが、中身はこんな感じです。この例だと1列目の数字がClass=0
である確率で、2列目の数字がClass=1
である確率です。
# y_probaを10行目まで表示
print(y_proba[:10])
"""
array([[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[0.97, 0.03],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ],
[1. , 0. ]])
"""
そして、この2列目の数字に対して、閾値をもうけ、調整していきます。
# 閾値0.4として、y_probaの2列目が0.4を超える場合、Trueと返す行列をy_predに代入
y_pred = (y_proba[:,1] > 0.4).astype('i')
# .astype('i')はデータ型をintに変えている。 Falseなら 0, Trueなら 1 に変換する。
こうして閾値を調整して、最終的にprecision, recall, F値を調べます。
# 「t_testに対してのy_predの予測」のrecall, precision, f1score を表示する
print('recall :', metrics.recall_score(t_test, y_pred, average=None))
print('precision :', metrics.precision_score(t_test, y_pred, average=None))
print('f1score :', metrics.f1_score(t_test, y_pred, average=None))
これで、求めることができました。