random forest による分類
TRANSCRIPT
Random Forest for Classification
2016/2/24Ken'ichi Matsui
決定木 Random Forest
特徴
• 分枝とノードのコストを鑑みて剪定を行う
• 剪定しない• データからサンプリングを行い
データを増やして学習する。• 各ノードで分割を行う際、ラン
ダムに特徴量を選択する
メリット• 分割基準が目に見えてわかり
やすいのでそこから知見も得られる
• 比較的早い
• 予測精度が高い• ランダム性を取り入れ分散を小
さく抑えられている
デメリット• 分散が大きくなりがち • 複数の木を使って構成されるの
で、分割基準は非常に見えずらい
• 比較的遅い
決定木と Random Forest の比較
…
特徴量: d 次元
特徴量: d 次元 特徴量: d 次元 特徴量: d 次元 特徴量: d 次元
データ数: N 個
データ数: N 個 ⇒ ただし、訓練データから重複ありでランダムサンプリングしたもの
ブートストラップサンプル 1ブートストラップサンプル 2
ブートストラップサンプル 3ブートストラップサンプル M
重複ありランダムサンプリング
ブートストラップサンプル数: M 個
訓練データブートストラップ法
…
…
特徴量: d 次元
ブートストラップサンプル 1
特徴量: d 次元
ブートストラップサンプル 2
特徴量: d 次元
ブートストラップサンプル 3
特徴量: d 次元
ブートストラップサンプル M
ブートストラップサンプル数: M 個
N 個
弱学習器1 弱学習器2 弱学習器3 弱学習器 M
Random Forest
木の深さ
木の深さ
…
特徴量: d 次元
ブートストラップサンプル 1
特徴量: d 次元
ブートストラップサンプル 2
特徴量: d 次元
ブートストラップサンプル 3
特徴量: d 次元
ブートストラップサンプル M
ブートストラップサンプル数: M 個
N 個
Random Forest
…
弱学習器1 弱学習器2 弱学習器3 弱学習器 M
( 決定 ) 木がたくさん集まっているので森!
Yes No
1 2 3 4 5 6 7 8 9 10
123456789
このノードはピンクのエリア
このノードはブルーのエリア
弱学習器の各ノードにおける分割 (2 次元の場合 )分割前の状態
※ 簡単化のため特徴量選択を していないとする
取りうる分割 (2 次元の例 )
この赤い線が不純度を一番下げる分割
axis value ratio_l gini_l ratio_r gini_r ave gini gini
x 1.8 0.111 0.000 0.889 0.469 0.417
x 2.45 0.222 0.000 0.778 0.408 0.317
x 3.0 0.333 0.000 0.667 0.278 0.185x 4.2 0.444 0.375 0.556 0.320 0.344
x 5.75 0.556 0.480 0.444 0.375 0.433
x 6.8 0.667 0.444 0.333 0.000 0.296
x 7.9 0.778 0.490 0.222 0.000 0.381
x 8.85 0.889 0.500 0.111 0.000 0.444
y 1.05 0.111 0.000 0.889 0.469 0.417
y 1.85 0.222 0.500 0.778 0.490 0.492
y 2.6 0.333 0.444 0.667 0.444 0.444
y 3.6 0.444 0.375 0.556 0.320 0.344
y 4.8 0.556 0.480 0.444 0.375 0.433
y 5.95 0.667 0.500 0.333 0.444 0.481
y 6.65 0.778 0.490 0.222 0.000 0.381
y 7.5 0.889 0.500 0.111 0.000 0.444
取りうる分割 (2 次元の例 )不純度の計算 (gini 係数 )
ブートストラップサンプル数: M 個
…
…
特徴量: d 次元
ブートストラップサンプル 1
特徴量: d 次元
ブートストラップサンプル 2
特徴量: d 次元
ブートストラップサンプル 3
特徴量: d 次元
ブートストラップサンプル MN 個 データの特徴量は d 次元なので各弱学習器の各ノード分割時に、 d 次元からd’ 個サンプリングしたデータから最良の分割点を探し出して分割する。( がよく使われる )
Random Forest の特徴量選択
ブートストラップサンプル数: M 個
…
…
特徴量: d 次元
ブートストラップサンプル 1
特徴量: d 次元
ブートストラップサンプル 2
特徴量: d 次元
ブートストラップサンプル 3
特徴量: d 次元
ブートストラップサンプル MN 個
Random Forest の特徴量選択
⇒ ランダムフォレストの ランダムと言われる所以
データの特徴量は d 次元なので各弱学習器の各ノード分割時に、 d 次元からd’ 個サンプリングしたデータから最良の分割点を探し出して分割する。( がよく使われる )
…
弱学習器1 弱学習器2 弱学習器3 弱学習器 M
Random Forest (Classification)
インプット
「 B だ!」 「 A だ!」 「 B だ!」 「 B だ!」⇒ 多数決により” B” に決定。
ブートストラップで作成する木の数ノード分割時の不純度の計算種別
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
特徴量抽出の最大値設定
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
木の深さの最大値設定
ノード分割時の分割先の最小データ数
終端ノードの最小データ数
最大終端ノード数
ブートストラップサンプリング実行要否
終端ノードにおける最小分割比
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
木の構築時の詳細情報表示設定fit した時に前回のモデルを再利用する
各クラスにウェイトをかける
ブートストラップ、特徴量抽出の乱数シード設定
並列処理数の設定out-of-bag サンプルを評価に使うか否か
Scikit-Learn と MNIST で試す Random Forest
https://github.com/matsuken92/Qiita_Contents/blob/master/General/Decision_tree.ipynb
# Random Forestによるモデル構築clf = RandomForestClassifier(n_estimators=50, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, bootstrap=True, oob_score=False, n_jobs=2, random_state=None, verbose=0, warm_start=False, class_weight=None)clf = clf.fit(x_train, y_train)
# 訓練データでの精度確認print "train"confirm_result(clf, x_train, y_train)
classification report precision recall f1-score support
0 1.00 1.00 1.00 5923 1 1.00 1.00 1.00 6742 2 1.00 1.00 1.00 5958 3 1.00 1.00 1.00 6131 4 1.00 1.00 1.00 5842 5 1.00 1.00 1.00 5421 6 1.00 1.00 1.00 5918 7 1.00 1.00 1.00 6265 8 1.00 1.00 1.00 5851 9 1.00 1.00 1.00 5949
avg / total 1.00 1.00 1.00 60000
accuracy0.999983333333
MNIST ( 手書き数字データ )
コードの全文はココ↓
https://github.com/matsuken92/Qiita_Contents/blob/master/General/Decision_tree.ipynb
# 検証データでの精度確認print "test"confirm_result(clf, x_test, y_test)
testconfusion matrix[[ 969 0 2 0 0 2 3 1 3 0] [ 0 1122 3 3 1 1 2 0 3 0] [ 5 0 999 6 2 0 4 9 7 0] [ 1 0 10 973 0 7 0 8 8 3] [ 1 0 1 0 947 0 7 0 4 22] [ 4 2 1 14 3 854 5 1 7 1] [ 6 3 1 0 3 5 936 0 4 0] [ 1 3 20 2 3 0 0 989 3 7] [ 5 0 5 8 5 7 4 4 929 7] [ 7 6 3 12 15 3 1 5 4 953]]
classification report precision recall f1-score support
0 0.97 0.99 0.98 980 1 0.99 0.99 0.99 1135 2 0.96 0.97 0.96 1032 3 0.96 0.96 0.96 1010 4 0.97 0.96 0.97 982 5 0.97 0.96 0.96 892 6 0.97 0.98 0.97 958 7 0.97 0.96 0.97 1028 8 0.96 0.95 0.95 974 9 0.96 0.94 0.95 1009
avg / total 0.97 0.97 0.97 10000
accuracy0.9671
Scikit-Learn と MNIST で試す Random Forest
拡大
MNIST 学習時の Random Forest 弱学習器の一部
拡大
Random Forest の類似度の算出と MDS による2次元可視化元データ (iris) のプロット データ類似度のプロット
※ 類似度の計算は R じゃないとできませんでした・・・
require(rfPermute)data(iris)iris.rf <- randomForest(Species ~ ., data = iris, importance = TRUE, proximity = TRUE)iris.rfproximity.plot(iris.rf, legend.loc = "topleft")
http://www.inside-r.org/packages/cran/rfPermute/docs/proximity.plot
参考• “Intuition of Random Forest”
https://stat.ethz.ch/education/semesters/ss2012/ams/slides/v10.2.pdf• Scikit-Learn RandomForestClassifier
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
• 「初めてのパターン認識」平井 有三 ( 著 )http://www.amazon.co.jp/dp/4627849710
• 本スライドで使った Python コードhttps://github.com/matsuken92/Qiita_Contents/blob/master/General/Decision_tree.ipynb