アンサンブル学習:決定木からランダムフォレストへ
アンサンブル学習:ランダムフォレストへ
アンサンブル学習の力を発見する
この記事では、アンサンブル学習について説明します。
まず、決定木モデルから始めて、その後アンサンブル学習を説明し、最後に決定木を基に作成されたアンサンブルであるランダムフォレストモデルについて説明します。
決定木とランダムフォレストの両方について、分類タスクの場合にそれらをどのように実装するかを示すPythonコードを提供します。
決定木モデル
決定木(DT)は、数値変数とカテゴリ変数の両方を扱うことができる非常に柔軟な機械学習モデルで、回帰および分類タスクを実行することができます。
- 「GETMusicに会ってください:統一された表現と拡散フレームワークで、統一された表現と拡散フレームワークを使用して任意の音楽トラックを生成できます」
- 大規模言語モデルの挙動を監視する7つの方法
- 「5つのオンラインAI認定プログラム – 研究と登録」
ここでは、DTモデルを説明し、その学習プロセスと実装方法を少しの数学を交えて説明します。
DTモデルの説明
決定木モデルは、実際の木のように構築されたフローチャートのような機械学習モデルです。葉、ノード、ルート、枝を持っています。
実際の例を使って、決定木モデルの動作と特徴を見てみましょう。仕事に基づいてオフィスに残るか外出するかを決定する必要がある場合を想定してみましょう:
したがって、次の要素があります:
- ルートノード。これはすべての開始点であり、データセット全体を表します。
- 終わりは葉ノード(全てのオレンジ色の長方形)と呼ばれます。木の葉のように、最後にあります。
- 内部ノード。これらは、前のノードによって分割されたノードです。
- 枝。これらは、内部ノードと葉ノードのセットです。実際の木のように。
- 最大の深さは、DTの深さを表します。言い換えると、ルートノードから最後の葉(「家に帰る/パブに行く」)に到達するまでに必要な分割の数を表します。
決定木モデルの基本的なアイデアは、データセットの特徴を使用して決定を下し、データをより小さなサブセットに分割することです。木の各内部ノードは、特徴または属性を表し、枝はその特徴の値に基づく異なる決定またはルールを表します。
葉ノードは最終的な出力を表します:クラス(分類問題の場合)または値(回帰問題の場合)。
このプロセスは、私たち人間がどのように意思決定するかと非常に似ています。では、DTはノードをどのように分割するのでしょうか?言い換えると、DTはどのように意思決定をするのでしょうか?
DTは、すべての葉が純粋である(つまり、すべての内部ノードに少なくとも1つの葉がある)まで分割を続けます。
実際には、これにより非常に深いDTが生成され、多くのノードが生成されることがあり、過学習につながる可能性があります。したがって、通常は最大の深さの制限を設定してツリーを剪定します(これはDTのハイパーパラメータの1つです)。
不純度と情報利得
葉が純粋になるまでDTが分割される方法、つまり意思決定方法を理解するためには、不純度と情報利得の概念を説明するために数学を使用する必要があります。
特に、2種類の不純度があります:エントロピーとジニ不純度。
エントロピー
熱力学では、エントロピーは分子の乱雑さの尺度を表します:エントロピーは、分子が静止して整然としている場合に0です。
機械学習では、我々はエントロピーを使用して不純度を測定し、同様の考え方に従います。エントロピーは次のように定義されます[Ref. 2, page 88]:
分類問題の場合、p(i|t)はノードtに属する例の中でクラスiに属する割合です。
したがって、エントロピーは、特定のノードにあるすべての例が同じクラスに属する場合には0であり、特定のノードで一様なクラス分布がある場合には最大値(最大値は1)となります。
ジニ不純度
ジニ不純度は、特徴量がデータを異なるクラスに分ける能力の尺度です。データセットでランダムに選択した例を誤分類する確率と定義されます。次のように定義します[Ref. 1, page 169]:
したがって、分類問題の場合、p(i|t)はノードtに属する例の中でクラスiに属する割合であるため、ジニ不純度は誤分類の確率を最小化する基準と見なすことができます。なぜなら、以下のような場合には:
全ての例が同じクラスに属していることを意味する場合、:
ノードは純粋である(つまり、インスタンスは前述のとおり同じクラスに属している)ことを意味します。
したがって、ジニ不純度は0から1までの範囲で、0は純粋なデータセット(すべての例が同じクラスに属する)を表し、1は不純なデータセット(例が複数のクラスに属する)を表します。
例を挙げて説明しましょう。クラスAとBの2つのクラスと、データを分割するためのPとQの2つの特徴量があるデータセットがあるとします。特徴量Pのジニ不純度が0.2で、特徴量Qのジニ不純度が0.3である場合、データを分割するために特徴量Pを選択します。なぜなら、ジニ不純度が低く、より純粋なデータの部分集合を生成するからです。
どちらを使用するか?
sklearnでは、デフォルトでジニ不純度が使用されますが、エントロピーを基準に設定することもできます(これはDTのハイパーパラメータです)。実際のところ、エントロピーでDTを訓練したり、ジニ不純度で別のDTを訓練したりすることはあまり意味がありません。
情報利得の最大化
情報利得は、特徴量を選択してデータを分割した後のデータセットの不純度の減少を測る尺度です。実際のところ、決定木の目的は、最も「有意義な」特徴量を選択してデータの最も純粋な部分集合を生成することです。そのため、この目的のために情報利得を使用して特徴量の相対的な品質を決定します。
したがって、情報利得は、特徴量がデータを異なるクラスに分ける能力の尺度であり、最大化したいと考えています。
次のように定義します[Ref. 2, page 88]:
以下のようになります:
- fは分割する特徴量です
- DpとDnは、それぞれ親ノードとn番目の子ノードのデータセットです
- Iは不純度を表します
- NpとNnは、それぞれ親ノードとn番目の子ノードのトレーニング例の総数です
上記の式において、情報利得は親ノードの不純度と子ノードの不純度の合計の差です。つまり、子ノードの不純度が低いほど情報利得は高くなります。
つまり、決定木は情報利得を最大化するために意思決定を行います。つまり、各ノードで不純度を減らすことを目指します。
分類問題の場合の決定木の実装
データセットを作成し、データを標準化し、トレインセットとテストセットに分割し、トレインセットを決定木モデルでフィットさせ、テストセットの混同行列を計算しましょう:
from sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import confusion_matrix# クラス分類用のデータセットを作成するX, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_classes=2, random_state=42)# データを標準化するscaler = StandardScaler()X_scaled = scaler.fit_transform(X)# データセットをトレインセットとテストセットに分割するX_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# トレインセットを決定木モデルでフィットさせるdt_model = DecisionTreeClassifier(random_state=42)dt_model.fit(X_train, y_train)# テストセットの混同行列を計算するy_test_pred = dt_model.predict(X_test)test_confusion_matrix = confusion_matrix(y_test, y_test_pred)print("混同行列(テストセット):\n", test_confusion_matrix)
結果は以下のようになります:
混同行列(テストセット): [[103 9] [ 12 76]]
これは非対角成分である偽陽性と偽陰性を表す値が非常に少ないため、かなり良い結果です。
アンサンブル学習
ML問題を解決する際、通常はデータ上で異なるMLモデルをテストし、新たな未知のデータに対してより良い予測または分類を行うモデルを見つけます。
ML問題の解決策を改善する方法の一つは、いくつかのモデルを組み合わせて単一のモデルにすることです。これをアンサンブル学習と呼びます。
グループまたはアンサンブルは、常に個々のモデルよりも優れたパフォーマンスを発揮します。
これがどのように機能するか見てみましょう。
投票の原則
分類の例を考えてみましょう。バイナリ分類問題の場合、サポートベクターマシンと決定木をトレーニングした結果、両方の分類器の正解率は約80%です。つまり、両方の分類器が80%のケースで正しいクラスを予測しています。
アンサンブルメソッドの目標は、異なるメソッドを組み合わせて、個々の分類器よりも優れた一つの分類器を作成することです。しかし、異なる分類器を組み合わせて作成されたメタクラス分類器が個々の分類器よりも優れた汎化性能を持つことは、どのようにして可能なのでしょうか?
アンサンブル学習は「大数の法則」に基づいています。これを理解するために、例を挙げましょう[Ref.1, page 183]:
「51%の確率で表が出るバイアスのあるコインがあると仮定しましょう。このコインを1,000回投げると、510回の表と490回の裏が出るため、多数派は表となります。計算すると、コインを1,000回投げると表が出る確率は約75%に近づきます。これは大数の法則によるものです。コインを投げ続けると、表の割合が表の確率(51%)に近づいていくからです。」
アンサンブル学習は、異なる分類器を組み合わせる際にこの原理を活用します。実際、アンサンブル分類器を作成するための簡単な方法は、トレーニングされた各分類器の予測を集計し、最も多くの票を獲得したクラスを予測することです。これを多数決原理と呼びます。
多数決原理の理解を深めるために、図を作成しましょう。与えられたデータセットに対してSVMとDTをトレーニングしたとしましょう。多数決原理は次のように機能します:
どのような種類の分類器でも組み合わせることができますが、このような原理は独立した分類器と組み合わせる方が効果的です。なぜなら、各独立した分類器は他の分類器と相関しないエラーを生成するからです。言い換えると、アンサンブル内の各分類器はデータの異なる側面を捉えることができ、それらの予測を組み合わせることで、個々の分類器よりもより正確な予測ができるからです。
多数決原理の数学的背景
多数決原理がどのように機能するかを数学的に示すために、分類の例を使用しましょう。
異なる分類器を組み合わせるアルゴリズムを実装することで、それぞれの分類器に関連付けられた信頼度の重みを考慮したメタ分類器を構築することが目標です。重み付き多数決を以下のように作成できます [Ref. 2, page 209]:
ここで:
- 「y」はアンサンブルの予測クラスを表します。
- 「Wj」は特定の分類器「Cj」に関連付けられた重みを表します。
- 「Fa」は、j番目の分類器の予測クラスがiと一致する場合に1を返す関数です。
arg max関数は最大の引数を返します。
各分類器に対して重みが等しい場合、次のようになります:
統計学では、モードはデータセット内で最も頻繁に現れる値です。この場合、y^は単にクラス分類器の出力のモードです。
したがって、次のような二値分類問題を考えると:
- C1(x) → 1
- C2(x) → 0
- C3(x) → 0
次のようになります:
ここで、次のように分類器にいくつかの重みを割り当てましょう:
- C1(x) → 1, W1=0.6
- C2(x) → 0, W2=0.2
- C3(x) → 0, W3=0.2
この場合、C1による予測は他の分類器よりも重みが大きいため、アンサンブルによって予測されるクラスは1となります。
つまり、W1=0.6はC2およびC3の重みの3倍であり、0.6=3⋅0.20.6となります。つまり、C1は他の2つの分類器の重みの3倍であり、アンサンブルの予測も次の式で計算できます:
バギングとペースティングによるアンサンブル
バギングはブートストラップ集約という意味の略です。
統計学では、ブートストラップ集約は置換を伴うランダム抽出を使用する任意のテストです。 置換とは、個々のデータポイントが複数回選ばれることを意味します。
一方、ペースティングは置換を使用しないランダムサンプリング技術です。ペースティングは置換を適用しないため、個々のデータポイントは一度だけ選ばれます。
バギングのプロセスを明確にするために、次のスキームを使用しましょう:
上記の場合、私たちはトレーニングセットから5つのサンプルを取り、バギング技術を使用してそれらを3つの分類器/回帰器に供給しました。つまり、トレーニングセットから同じサンプルを複数回使用することができます。
各サブセットには一定数の重複したサブセットが含まれており、一部の元のサブセットがすべての再サンプリングサブセットに表示されないことに注意してください。これは置換のためです。明確にするために言いますと、分類器/回帰器1には、サブセット番号5が存在しません。他の分類器/回帰器も同様です。
ランダムフォレストモデル
残念ながら、DT(決定木)は高い分散を持っており、その分散を制限するために深さを制限することができます。
また、DT(決定木)はデータの各分割に対して予測を調整します。つまり、深くなるほど、過学習の可能性が高くなります。
DT(決定木)の高い分散に対処するために、DT(決定木)をエンサンブル化することで強化する解決策があります。これがランダムフォレストモデルの誕生です。
DT(決定木)の上にRFモデルを構築する
アンサンブル手法は、過学習に対する優れたパフォーマンスのために、機械学習の分野で最近人気が高まっています。
ランダムフォレスト(RF)は、分類と回帰の両方のタスクを実行できる機械学習モデルであり、バギング法を用いた決定木のアンサンブルとして構築されます。これは、RFがDT(決定木)のすべてのハイパーパラメータを持っているだけでなく、アンサンブル自体を制御するためのバギング分類器/回帰器のハイパーパラメータも持っていることを意味します。
RFモデルの作成プロセスを可視化しましょう:
したがって、ここでは初期トレーニングデータの部分サンプルを置換して決定木の森を育てています。
また、RFモデルは、ノードを分割する際に最適な特徴を検索する代わりに、特徴のランダムなサブセット間で最適な特徴を検索することで、追加のランダム性を導入します。これにより、バイアスが高く分散が低いため、単一のDT(決定木)に比べてより優れたモデルが得られます。
言い換えると、ノードを分割する際、DT(決定木)はすべての可能な特徴を考慮し、サブノード間の最も分離を生み出す特徴を選択します。一方、RFモデルの場合、各ツリーは特徴のランダムなサブセットのみを選択することができます。これによりツリー間のランダム性と変動性が増し、各ツリーの独立性と多様性が高まります。
このコンセプトを可視化しましょう:
したがって、5つの特徴を持つデータセットがあるとしましょう。RFモデルのツリーをチェックすると、次のことがわかります:
- DT 1は特徴1、特徴3、および特徴5を考慮します。
- DT 2は特徴1、特徴4、および特徴5を考慮します。
- DT 3は特徴2、特徴3、および特徴4を考慮します。
これらの特徴は、私たちのRFの各DTに対してランダムに選択されます。
以前に、すべての特徴を使用して単一のDTをトレーニングし、ノードを分割するための最適な特徴は特徴2であることがわかりました。ただし、DT 1とDT 2は特徴2でトレーニングすることができないため、それぞれ特徴3と特徴4でトレーニングする必要があります(上の画像で太字で表示されています)。
結果として、初期データの異なるランダムなサブセットにトレーニングされた木が得られますが、特徴のランダムなサブセットでも、置換なしでトレーニングされます。
一般的に、RFはDTと同じレベルの解釈可能性を持っていませんが、RFの大きな利点は、ハイパーパラメータにあまり心配する必要がないことです。たとえば、RFを剪定する必要がないことが一般的です。なぜなら、アンサンブルはモデルを作成するDTの予測を平均化することによるノイズに対して頑健であるからです。
RFを作成する木の数は、注意する必要がある典型的なパラメータです。より多くの木を使用すると、より高い演算コスト(時間とハードウェアリソース)がかかりますが、より良い性能が得られる場合があります。
RFの実装
DTを使用した場合と結果を比較するために、同じデータセットを使用してランダムフォレストを使用する場合を考えましょう:
from sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import confusion_matrix# クラス分類のデータセットを作成X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_classes=2, random_state=42)# データをStandardScalerで標準化scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# データセットをトレーニングセットとテストセットに分割X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# トレーニングセットにランダムフォレストモデルを適合rf_model = RandomForestClassifier(n_estimators=100, random_state=42)rf_model.fit(X_train, y_train)# テストセットの混同行列を計算y_test_pred = rf_model.predict(X_test)test_confusion_matrix = confusion_matrix(y_test, y_test_pred)print("混同行列(テストセット):\n", test_confusion_matrix)
結果は以下の通りです:
混同行列(テストセット): [[106 6] [ 5 83]]
上記のように、RFのパフォーマンスは単一のDTよりも優れています。この混同行列には、非対角要素(FP&FN)が少なく、対角要素(TP&TN)が多いためです。
結論
この記事では、DTモデルから始まり、RFに至るまでアンサンブル学習が単一のMLモデルのパフォーマンスを改善する方法について説明しました。
参考文献:
[1]: Hands-On Machine Learning with Scikit-Learn & Tensorflow. Aurelien Gueron
[2]: Machine Learning with PyTorch ans Scikit-learn. Sebastian Raschka, Yuxi Liu, Vahid Mirjalili
注:ページ番号が明示されていない場合でも、参考文献は[1]および[2]に従う必要があります。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles