scikit-learn機械学習⑬ランダム・フォレスト
前回は、scikit-learnのDecisionTreeClassifierを使って決定木(Decision Tree)の実験を行いました。今回は、その知識をさらに拡張して、ランダム・フォレスト(Random Forest)について解説します。
大雑把に説明すると、ランダム・フォレストはたくさんの決定木を作って、それぞれの決定木に予測をさせます。そして、一番多くの「投票」を得たクラスがモデルの予測として採用されます。決定するための木がたくさんあるのでフォレスト(森)というわけです。
一見、同じ訓練データセットから多くの決定木を作ると、すべて同じような予測しか出ないように思えますが、そんなことはありません。
ランダム・フォレストは、バギング(Bagging)というアンサンブル学習法をベースにしており、ブートストラップ法(Bootstrap method)を用いるため、各決定木にランダムな訓練データを取得することができます。さらに、ランダム・フォレストはバギングにある改良を加えてより一般化能力が高くなる工夫がなされています。
この記事では、これらの概念の解説を行い、ランダム・フォレストの中身を深掘りします。
バイアスとバリアンス
まず簡単に、バイアスとバリアンスを簡単に説明します。後の解説で使います。
バイアス
バイアス(Bias)はモデルが実際のデータのパターンや関係をどれだけ捉えられていないかを示します。
例えば、非線形のパターンを持つデータに対して線形モデルを適用した場合、モデルはデータの特性を完全に捉えきれず、結果としてエラーが大きくなるでしょう。
具体的には、以下のようなデータがあったとします。

これに対して線形モデルを使うと、データの特徴を捉えきれずにエラーが大きくなるでしょう。

バイアスは、上記のようにモデルが単純過ぎるケースや、データが不足して起こる場合があります。
下図のように、データの数が少ない、あるいは偏っている場合には、もともとのパターン自体がなくなっており、たとえモデルにある程度の複雑さがあったとしても、本来のデータセットの特徴を捉えることはできません。

以上より、モデルのバイアスが高いと、訓練データと評価データの両方で損失値(エラー、誤差)が大きくなる傾向があります。これはデータセットに対してモデルが過度に単純であるために起こり、過小適合(underfitting)と呼ばれます。
バリアンス
一方、バリアンス(Variance)は、データセットに対してモデルが必要以上に適合しているために起こります。
例えば、ある非線形データセットに対して多項式回帰モデルを適用したとします。モデルの次数を非常に高く設定したら、モデルが訓練データの各点に完璧にフィットしたとします。しかし、小さなデータの変動に対しても大きく予測が変わってしまう可能性があります。

バリアンスの高いモデルは、訓練データではエラーが小さくなりますが、評価データではエラーが大きくなる傾向があります。これは、訓練データに対して過剰に適応しているので、新しいデータ(評価データ、未知のデータ)に対する予測が不正確になるからで、過学習(overfitting)として知られています。
トレードオフ
バイアスとバリアンスの間にはトレードオフの関係が存在し、バイアスを減らそうとするとバリアンスが増加し、バリアンスを減らそうとするとバイアスが増加する傾向があります。
よって、両者のバランスを取ることが求められます。できる限り単純で尚且つデータセットの本来のパターンに適応しているモデルが望まれます。

そのためには、十分なサイズの訓練セットが望まれますし、モデルを訓練する際に正則化(例えば、L1正則化、L2正則化など)などをしてパラメータが大きくなりすぎ(データの変化に極度に過敏)にならないようにしたりすることが必要です。
また、どのように訓練データを準備するのかがバイアスとバリアンスのバランスに影響します。
例えば、k分割交差検証は主にモデルの一般化能力を評価するために使われ、バリアンスを抑えつつ一定のバイアスを許容します。
k分割交差検証
k分割交差検証(k-Fold Cross-Validation)は、モデルの訓練と評価をするための手法です。
この手法では、データセットを複数の小さなサブセット(よく「フォールド」(Fold)と呼ばれる)に分割し、一部を訓練データとしてモデルを訓練し、残りの部分でモデルの評価を行います。
例えば、データセットをランダムにシャッフルしてから、5つのフォールドに分割したとします。それぞれをA、B、C、D、Eと呼びましょう。

