まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

ランダムフォレストについて改めて要点をまとめる

概要

ランダムフォレストは何が理解の要点なのかを中心として自分用に改めてまとめる。
各見出しで参考にしたリンクを都度記載しているので数式などはそちらを見てください。

まず、ランダムフォレストについて一言で説明すると、「決定木モデルに対してアンサンブル学習をおこなったもの」である。

決定木モデルによる予測は、バイアスは小さいがバリアンスは大きくなる。
このひとつひとつの木を複数組み合わせる、つまりアンサンブル学習をさせることでバイアスは小さいままバリアンスも小さくするという試みがランダムフォレスト。

・・・と書くことはできるが、上記で出てきたそれぞれの用語についていったん解説した上で、改めて上記文言を考える。

決定木とは

「データに対してどの項目値で分割をすると目的変数の不純度が下がるか?」という基準でデータをひたすら分割していく手法。不純度はジニ係数エントロピーで計算されることが多い。

「これ以上分割ができない」状態まで分割をしていくと、学習させたデータに対してオーバーフィッティング、つまりバイアスは小さくなるが、バリアンスが大きくなる。そのため、汎化性能を上げるにはある一定基準で分割をやめる必要がある。

複雑になりがちな決定木を汎用的に変身!剪定の考え方について - Np-Urのデータ分析教室

バイアスとバリアンス

決定木の説明で出た「バイアス」と「バリアンス」について。

機械学習では「観測値と予測値の差(=誤差)を小さくする」ことを目的にしている。この誤差は バイアス + バリアンス + ノイズ に分解できる。

バイアスは、観測値とモデルの予測値の平均的なズレを指す。要するに「どれだけモデルがデータにフィットしているか」
これはモデルを複雑にして表現力を増やせば増やすほど減少する。つまり、モデルに由来するズレのことを指す。

バリアンスは、サンプルデータによってどれくらいモデルが変化するか(モデルの分散)を指す。つまり、データに由来するズレ。これが大きい状態をいわゆる「オーバーフィッティング」といい、その学習データに対して過剰にフィットしたモデルなので汎化性能が低い。

ノイズはその母集団特有のゆらぎのため、変化させることはできない。

1つの学習器では、バリアンスとバイアスはトレードオフの関係になっており、片方を小さくすると片方が大きくなる。

バイアスとバリアンスを理解する - Qiita

Loading...

バイアス-バリアンス分解:機械学習の性能評価 - HELLO CYBERNETICS

アンサンブル学習とは

アンサンブル学習とは、学習器を組み合わせることで予測性能を向上させる試みを指す。
アンサンブル学習にはいくつかの手法があり、主に「バギング」「ブースティング」「スタッキング」の3つに分かれる。ランダムフォレストはこの中の「バギング」を応用したものが使われる。

機械学習上級者は皆使ってる?!アンサンブル学習の仕組みと3つの種類について解説します

pythonでランダムフォレストとアンサンブル学習まとめ - Qiita

【入門】アンサンブル学習の代表的な2つの手法とアルゴリズム

バギング

Bootstrap Aggregatingの略で、ブートストラップ法を用いることである母集団に対して、複数の標本集団を作成し、それぞれの標本集団に対して学習したモデルを作成し、目的変数が不連続値なら多数決、連続地なら平均などの代表値を最終的な予測結果として採用する。

多数のモデルの総意を用いるため汎化性能が高まる、つまり バリアンスを小さくする 特徴がある。また、各モデル構築は並行でできるため 並列処理が可能 で速度が比較的遅い速い(2021/08/02 修正)。

ブースティング

モデルを作成し、その結果に対する誤りをより重視するようにモデルを改善し、さらにそのモデル結果の誤りをより重視するようにモデルを改善し...を繰り返していくモデル。

誤りを修正していくためバイアスを小さくする特徴がある。こちらは順番にモデルを作成していくので並行処理は不可で、処理速度が比較的遅い。

ランダムフォレストとは

