Slide 1

Slide 1 text

scikit-learnとTensorFlowによる 実践機械学習 7 解説 @Linus_MK 2018年7月13日

Slide 2

Slide 2 text

自己紹介 ライナス(@Linus_MK) 業務は音声系のソフト開発 C/C++ 機械学習は学校で少しやった+趣味でやっている程度 2

Slide 3

Slide 3 text

目次 7.1 投票分類器 7.2 バギングとペースティング 7.3 ランダムパッチとランダムサブスペース 7.4 ランダムフォレスト 7.5 ブースティング 7.6 スタッキング 3

Slide 4

Slide 4 text

アンサンブル学習 複数の予測器を組み合わせて、精度を上げること 4

Slide 5

Slide 5 text

投票分類器 分類問題において… ハード投票 それぞれの分類器の結果の「多数決」で決める ソフト投票 それぞれの分類器の結果の確率の平均から 最終結果を求める 分類器の確信度を反映するので、ハード投票よりも性能が高い 投票分類器はそれぞれの分類器の無相関性が重要 5

Slide 6

Slide 6 text

バギング・ペースティング 予測器のアルゴリズムは同一 訓練セットからサブセットをサンプリングする すべての予測器の結果を求めて 集計 分類:最頻値 回帰:平均 バギングとペースティングの違い: バギングは同じインスタンスを複数回選ぶ ペースティングは同じインスタンスを複数回選ばない 6

Slide 7

Slide 7 text

scikit-learnにおけるバギング bag_clf = BaggingClassifier( DecisionTreeClassifier(random_state=42), n_estimators=500, max_samples=100, bootstrap=True, n_jobs=-1,random_state=42) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test) 7 500個の決定木によるバギングの結果 accuracy 85.6% / 90.4%

Slide 8

Slide 8 text

OOB(out-of-bag)検証 バギングで選ばれないサンプル(OOBインスタンス)の 割合は (m: 訓練インスタンスの数) 予測器が使っていないOOBインスタンスで検証ができる 8 1 − 1 ≈ 1

Slide 9

Slide 9 text

ランダムパッチとランダムサブスペース 特徴量のサンプリング (=一部の特徴量だけを使って予測器を訓練する) ランダムパッチ 特徴量は一部だけ使う、インスタンスも一部だけ使う ランダムサブスペース 特徴量は一部だけ使う、インスタンスはすべて使う 検索してもあまり出てこない…マイナーなのか? scikit-learn公式には記述あり http://scikit-learn.org/stable/modules/ensemble.html 9

Slide 10

Slide 10 text

ランダムフォレスト ・決定木のアンサンブル ・バギングで、サンプル数を訓練インスタンス数にする ・一部の特徴量(ランダムに選んだ)だけの中で、 最良の分割を探す →もとの決定木よりも汎化性能が上がる 10 from sklearn.ensemble import RandomForestClassifier rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42) rnd_clf.fit(X_train, y_train) y_pred_rf = rnd_clf.predict(X_test)

Slide 11

Slide 11 text

Extra-Tree (Extremely Randomized Tree) ランダムフォレストが最良の分割を選ぶのに対して、 無作為に分割をする ただしその詳細は文献によって微妙に違う…… (次ページ以降) 最良の分割のために探索しなくてよい →計算時間の削減 11

Slide 12

Slide 12 text

Extra-Tree (Extremely Randomized Tree) Extremely Randomized Treeでは、乱数は分割が計算され る方法に関してさらに一歩進んでいます。ランダムフォ レストの場合と同様に、特徴量のランダムなサブセット が使用されますが、最も識別可能なしきい値を探す代わ りに、特徴量ごとにランダムにしきい値が描画され、こ れらのランダムに生成されたしきい値のうち最良のもの が分割ルールとして選択されます。 http://scikit-learn.org/stable/modules/ensemble.html を翻訳 12

Slide 13

Slide 13 text

Extra-Tree (Extremely Randomized Tree) 13 https://www.slideshare.net/itakigawa/ss-77062106

Slide 14

Slide 14 text

Extra-Tree (Extremely Randomized Tree) どっちが正しいんだ?? 14

Slide 15

Slide 15 text

特徴量の重要度 特徴量の重要度:MNISTの例 15

Slide 16

Slide 16 text

ブースティング ・ベースとなる予測器を逐次的に訓練する ・個々の予測器は単純であることが多い 例:決定株(深さ1の決定木) ・弱学習器(無作為よりも少しだけ良い)を多数組み合わせて 強学習器を作る Adaboost、勾配ブースティングが一般的 16

Slide 17

Slide 17 text

Adaboost (Adaptive Boosting) 訓練インスタンスの重みづけを変化させる 学習器が間違えたインスタンスの重みを増やして 次の学習器に入力 感覚的には、 「判別が難しい」インスタンスを最初に拾い出す 後半では「判別が難しい」ものを 正しく判別する分類器を作る 17

Slide 18

Slide 18 text

Adaboostのイメージ https://www.youtube.com/watch?v=ix6IvwbVpw0 記号の大きさ=重み 18

Slide 19

Slide 19 text

Adaboostの数式 αj が2回使われている ・分類器の重み(信頼度) ・インスタンスの重み更新時 19 http://st-hakky.hatenablog.com/entry/2017/08/08/025846 本に記載のものから0.5倍している

Slide 20

Slide 20 text

勾配ブースティング 新予測器を、前の予測器の残差に適合させる 20 from sklearn.tree import DecisionTreeRegressor tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg1.fit(X, y) 1つめの予測器を訓練 y2 = y - tree_reg1.predict(X) 残差 tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg2.fit(X, y2) 2つめの予測器を訓練 残差を使う y3 = y2 - tree_reg2.predict(X) 残差

Slide 21

Slide 21 text

勾配ブースティング 21

Slide 22

Slide 22 text

learning-rate 22

Slide 23

Slide 23 text

早期打ち切り 23 決定木をいくつ使うのが良いのか? が知りたい 方法1:決定木の数と検証誤差をグラフ化する 方法2:決定木を増やしていき、 検証誤差が増え始めたらストップ 55

Slide 24

Slide 24 text

スタッキング 投票分類器の一般化 予測器の層を作る 第1層は訓練データを入力し、予測値を出力 第2層(ブレンダー)は第1層が出力した予測値を入力し、 最終的な予測値を出力 24