FC2ブログ

子供の落書き帳 Remix

15/4/13:ひと月に一度更新するブログになってしまっている

スポンサーサイト
--/--/--(--) --:--:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

scikit-learnとTensorFlowによる実践機械学習 輪読会7章
2018/07/29(日) 21:45:58

2018/06/15(金)に、scikit-learnとTensorFlowによる実践機械学習輪読会#7で発表してきた。

scikit-learnとTensorFlowによる実践機械学習/原題:Hands-On Machine Learning with Scikit-Learn and TensorFlow」の7章の説明を担当した。資料はこちら!



前回の担当は4章の一部でした。こちらもあわせてどうぞ。
scikit-learnとTensorFlowによる実践機械学習 輪読会4章 子供の落書き帳 Remix

発表を担当した動機


以下2点の動機により、この章の発表をした。

・ランダムフォレストについてはあまり理解していなかったので、発表を通じて自分の理解を深めようと思ったため。
・kaggleなどで一般的に使われているxgboostやlightGBMが勾配ブースティングの手法なので、これらのライブラリが何をやっているのか押さえておいたほうが良いのかなと思った

前者に関してはバッチリ。発表するとなると単に参加するよりも何倍も本を読み込まなければならない。大変なのは確かだけど、その分知識が身についた。
後者に関しては、xgboostの方式をちゃんと理解するところまでは行っていない。

Extra-Treeの方式が分からない



スライドにも書いたが、Extra-Tree(Extremely Randomized Tree)の方式が分からなかった。
なぜなら、色々調べていると、参考サイトによって計算方法が微妙に異なっているからだ。

scikit-learn公式を見てみよう。
1.11. Ensemble methods - scikit-learn 0.19.2 documentation の文章を訳すと、以下のようになる。

Extremely Randomized Treeでは、乱数は分割が計算される方法に関してさらに一歩進んでいます。ランダムフォレストの場合と同様に、特徴量のランダムなサブセットが使用されますが、最も識別可能なしきい値を探す代わりに、特徴量ごとにランダムにしきい値が選び出され、これらのランダムに生成されたしきい値のうち最良のものが分割ルールとして選択されます。

(特徴量サブセットの中の)各特徴量について、ランダムにしきい値を決める。一度それらを全部試してみて、一番うまく分割できたものを選ぶ。「うまく分割できた」というのは具体的にいえば、候補の中でコスト関数が最小となるものである。

ところが、ネットを調べてみると他のサイトでは違ったことを書いている。

各splitで、対象変数X_iと閾値θ_jのいずれも完全にランダムに決める
(合成変量とアンサンブル:回帰森と加法モデルの要点 p.74)

(決定木の分岐をするときに)分岐関数候補をランダムに K 個選択
分岐関数の決定方法は、一般的には2つの方法が取られる

単純にランダム選択 ( K=1 ) Extremely Randomized Trees[ P. Geurts 06 ]
(Random Forestsとその応用(PDF) pp.15-16)

分岐関数の決定を完全にランダムに
ランダムフォレストの基礎と最新動向(PDF)

これを読む限り「それぞれの特徴量に対して試してみてから最良のものを選ぶ」とは書いていない。特徴量(X_i)をランダムに選択して、閾値(θ_j)をランダムに選択して、その条件で分岐させてしまう、というふうに読める。

一体どっちが正しいんだろうか。
色々探したけど、前者のscikit-learn公式と同様の説明を書いているところが見当たらない。
っていうことは後者だろうか。でも後者だと分岐のしかたが全くランダムなので、「良い分岐」になる確証が全く無い。そんな完全ランダムな分岐のしかたで、うまく分類できるのか? が疑問だ。


ここまで来たらscikit-learnのコードを追ってみるか、元々の論文に当たるかをしないと分からない気がする。


AdaBoost



ブースティングの中でも一般的なアルゴリズムらしいが、なかなか複雑だった。一通りサッと本を読んだだけだと、中身を把握しづらい。
理解できたら、なかなか興味深い手法だと思ったので、どこかで一回まとめてみたい。

ここでは手法の詳細は解説しないが、この動画の説明が、分かりやすくて良かったので大変オススメ。英語だけどスライドにだいたいの説明は書いてあり、説明の図も豊富なので、見る価値は十分ある。
(61) Ensembles (4): AdaBoost - YouTube

なお、Python 機械学習プログラミングのほうには、一回の反復処理を具体的に書いてあって、詳細な説明がされている。合わせて読むと良いだろう。


gradient boosting(勾配ブースティング)のlearning_rateは何を意味するか



scikit-learnとTensorFlowによる実践機械学習の本では、「個々の木の影響力を調整する」とだけ書いてあって、いまいち分かりにくい。(p.197)

scikit-learnの解説を見てみよう。
sklearn.ensemble.GradientBoostingRegressor関数の説明のほうを見ると、「それぞれの木の寄与率を、learning_rate倍に縮めます」としか書いていない。いまいちよく分からない。

ところが、同じscikit-learnの公式ドキュメントでもアンサンブル法の説明のところを見ると、数学的な定式化も含めて詳細に書いてある。こっちを読めば良かったんだ!

各ステップの関数を足す前に、learning_rateを掛け合わせている。これによって学習速度を下げて、過学習を抑えている。勾配ブースティングに対するこの操作は「Shrinkage(収縮)」と呼ばれているようだ。


以下、輪読会のときにいただいたコメント。

●learning_rateが大きいと、外れ値に対して値を合わせに行ってしまう。つまり外れ値を学習して過学習に陥る。learning_rateが小さければ『値を合わせに行く割合』が小さくなるので、過学習に陥りにくくなるのではないか。

●learning_rateが小さいと、学習するには多数の木を使う必要がある。そのため、1回の学習に時間がかかる。「パラメータを色々変えながらグリッドサーチで良いパラメータを見つけたい」というようなときは、learning_rateを大きくして、学習時間を短くしたほうが良い。
参考:Python 勾配ブースティングにおけるパラメータと調整方法について - CRUNKYおいしい

以上。それでは。
  1. 2018/07/29(日) 21:45:58|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

コメント


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://luvtome.blog5.fc2.com/tb.php/651-891072ca
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。