33
cl-random-forest : Common Lispによるランダムフォレストの実装 Satoshi Imai Twitter: @masatoi 0 Github: masatoi

Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Embed Size (px)

Citation preview

Page 1: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

cl-random-forest : Common Lispによるランダムフォレストの実装

Satoshi Imai Twitter: @masatoi0 Github: masatoi

Page 2: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

発表の流れ

● ランダムフォレストとは何か

● 決定木の学習、予測

● ランダムフォレストの学習、予測

● ランダムフォレストの改良

– Global Refinement (大域的最適化)

– Global Pruning (大域的枝刈り)

● 他実装との比較

Page 3: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● 機械学習の手法の一つ

● 決定木を弱学習器として使う集団学習

● 分類にも回帰にも使える

● 非線形モデル

● 速い

● 実装が簡単

Page 4: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● 機械学習の手法の一つ

● 決定木を弱学習器として使う集団学習

● 分類にも回帰にも使える

● 非線形モデル

● 速い

● 実装が簡単

Page 5: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

分類問題の例: Kinectによる身体の部位の分類

Ren, Cao, Wei and Sun. “Global Refinement of Random Forest” CVPR2015

回帰問題の例: 緑の線の周辺に分布するデータを多項式でフィッティング

過学習

Page 6: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● 機械学習の手法の一つ

● 決定木を弱学習器として使う集団学習

● 分類にも回帰にも使える

● 非線形モデル

● 速い

● 実装が簡単

Page 7: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

線形分離可能 線形分離不可能

● 線形モデル

– パーセプトロン

– 線形SVM

– AROW etc...

● 非線形モデル

– 非線形SVM

– ランダムフォレスト

– ニューラルネット etc...

Page 8: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● 機械学習の手法の一つ

● 決定木を弱学習器として使う集団学習

● 分類にも回帰にも使える

● 非線形モデル

● 速い

● 実装が簡単

Page 9: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● SVMは入力データ数nに対してO(n^2)の時間計算量

がかかる

● ニューラルネットはO(n)だが最適化するパラメータが膨

● ランダムフォレストはO(n log n)の時間計算量で学習で

きる

– しかも容易に並列化できる

– 並列化粒度が大きいのでスケーラビリティが高い

Page 10: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストとは何か

● デメリット

– 決定木の最大深さをDとすると、2^Dに比例する空間計

算量が必要

– データ数が少ないときに過学習しがち

● とはいえ実装が簡単で直感的にも理解しやすいな

ど、扱いやすい特徴を多く持つのでデータ分析の現

場でよく使われる

Page 11: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

cl-random-forest

● ランダムフォレストの純Common Lispによる実装

– https://github.com/masatoi/cl-random-forest

– 高速、並列化対応

– 通常のランダムフォレストに加えてRen,CaoらのGlobal

Refinement of Random Forestを実装

● →高速化、精度向上、メモリ使用量削減

Page 12: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

決定木の学習

● 木構造を辿ることによって入力データの空間を部分

領域に分割していく

– 一番簡単なのは、特徴と閾値を選ぶことによって領域を

分割する方法

– 分割が木のノードに相当

– ノードは分割条件を保持

Page 13: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

決定木の学習

● 領域の分割は、何回かランダムに分割してみて、エ

ントロピーを最小化するような分割を選ぶ

エントロピー最小完全に分割できていると0

Page 14: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

決定木の学習

– 終了条件に達するまで再帰的に木を成長させていく

● エントロピーが0になる

● あらかじめ指定した最大深さに達する

● 領域内のデータ数があらかじめ指定した一定数以下になる

Page 15: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

決定木の予測

● 予測時

– 入力xが与えられると、ルートから分割条件に従って葉ノードまで辿

– 葉ノードに相当する領域内の頻度分布によって予測を出す

Page 16: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

決定木のデモ

● 小さいデータセットで決定木を学習

● 木をトラバースしてエントロピーを表示

● 構造体の中身を見る

● テスト

Page 17: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレスト

● 決定木を複数作る

● 各決定木の予測分布を平均したものを森全体の予

測分布とする

Page 18: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

バギング

● 決定木を複数作る際に元のデータセットから小さい

データセットをサブサンプリングする

– 重複を許すサンプリング(ブートストラップサンプリング)

– この小さいデータセットで決定木を学習

– これによって森の中の多様性が増す

→ より頑健に

Page 19: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

ランダムフォレストのデモ

● 小さいデータセットでランダムフォレストを学習

● 構造体の中身を見る

● テスト

Page 20: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinement: 大域的な情報を使って再学習

● Ren, Cao, Wei and Sun. “Global Refinement of Random

Forest” CVPR2015

● 通常のランダムフォレスト: 個々の決定木は独立に

成長する。補完し合うようには考えられていない

→ 森全体にまたがって再学習する

