Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Post on 05-Apr-2017
264 Views
Preview:
Transcript
cl-random-forest : Common Lispによるランダムフォレストの実装
Satoshi Imai Twitter: @masatoi0 Github: masatoi
発表の流れ
● ランダムフォレストとは何か
● 決定木の学習、予測
● ランダムフォレストの学習、予測
● ランダムフォレストの改良
– Global Refinement (大域的最適化)
– Global Pruning (大域的枝刈り)
● 他実装との比較
ランダムフォレストとは何か
● 機械学習の手法の一つ
● 決定木を弱学習器として使う集団学習
● 分類にも回帰にも使える
● 非線形モデル
● 速い
● 実装が簡単
ランダムフォレストとは何か
● 機械学習の手法の一つ
● 決定木を弱学習器として使う集団学習
● 分類にも回帰にも使える
● 非線形モデル
● 速い
● 実装が簡単
分類問題の例: Kinectによる身体の部位の分類
Ren, Cao, Wei and Sun. “Global Refinement of Random Forest” CVPR2015
回帰問題の例: 緑の線の周辺に分布するデータを多項式でフィッティング
過学習
ランダムフォレストとは何か
● 機械学習の手法の一つ
● 決定木を弱学習器として使う集団学習
● 分類にも回帰にも使える
● 非線形モデル
● 速い
● 実装が簡単
線形分離可能 線形分離不可能
● 線形モデル
– パーセプトロン
– 線形SVM
– AROW etc...
● 非線形モデル
– 非線形SVM
– ランダムフォレスト
– ニューラルネット etc...
ランダムフォレストとは何か
● 機械学習の手法の一つ
● 決定木を弱学習器として使う集団学習
● 分類にも回帰にも使える
● 非線形モデル
● 速い
● 実装が簡単
ランダムフォレストとは何か
● SVMは入力データ数nに対してO(n^2)の時間計算量
がかかる
● ニューラルネットはO(n)だが最適化するパラメータが膨
大
● ランダムフォレストはO(n log n)の時間計算量で学習で
きる
– しかも容易に並列化できる
– 並列化粒度が大きいのでスケーラビリティが高い
ランダムフォレストとは何か
● デメリット
– 決定木の最大深さをDとすると、2^Dに比例する空間計
算量が必要
– データ数が少ないときに過学習しがち
● とはいえ実装が簡単で直感的にも理解しやすいな
ど、扱いやすい特徴を多く持つのでデータ分析の現
場でよく使われる
cl-random-forest
● ランダムフォレストの純Common Lispによる実装
– https://github.com/masatoi/cl-random-forest
– 高速、並列化対応
– 通常のランダムフォレストに加えてRen,CaoらのGlobal
Refinement of Random Forestを実装
● →高速化、精度向上、メモリ使用量削減
決定木の学習
● 木構造を辿ることによって入力データの空間を部分
領域に分割していく
– 一番簡単なのは、特徴と閾値を選ぶことによって領域を
分割する方法
– 分割が木のノードに相当
– ノードは分割条件を保持
決定木の学習
● 領域の分割は、何回かランダムに分割してみて、エ
ントロピーを最小化するような分割を選ぶ
エントロピー最小完全に分割できていると0
決定木の学習
– 終了条件に達するまで再帰的に木を成長させていく
● エントロピーが0になる
● あらかじめ指定した最大深さに達する
● 領域内のデータ数があらかじめ指定した一定数以下になる
決定木の予測
● 予測時
– 入力xが与えられると、ルートから分割条件に従って葉ノードまで辿
る
– 葉ノードに相当する領域内の頻度分布によって予測を出す
決定木のデモ
● 小さいデータセットで決定木を学習
● 木をトラバースしてエントロピーを表示
● 構造体の中身を見る
● テスト
ランダムフォレスト
● 決定木を複数作る
● 各決定木の予測分布を平均したものを森全体の予
測分布とする
バギング
● 決定木を複数作る際に元のデータセットから小さい
データセットをサブサンプリングする
– 重複を許すサンプリング(ブートストラップサンプリング)
– この小さいデータセットで決定木を学習
– これによって森の中の多様性が増す
→ より頑健に
ランダムフォレストのデモ
● 小さいデータセットでランダムフォレストを学習
● 構造体の中身を見る
● テスト
Global Refinement: 大域的な情報を使って再学習
● Ren, Cao, Wei and Sun. “Global Refinement of Random
Forest” CVPR2015
● 通常のランダムフォレスト: 個々の決定木は独立に
成長する。補完し合うようには考えられていない
→ 森全体にまたがって再学習する
– 再学習には線形分類器を使う
● 論文では線形SVM(LIBLINEAR)
→以前実装したcl-online-learningが使える
Global Refinement: 大域的な情報を使って再学習
● 学習済みのランダムフォレストを使ってデータを高次元で疎
なデータに変換する
– 疎なデータは非常に高次元だが、実際には木の数しか
値が入っていない
→ cl-online-learningは疎ベクトルにも対応している
Global Refinement: 学習
● クラス毎に二値分類器を用意する
– 1 vs Allで学習する
● 教師信号に対応する学習器では正例、他の全部の学
習器では負例として扱う
Global Refinement: 予測
● クラス毎に二値分類器を用意する
– 二値分類器の重みと入力との線形結合でそのクラスの
活性が得られる
– 活性が最大になるクラスを選ぶ
Global Refinementの性質
● 分割の試行回数やバギング比率を小さくしても性能が落ちない→高速化
● 普通のRF: 木の数よりもむしろ木の深さが性能に直結
– 個々の決定木の表現力がものをいう
● Refined: 浅い木でも木の数を増やすことにより性能向上
– 個々の決定木は弱くてもいい。木の数を増やして組み合せ方を工夫すること
で性能を出す
Global Refinementの流れ
● まずランダムフォレストをつくる
– 木の数を増やしてバギング比率を小さくする
● ランダムフォレストから線形分類器用のデータセット
を作る
– ランダムフォレストにデータを入力し、どの葉ノードにデー
タが分類されるかを調べる
● 線形分類器を学習する
– クラス数の数だけ二値分類器を学習する
Global Refinementのデモ
Global Pruning:大域的な情報を使って枝刈り
● 線形分類器の重みからノルムを計算し、隣接する葉ノードのノルムの
合計が小さいような葉ノードを削除する
● 新しいランダムフォレストからまた線形分類器用のデータを作り、線形
分類器を再学習することを繰り返す
– 再学習を必要とするので時間がかかる
Global Pruning
● 1/10ぐらいまで刈り込んでもほとんど性能の劣化が無い
他実装との比較
● scikit-learn
– Python界では有名な機械学習ライブラリ群
– ランダムフォレストの実装はCython
– マルチスレッド対応
● ranger
– R界では最速と目されるランダムフォレストライブラリ
– 本体はC++
– マルチスレッド対応
MNISTでの比較
● MNIST: 手書き数字の画像を認識する問題
– 28×28ピクセルのグレースケール画像
– 10クラス、784次元、訓練データ60000、テストデータ10000
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)の内訳
様々なデータでの比較
● 推奨設定での精度と所要時間
● 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
まとめ
● ランダムフォレストの大域的な情報を使って線形分類器で再学
習することにより高精度、高速になった
● 枝刈りによりモデルのサイズを相当圧縮できる。メモリ制約の強
い携帯機等で予測を実行するときは重要
● 普通のランダムフォレストでも他ライブラリより速い
● Common Lispでスケッチから最適化までがシームレスに行なえ
るので、新しいアルゴリズムを実験するそのままの流れで実用レ
ベルまで持っていける
● TODO: 回帰の実装、省メモリ化
top related