まずは、A、B、C、Dを訓練セットとしてモデルを訓練します。そして、Eを検証セットとしてモデルを評価します。

次に、B、C、D、Eで訓練をし、Aで評価をします。

このように評価に使うフォールドをずらしながら一巡していきます。よって、各フォールドが一度は評価データセットとして使用されるようになります。特に、小さいデータセットを有効に使うのに役立ちます。
実際、scikit-learnにもKFoldを使うことで上記のようなデータセットの分割を簡単に作成することがでいます。
k分割交差検証はデータセットをk個の異なるサブセット(フォールド)に分割し、これらを訓練セットと検証セットとして交互に使用します。この方法により、モデルのハイパーパラメータの調整を様々なデータの組み合わせで行うことが可能です。
また、各フォールドの結果を平均することで、モデルの一般化能力を効果的に評価できます。その結果、特定のデータサンプルに対して過剰適合しやすいハイパーパラメータを避け、過学習のリスクを軽減できます。
しかし、データをフォールドに分割することで、各フォールドがデータセット全体の特性を完全には反映ぜず正しい評価が行えないことがあります。このため、ハイパーパラメータの選択や調整が適切でない場合、モデルに一定のバイアスが生じる可能性があります。
特に、データセットが小さいまたはシャッフルせずに特定のパターンに偏っている場合に注意が必要です。
以上の説明から、k分割交差検証がバイアスとバリアンスのバランスを取る手段の一つであることが分かります。この手法は特に、過学習を抑えつつモデルの一般化能力を評価することに焦点を当てています。また、一つのモデルを訓練する手法です。
一方で、ランダム・フォレストでは、複数の独立した決定木モデルの学習を行うために、それぞれの決定木のためのデータセットを作成する必要があります。そのための手法がブートストラップ法です。
ブートストラップ法
ブートストラップ法はデータセットからのランダムなリサンプリング(Resampling、再標本化)によって新しいサンプルのセットを生成することを意味します。「再」は、データセットから繰り返しデータを取得する事を指します。
なお、単に「ブートストラップ」と呼んだり、サンプリングであることを強調して、「ブートストラップ・サンプリング」とも呼ばれます。
話はちょっと逸れますが、強化学習におけるブートストラッピング(Bootstrapping)と統計学におけるブートストラップ・サンプリング(Bootstrap sampling)は、共に「ブートストラップ」(Bootstrap)という言葉を使用していますが、実際のプロセスと目的には違いがあります。強化学習では、エージェントが環境からのフィードバック(報酬)を受けて、その報酬と既存の予測値(状態価値や行動価値)を使って新たな価値推定を更新することで連続的な学習を行います。これに対し、統計学におけるブートストラップ・サンプリングは、データセットからのランダムなリサンプリングを通じてモデルの訓練・評価を行う手法です。なお、強化学習におけるブートストラッピングの典型的な例としてQ学習があります。
ちなみに、「ブートストラップ」という用語は、元々「自分のブートストラップ(靴ひも)を引っ張って自分を持ち上げる」という意味の古い表現に由来しています。この表現は、「外部の助けなしに自らを改善する」という意味で使われます。
統計学と強化学習の両方で「ブートストラップ」という用語が使われるのは、どちらもある種の自己参照的プロセスを含んでいるためです。
サンプリングでは、元のデータセットからランダムにデータを抽出して新たなサンプルセットを生成します。
強化学習では、エージェントが過去の経験から得た知識(予測値)を利用して、未来の価値(予測値)を更新するプロセスを指します。
ブートストラップ法でのサンプリングは復元抽出(Sampling with replacement)で行われます。復元抽出は、抽出されたデータが元のデータセットに戻され、次の抽出でも再度選ばれる可能性があるサンプリング方法です。よって、サンプリングによって生成されたデータセット内で同じサンプルが複数回発生することがあります。
復元抽出を行う主な理由は、各サンプリング試行が独立であるためです。この方法により、一度抽出されたデータが次の抽出試行の結果に影響を与えることがなく、サンプル間の独立性が保たれます。機械学習や統計の理論は通常、データが母集団から無作為にかつ独立してサンプルされたという前提に基づいています。復元抽出はこの独立性を確保し、不必要な依存関係を避ける役割を果たします。
つまり、ブートストラップ法では、同じデータセットから繰り返しサンプルを行うことで多様なサブセットを生成します。これにより、異なる訓練セットが得られ、それぞれの訓練セットを使って独立したモデルが訓練されます。結果として、各モデルは異なるデータの特徴を学習し、それぞれが異なる側面から問題を解析する能力を持つことになります。
比較として、k分割交差検証では、データセットを互いに重複しないk個のフォールドに分割し、各フォールドを一度だけ評価用に使用します。これにより、データの異なる組み合わせでモデルを繰り返し訓練し評価することが可能となります。この手法は、モデルが様々なデータのサブセットにどのように適応するかを評価し、過学習のリスクを減少させます。
一方、ブートストラップ法では、元のデータセットからランダムに復元抽出を行い、各サンプリングで得られたデータセットで独立したモデルを訓練します。
では次に、ランダム・フォレストの仕組みを見ていきましょう。
ランダム・フォレストの仕組み
アンサンブル学習
アンサンブル学習は、複数のモデルを組み合わせて、単一モデルよりも優れた予測精度や一般化能力を実現する手法です。このアプローチは、個々のモデルの予測の利用し全体の性能を向上させます。
アンサンブル学習には、バギングやブースティングなどいくつかの種類があります。ランダム・フォレストはバギングをベースにしています。
バギング
バギング(Bagging)は、Bootstrap Aggregatingの略語です。
元のデータセットからブートストラップ(Bootstrap)によって生成された複数のサブセットを用いて、各モデルを独立に訓練します。これらのモデルからの予測は、平均化または多数決によって集約(Aggregating)され、最終的な予測を形成します。