– 再学習には線形分類器を使う

● 論文では線形SVM(LIBLINEAR)

→以前実装したcl-online-learningが使える

Page 21: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinement: 大域的な情報を使って再学習

● 学習済みのランダムフォレストを使ってデータを高次元で疎

なデータに変換する

– 疎なデータは非常に高次元だが、実際には木の数しか

値が入っていない

→ cl-online-learningは疎ベクトルにも対応している

Page 22: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinement: 学習

● クラス毎に二値分類器を用意する

– 1 vs Allで学習する

● 教師信号に対応する学習器では正例、他の全部の学

習器では負例として扱う

Page 23: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinement: 予測

● クラス毎に二値分類器を用意する

– 二値分類器の重みと入力との線形結合でそのクラスの

活性が得られる

– 活性が最大になるクラスを選ぶ

Page 24: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinementの性質

● 分割の試行回数やバギング比率を小さくしても性能が落ちない→高速化

● 普通のRF: 木の数よりもむしろ木の深さが性能に直結

– 個々の決定木の表現力がものをいう

● Refined: 浅い木でも木の数を増やすことにより性能向上

– 個々の決定木は弱くてもいい。木の数を増やして組み合せ方を工夫すること

で性能を出す

Page 25: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinementの流れ

● まずランダムフォレストをつくる

– 木の数を増やしてバギング比率を小さくする

● ランダムフォレストから線形分類器用のデータセット

を作る

– ランダムフォレストにデータを入力し、どの葉ノードにデー

タが分類されるかを調べる

● 線形分類器を学習する

– クラス数の数だけ二値分類器を学習する

Page 26: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Refinementのデモ

Page 27: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Pruning:大域的な情報を使って枝刈り

● 線形分類器の重みからノルムを計算し、隣接する葉ノードのノルムの

合計が小さいような葉ノードを削除する

● 新しいランダムフォレストからまた線形分類器用のデータを作り、線形

分類器を再学習することを繰り返す

– 再学習を必要とするので時間がかかる

Page 28: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

Global Pruning

● 1/10ぐらいまで刈り込んでもほとんど性能の劣化が無い

Page 29: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

他実装との比較

● scikit-learn

– Python界では有名な機械学習ライブラリ群

– ランダムフォレストの実装はCython

– マルチスレッド対応

● ranger

– R界では最速と目されるランダムフォレストライブラリ

– 本体はC++

– マルチスレッド対応

Page 30: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

MNISTでの比較

● MNIST: 手書き数字の画像を認識する問題

– 28×28ピクセルのグレースケール画像

– 10クラス、784次元、訓練データ60000、テストデータ10000

Page 31: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

MNISTでの比較

scikit-learn clrf (2) clrf (3)Time 29.6 sec 15.91 sec 12.597 sec 2.195 sec 6.648 secAccuracy 96.59% 96.99% 96.3% 93.38% 98.22%

        ranger clrf (1)

実行時間

ランダムフォレストの構成 2.195 sec線形分類器の訓練データセット作成 1.795 sec線形分類器のテストデータセット作成 0.378 sec線形分類器の学習 2.281 sec

工程                              

● できるだけ条件を揃えて実行時間と精度を比較する

– 木の数: 100, 木の最大深さ: 15, バギング比率: 1.0

– 木の数: 500, 木の最大深さ: 10, バギング比率: 0.1

– clrf(3)の内訳

Page 32: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

様々なデータでの比較

● 推奨設定での精度と所要時間

● scikit-learn: n-tree=100、他はデフォルト

● ranger: 全部デフォルト

● clrf: n-tree=500, bagging-ratio=0.1, max-depth=15, n-trial=sqrt(dim)

MNIST

letter

covtype

usps

        scikit-learn ranger clrf 96.95%, 41.72sec

97.17%, 69.34sec

98.29%, 12.68sec

96.38%, 2.569sec

96.42%, 1.828sec

97.32%, 3.497sec

94.89%, 263.7sec

83.95%, 139.0sec

96.01%, 103.9sec

93,47%, 3.583sec

93.57%, 11.70sec

94.96%, 0.686sec

#Train #Test #Feature #ClassesMNIST 60000 10000 784 10letter 15000 5000 16 26covtype 348607 232405 54 7usps 7291 2007 256 10

Page 33: Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装

まとめ

● ランダムフォレストの大域的な情報を使って線形分類器で再学

習することにより高精度、高速になった

● 枝刈りによりモデルのサイズを相当圧縮できる。メモリ制約の強

い携帯機等で予測を実行するときは重要

● 普通のランダムフォレストでも他ライブラリより速い

● Common Lispでスケッチから最適化までがシームレスに行なえ

るので、新しいアルゴリズムを実験するそのままの流れで実用レ

ベルまで持っていける

● TODO: 回帰の実装、省メモリ化