scikit-learnとTFによる実践機械学習7 / Hands-On Machine Learning with Scikit-Learn and TensorFlow 7

scikit-learnとTFによる実践機械学習7 / Hands-On Machine Learning with Scikit-Learn and TensorFlow 7

2018年7月13日
「scikit-learnとTensorFlowによる実践機械学習輪読会#7」にて発表
https://data-refinement.connpass.com/event/91067/

E9bfb4b63d4b9d328917d19b33d30bc5?s=128

Linus_MK

July 13, 2018
Tweet

Transcript

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

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

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

    ブースティング 7.6 スタッキング 3
  4. アンサンブル学習 複数の予測器を組み合わせて、精度を上げること 4

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

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

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

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

    9
  10. ランダムフォレスト ・決定木のアンサンブル ・バギングで、サンプル数を訓練インスタンス数にする ・一部の特徴量(ランダムに選んだ)だけの中で、 最良の分割を探す →もとの決定木よりも汎化性能が上がる 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)
  11. Extra-Tree (Extremely Randomized Tree) ランダムフォレストが最良の分割を選ぶのに対して、 無作為に分割をする ただしその詳細は文献によって微妙に違う…… (次ページ以降) 最良の分割のために探索しなくてよい →計算時間の削減

    11
  12. Extra-Tree (Extremely Randomized Tree) Extremely Randomized Treeでは、乱数は分割が計算され る方法に関してさらに一歩進んでいます。ランダムフォ レストの場合と同様に、特徴量のランダムなサブセット が使用されますが、最も識別可能なしきい値を探す代わ

    りに、特徴量ごとにランダムにしきい値が描画され、こ れらのランダムに生成されたしきい値のうち最良のもの が分割ルールとして選択されます。 http://scikit-learn.org/stable/modules/ensemble.html を翻訳 12
  13. Extra-Tree (Extremely Randomized Tree) 13 https://www.slideshare.net/itakigawa/ss-77062106

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

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

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

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

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

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

  20. 勾配ブースティング 新予測器を、前の予測器の残差に適合させる 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) 残差
  21. 勾配ブースティング 21

  22. learning-rate 22

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

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