1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

機械学習勉強記録 RandomForestClassifier

Last updated at Posted at 2021-06-23

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_testClassを推論します。

# 推論
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_testClass値が入ります。

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))

これで、求めることができました。

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?