アンサンブル
弱学習器を複数作成して、それらの出力の多数決や平均を取る方法。
例えば大数の法則のように、たくさんのサンプルの平均を取るとそのバラつきは$\frac{1}{\sqrt{n}}$になる、というようなイメージを応用したと考えれば良い。
弱学習器たちの性能が悪くても、それらを平均すると低バリアンスな結果を得られる。
かつ、弱学習器なので過学習していない。
なお、弱学習器の間で同じような誤差を持つと、結局みんな同じような出力になるので、これを避けるように各学習器で使用するデータ(またはデータ重み)は異なるものにするという工夫を行っている(これがアンサンブル手法の肝だと思っている)
バギングはデータ多様性を与えた弱学習器群にて、バリアンス対策が主目的。
ブースティングは間違えたデータを修正していく形なので、バイアス対策が主目的。
バギングとブースティング
アンサンブル手法の「バギング」と「ブースティング」の違いについて整理する。
バギング
学習用データセットの選択方法。
重複を許して取り出し、データサブセットを用意する。
元のデータセットと同じサンプルサイズになるまで復元抽出。
こうしたデータサブセットの作成方法を「ブートストラップ」と呼ぶ。
ブートストラップで作成したデータサブセット群を用いてそれぞれ学習器(モデル)を作成、それらの予測値を統合することを、「バギング」と呼ぶ。
決定木は過学習しやすいが、複数のデータサブセットを用いて多数決(平均化)することで、過学習対策となる。
元のデータセットを確率分布(母集団の近似)とみなして、そこからサンプリングしてデータセットを作る、というイメージ。
確率的に、データの63%が使用され、37%は使用されない。
この使用されない37%を、「Out-of-Bag」と呼ぶ。
63%のデータを使うことになる?
ブートストラップは復元抽出である為。
あるサンプルデータ$x_i$が選択されない確率は、$1-\frac{1}{n}$。
サンプル数nのデータサブセットを作る間に選択されない確率は、上記サンプリングをn回繰り返すので、$(1-\frac{1}{n})^n$。
nを大きくしていくと...
\lim_{n \to \infty}\left(1-\frac{1}{n}\right)^n
ネイピア数の定義:
\lim_{n \to \infty}\left(1+\frac{1}{n}\right)^n = e
ネイピア数の一般化式
\lim_{n \to \infty}\left(1+\frac{x}{n}\right)^n = e^x
よって、n回のサンプリングで$x_i$が選ばれない確率について$n \to \infty$にすると、
\begin{align}
\lim_{n \to \infty}\left(1-\frac{1}{n}\right)^n &= \lim_{n \to \infty}\left(1+\frac{-1}{n}\right)^n \\
&=e^{-1} \\
e &= 2.71828...\\
e^{-1} & = 0.36788...
\end{align}
選ばれない確率が約37%。
よって、使用されるデータは全体の63%程度に収束していく。
実は、「生起確率1%の事象について、100回サンプリング中で選ばれる確率は、、、」という命題も同じ式に帰着できて、「63%」になる。
(n=100, 1/n = 0.01 = 1% なので$(1-\frac{1}{100})^{100}$の形になる)
ブースティング
学習用データセットは固定で、モデルの学習順序に意味がある。
前のモデルが間違えた部分(誤差)を、次のモデルが補正するように学習する。
(AdaBoost と Gradient Boosting とではこの誤差に対する補正方法が異なる)
弱い学習機(浅い決定木など)を逐次的に積み重ねて、誤差を減らしていく。
各モデルの予測結果を重み付きで統合し、最終的な予測を行う。
これにより、高精度な予測モデルが構築できる。
AdaBoostでは、誤差のデータのい重みを付けて次のモデルを学習させる。
Gradient Boostingでは、残差を目的関数として次のモデルを学習させる。
アンサンブル手法例:決定木
- RandomForest:バギング
- AdaBoost:ブースティング
- XGBoost:ブースティング
- LightGBM:ブースティング
Adaboostはブースティングの基本概念理解に重要だが、実運用さえっる機械は減っており最近はLightBGMが人気の模様(特にKaggleでよく使われる)