決定木モデルは、前述のようにバイアスは小さく、バリアンスが大きい
ランダムフォレストは、この決定木を複数作り組み合わせる。つまりアンサンブル学習させることでバイアスは小さいままバリアンスを下げることで予測性能を上げる。

アンサンブル学習の手法としては、バギングと同様にブートストラップ法によって複数の標本集団を作成する。そして通常のバギングとは異なり、それぞれの集団に対して、ランダムにx個の特徴量のみを使用した決定木モデルを作成し、それぞれのモデル結果の総意を結果として使用する。

通常、それぞれの決定木間の相関が高い場合はバリアンスが下がりづらいことが知られている(直感的には、多様な人による意見の総意の方が良い成果が出やすいことに似ている)。
ブートストラップ法によって標本を選ぶだけでなく、使われる特徴量も多様になるので、通常のバギングよりも更に多様な標本集団を用いた決定木モデルの作成をすることができ、決定木間の相関が低くなりやすいため通常のバギングよりもバリアンスが低いアンサンブル学習をおこなうことができる。

このように、バリアンスは小さいままバイアスも小さくするという試みをランダムフォレストという。

なお、組み合わせるモデルはなんでもいいといえばいいが、手法の特性上「バイアスが小さくバリアンスが大きい」モデルが適しているので決定木が使われているという背景がある。

【アンサンブル学習】多様性が大事? バギング・ランダムフォレスト編 - Np-Urのデータ分析教室

特徴量はいくつずつ使うか、どこで枝を生やすのをやめさせるか...などはパラメータで指定する。

sklearn.ensemble.RandomForestClassifier — scikit-learn 0.24.2 documentation

経験則だが、どれくらいにしたらいいかの定説はある模様。

決定木の2つの種類とランダムフォレストによる機械学習アルゴリズム入門

改めて、ランダムフォレストとは

「バイアスが小さくバリアンスが大きい決定木」に対して、「バギング的な手法でアンサンブル学習をおこなうことバリアンスを下げたモデルを作成」するため予測精度が高いモデルが作成できる手法

下記がパラメータや実用面について、色々とまとまっている https://shakezo.hatenadiary.org/entry/20121221/1356089207

https://www.jstage.jst.go.jp/article/itej/70/9/70_788/_pdf/-char/en

www.slideshare.net

どういう場合に使えないか(良い精度が出づらいか)

前述のように、組み合わせた決定木同士に相関が強い場合はバリアンスが下がりづらい。

そのため各々で特徴量をランダムにx個使った決定木を作成することで学習データの多様性を確保するが そもそも特徴量自体が少ない場合 、それぞれの決定木に使用される特徴量はランダムに採択しても似通うのでバリアンスが下がりづらい。

また、そもそも データ量が少ない場合 もブートストラップ法によって復元抽出される標本集団が似通うので相関が高く出やすく、バリアンスが下がりづらい。

他と比べてどういうメリット/デメリットがあるか

メリット

  • 決定木がベースなので、 特徴量の重要度を計算することができる
  • 並列処理が可能なので 計算が比較的早い
  • 各決定木の総意を用いるのでノイズに強い

また、SVMを使ったことがないためよく知らないのですが、以下のような特徴もあるようです。

  • SVMなどと違い特徴量のスケーリングが必要ない

デメリット

  • パラメータが多い(ただし、デフォルトでもある程度はうまくいく)
  • メモリ使用量が大きい
  • 前述の理由より、学習データに精度が依存する

Gradiant Boosting Decision Tree系との比較

同じく弱学習器として決定木を用いるが、アンサンブル学習の仕方がバギングでなく、ブースティングにしたものにXGBoostやLightGBMなど(Gradiant Boosting Decision Tree系、以下GBDT系)がある。

ランダムフォレストと比較して、GBDT系は高い予測性能を持ったモデルを作れるが、パラメータによって過学習が起きやすい。そのため、パラメータチューニングをちゃんとしないと高い予測性能を持ったモデルを作るのは難しいし時間がかかる。
また、モデル自体の学習時間も一般的にはランダムフォレストよりかかる。

そのため、GBDT系とランダムフォレストのどちらを使うかは、工数と精度のトレードオフになるとのこと。