バギングは、特にバリアンスが高いモデルの過学習を抑える効果があります。これは、各モデルが異なるデータサンプルを使って訓練されるため、特定のサンプルや特徴への過剰適合が抑制されるからです。
よって、決定木のように高いバリアンスを持つ傾向のあるモデルに対して効果的であり、過学習を減少させながら一般化能力を高めることができます。
決定木は、訓練データに対して非常に詳細なルールを作成することができるため、木の深さなどを制限しないと、非常に深く成長してしまいがちです。
この深い成長により、モデルは訓練データのノイズや外れ値まで学習してしまい、結果として新しいデータに対する一般化能力が低下します。つまり、決定木はその性質上、過学習しやすいという問題があります。
ランダム・フォレスト
ランダムフォレストは、バギングに改良を加えたアンサンブル学習の手法です。バギングと同じように、ブートストラップ法で生成されたデータのサブセットを使用して複数の決定木を訓練しますが、ランダムフォレストでは各決定木の成長時に特徴量のランダムな選択が行われます。
具体的には、決定木がデータを分割する条件を決める際に、データセットのすべての特徴量からではなく、ランダムに選ばれた一部の特徴量のみを使用します。
例えば、scikit-learnのデフォルト設定では、特徴量の総数の平方根の数の特徴量をランダムに選択します。16個の特徴量があるデータセットでは、4個の特徴量がランダムに選ばれて分割条件を決めます。よって、残りの12個は無視されます。
このような事をする理由は、一つあるいは少数の変数による条件が強すぎて、他の変数が使われなくなる現象が起こる可能性があるからです。よって単純なバギングのままだと、ほとんどの決定木が同じような判断しかできなくなってしまいます。これでは複数の決定木を使う意味がありません。よって、バリアンスを抑える効果も期待できません。
このようなケースでもランダム・フォレストならランダムに変数を選んで分割条件を決めるので、各決定木がより独立した判断を下すようになり、予測が多様化します。結果として、アンサンブル全体のバリアンスが低減され、一般化能力が向上します。
次回予告
次回は、scikit-learnを使ってランダム・フォレストの実験を行います。
お楽しみに!
