random forest による分類

19
Random Forest for Classification 2016/2/24 Ken'ichi Matsui

Upload: kenichi-matsui

Post on 23-Jan-2017

1.889 views

Category:

Data & Analytics


0 download

TRANSCRIPT

Page 1: Random Forest による分類

Random Forest for Classification

2016/2/24Ken'ichi Matsui

Page 2: Random Forest による分類

決定木 Random Forest

特徴

• 分枝とノードのコストを鑑みて剪定を行う

• 剪定しない• データからサンプリングを行い

データを増やして学習する。• 各ノードで分割を行う際、ラン

ダムに特徴量を選択する

メリット• 分割基準が目に見えてわかり

やすいのでそこから知見も得られる

• 比較的早い

• 予測精度が高い• ランダム性を取り入れ分散を小

さく抑えられている

デメリット• 分散が大きくなりがち • 複数の木を使って構成されるの

で、分割基準は非常に見えずらい

• 比較的遅い

決定木と Random Forest の比較

Page 3: Random Forest による分類

特徴量: d 次元

特徴量: d 次元 特徴量: d 次元 特徴量: d 次元 特徴量: d 次元

データ数: N 個

データ数: N 個  ⇒ ただし、訓練データから重複ありでランダムサンプリングしたもの

ブートストラップサンプル 1ブートストラップサンプル 2

ブートストラップサンプル 3ブートストラップサンプル M

重複ありランダムサンプリング

ブートストラップサンプル数: M 個

訓練データブートストラップ法

Page 4: Random Forest による分類

特徴量: d 次元

ブートストラップサンプル 1

特徴量: d 次元

ブートストラップサンプル 2

特徴量: d 次元

ブートストラップサンプル 3

特徴量: d 次元

ブートストラップサンプル M

ブートストラップサンプル数: M 個

N 個

弱学習器1 弱学習器2 弱学習器3 弱学習器 M

Random Forest

木の深さ

Page 5: Random Forest による分類

木の深さ

特徴量: d 次元

ブートストラップサンプル 1

特徴量: d 次元

ブートストラップサンプル 2

特徴量: d 次元

ブートストラップサンプル 3

特徴量: d 次元

ブートストラップサンプル M

ブートストラップサンプル数: M 個

N 個

Random Forest

弱学習器1 弱学習器2 弱学習器3 弱学習器 M

( 決定 ) 木がたくさん集まっているので森!

Page 6: Random Forest による分類

Yes No

1 2 3 4 5 6 7 8 9 10

123456789

このノードはピンクのエリア

このノードはブルーのエリア

弱学習器の各ノードにおける分割 (2 次元の場合 )分割前の状態

※ 簡単化のため特徴量選択を  していないとする

Page 7: Random Forest による分類

取りうる分割 (2 次元の例 )

この赤い線が不純度を一番下げる分割

Page 8: Random Forest による分類

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

Page 9: Random Forest による分類

ブートストラップサンプル数: M 個

特徴量: d 次元

ブートストラップサンプル 1

特徴量: d 次元

ブートストラップサンプル 2

特徴量: d 次元

ブートストラップサンプル 3

特徴量: d 次元

ブートストラップサンプル MN 個 データの特徴量は d 次元なので各弱学習器の各ノード分割時に、 d 次元からd’ 個サンプリングしたデータから最良の分割点を探し出して分割する。( がよく使われる )

Random Forest の特徴量選択

Page 10: Random Forest による分類

ブートストラップサンプル数: M 個

特徴量: d 次元

ブートストラップサンプル 1

特徴量: d 次元

ブートストラップサンプル 2

特徴量: d 次元

ブートストラップサンプル 3

特徴量: d 次元

ブートストラップサンプル MN 個

Random Forest の特徴量選択

⇒ ランダムフォレストの  ランダムと言われる所以

データの特徴量は d 次元なので各弱学習器の各ノード分割時に、 d 次元からd’ 個サンプリングしたデータから最良の分割点を探し出して分割する。( がよく使われる )

Page 11: Random Forest による分類

弱学習器1 弱学習器2 弱学習器3 弱学習器 M

Random Forest (Classification)

インプット

「 B だ!」 「 A だ!」 「 B だ!」 「 B だ!」⇒ 多数決により” B” に決定。

Page 12: Random Forest による分類

ブートストラップで作成する木の数ノード分割時の不純度の計算種別

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

特徴量抽出の最大値設定

Page 13: Random Forest による分類

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

木の深さの最大値設定

ノード分割時の分割先の最小データ数

終端ノードの最小データ数

最大終端ノード数

ブートストラップサンプリング実行要否

終端ノードにおける最小分割比

Page 14: Random Forest による分類

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

木の構築時の詳細情報表示設定fit した時に前回のモデルを再利用する

各クラスにウェイトをかける

ブートストラップ、特徴量抽出の乱数シード設定

並列処理数の設定out-of-bag サンプルを評価に使うか否か

Page 15: Random Forest による分類

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 ( 手書き数字データ )

コードの全文はココ↓

Page 16: Random Forest による分類

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

Page 17: Random Forest による分類

拡大

MNIST 学習時の Random Forest 弱学習器の一部

拡大

Page 18: 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

Page 19: Random Forest による分類

参考• “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