ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

アンサンブル学習のフレームワーク

さまざまな方法を使用して、複数の弱学習器の結果を 1 つの高品質のアンサンブル予測子に融合することができます。これらのメソッドは同じ構文に忠実に従っているため、コマンドで別のメソッドを試す場合でもわずかな変更で済みます。

分類のアンサンブルは fitcensemble を使用して、回帰のアンサンブルは fitrensemble を使用して作成できます。

fitcensemble を使用して分類用のアンサンブルに学習をさせるには、次の構文を使用します。

ens = fitcensemble(X,Y,Name,Value)
  • X は、データの行列です。各行には 1 つの観測値、各列には 1 つの予測子変数が含まれます。

  • Y は応答のベクトルで、X の行で表される観測値の数と同じ数になります。

  • Name,Value では、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、引数 'Method' でアンサンブル集約法を、引数 'NumLearningCycles' でアンサンブル学習のサイクル数を、引数 'Learners' で弱学習器のタイプを指定できます。名前と値のペアの引数の完全なリストについては、関数 fitcensemble のページを参照してください。

アンサンブル分類を作成するために必要な情報を次の図に示します。

同様に、fitcensemble と同じ構文に従う fitrensemble を使用して、回帰用のアンサンブルに学習をさせることができます。入力引数および名前と値のペアの引数の詳細については、関数 fitrensemble のページを参照してください。

分類または非線形回帰の問題では、次の手順を実行してアンサンブルを作成します。

予測子データの準備

どの教師あり学習法も、このドキュメンテーションでは通常 X と表記されている予測子データから始まります。X は行列またはテーブルに格納できます。X の各行は 1 つの観測値を、X の各列は 1 つの変数または予測子を表します。

応答データの準備

応答データには、さまざまなデータ型を使用できます。

  • アンサンブル回帰の場合、YX の行数と同じ数の要素をもつ数値ベクトルでなければなりません。

  • アンサンブル分類の場合、Y には、次の表に示す任意のデータ型を使用できます。この表では、欠損値を表現する方法も示しています。

    データ型欠損値
    数値ベクトルNaN
    categorical ベクトル<undefined>
    文字配列空白行
    文字ベクトルの cell 配列''
    logical ベクトル(表現されない)

    fitcensemblefitrensemble は、アンサンブルを作成するときに Y の欠損値を無視します。

たとえば、応答データに 3 つの観測、truefalsetrue がこの順序で含まれているとします。この場合、Y は次のように表現できます。

  • [1;0;1] (数値ベクトル)

  • nominal({'true','false','true'}) (categorical ベクトル)

  • [true;false;true] (logical ベクトル)

  • ['true ';'false';'true '] (各行が同じ長さになるように空白が埋め込まれた、文字配列)

  • {'true','false','true'} (文字ベクトルの cell 配列)

最も適切なデータ型を使用してください。欠損値は論理エントリでは表現できないため、Y に欠損値が存在するときには論理エントリは使用しないでください。

適用するアンサンブル集約法の選択

fitcensemblefitrensemble でそれぞれアンサンブル分類とアンサンブル回帰を作成するには、次のリストから適切なアルゴリズムを選択します。

  • 2 つのクラスによる分類:

    • 'AdaBoostM1'

    • 'LogitBoost'

    • 'GentleBoost'

    • 'RobustBoost' (Optimization Toolbox™ が必要)

    • 'LPBoost' (Optimization Toolbox が必要)

    • 'TotalBoost' (Optimization Toolbox が必要)

    • 'RUSBoost'

    • 'Subspace'

    • 'Bag'

  • 3 つ以上のクラスによる分類:

    • 'AdaBoostM2'

    • 'LPBoost' (Optimization Toolbox が必要)

    • 'TotalBoost' (Optimization Toolbox が必要)

    • 'RUSBoost'

    • 'Subspace'

    • 'Bag'

  • 回帰:

    • 'LSBoost'

    • 'Bag'

各アルゴリズムの説明については、アンサンブル アルゴリズムを参照してください。

適切なアンサンブル アルゴリズムの選択に関するヒントを参照してください。

次の表は、各アルゴリズムの特徴の一覧です。この表では、以下のように表記されています。

  • Regress.— 回帰

  • Classif.— 分類

  • Preds.— 予測子

  • Imbalance — 不均衡な (あるクラスの観測値数が他のクラスよりはるかに多い) データの場合に適切

  • Stop — アルゴリズムが自動終了

  • Sparse — 必要な弱学習器の数が他のアンサンブル アルゴリズムより少ない

アルゴリズムRegress.Binary Classif.Binary Classif.Multi- Level Preds.Classif.3+ Classesクラスの不均衡停止Sparse
Bag×× ×   
AdaBoostM1 ×     
AdaBoostM2   ×   
LogitBoost ××    
GentleBoost ××    
RobustBoost ×     
LPBoost × × ××
TotalBoost × × ××
RUSBoost × ××  
LSBoost×      
Subspace × ×   

RobustBoostLPBoostTotalBoost には Optimization Toolbox ライセンスが必要です。LPBoost の前に TotalBoost を使用してみてください。TotalBoost の方がロバストな場合があります。

適切なアンサンブル アルゴリズムの選択に関するヒント

  • 回帰LSBoost または Bag を選択します。ブースティングとバギングの主な違いについては、アンサンブル アルゴリズムの一般的な特徴を参照してください。

  • バイナリ分類 — まず AdaBoostM1 を選択し、次のように変更します。

    データの特徴推奨アルゴリズム
    予測子が多数あるSubspace
    データが歪んでいる (1 つのクラスだけに観測が多数ある)RUSBoost
    カテゴリカル予測子のレベル数が 31 を超えているLogitBoost または GentleBoost
    ラベル ノイズ (一部の学習データのクラスが誤っている)RobustBoost
    観測が多数あるLPBoostTotalBoostBag は使用しない
  • マルチクラス分類 — まず AdaBoostM2 を選択し、次のように変更します。

    データの特徴推奨アルゴリズム
    予測子が多数あるSubspace
    データが歪んでいる (1 つのクラスだけに観測が多数ある)RUSBoost
    観測が多数あるLPBoostTotalBoostBag は使用しない

これらのアルゴリズムの詳細は、アンサンブル アルゴリズムを参照してください。

アンサンブル アルゴリズムの一般的な特徴

  • Bag では一般的に深いツリーが作成されます。この作成処理は時間がかかり、メモリの消費量も非常に多くなります。このため、予測は比較的低速になります。

  • Boost アルゴリズムでは一般的に非常に浅いツリーが使用されます。この作成処理にかかる時間は比較的短く、メモリの消費量も少なくなります。ただし、効果的な予測を行うには、ブースティング ツリーで必要なアンサンブル メンバーの数がバギング ツリーの場合より多くなることがあります。そのため、どちらのアルゴリズムが優れているかは一概には言えません。

  • Bag では、追加の交差検証を行わずに汎化誤差を推定できます。oobLoss を参照してください。

  • Subspace を除くすべてのブースティングおよびバギング アルゴリズムは決定木学習器に基づいています。Subspace では判別分析または k 最近傍法学習器を使用できます。

各アンサンブル メンバーの特徴の詳細は、分類アルゴリズムの特性を参照してください。

アンサンブル メンバー数の設定

速度と精度のバランスが適切に保たれるアンサンブルのサイズを選択します。

  • アンサンブルのサイズが大きいと、学習や予測の生成に時間がかかります。

  • アンサンブル アルゴリズムのタイプによっては、サイズが大きすぎると、過学習になる (精度が低下する) 可能性があります。

適切なサイズを設定するには、アンサンブルのメンバー数を数十から数百程度から開始して、アンサンブルを学習させ、その後でアンサンブル品質テストで説明している方法でアンサンブル品質をチェックします。メンバー数を増やす必要があると判断できる場合は、コマンド ラインで resume メソッド (分類木の場合)、または resume メソッド (回帰木の場合) を使用します。メンバーを追加してもアンサンブル品質が改善されなくなるまで手順を繰り返します。

ヒント

分類上、LPBoostTotalBoost アルゴリズムは自動終了型です。そのため、適切なアンサンブル サイズを調べる必要はありません。NumLearningCycles500 に設定してみてください。アルゴリズムは通常、これより少ないメンバーで終了します。

弱学習器の準備

現在、弱学習器タイプには次のものがあります。

  • 'Discriminant' (Subspace アンサンブルに推奨されます)

  • 'KNN' (Subspace アンサンブルのみ対象)

  • 'Tree' (Subspace を除くすべてのアンサンブル用)

アンサンブルにおける弱学習器のタイプを設定する方法には、次の 2 つがあります。

  • 既定の弱学習器オプションでアンサンブルを作成するには、名前と値のペアの引数 'Learners' の値として弱学習器の名前の文字ベクトルを指定します。次に例を示します。

    ens = fitcensemble(X,Y,'Method','Subspace','NumLearningCycles',50,'Learners','KNN');
    % or
    ens = fitrensemble(X,Y,'Method','Bag','NumLearningCycles',50,'Learners','Tree');
  • 既定の設定でない弱学習器オプションでアンサンブルを作成するには、適切な template メソッドを使用して既定の設定でない弱学習器を作成します。

    たとえば、欠損データがあり、精度を向上させるため代理分岐がある分類木を使用する場合は次のようにします。

    templ = templateTree('Surrogate','all');
    ens = fitcensemble(X,Y,'Method','AdaBoostM2','NumLearningCycles',50,'Learners',templ);

    標本サイズの少なくとも 10% の観測数がリーフに含まれている木を成長させるには、次のようにします。

    templ = templateTree('MinLeafSize',size(X,1)/10);
    ens = fitcensemble(X,Y,'Method','AdaBoostM2','NumLearningCycles',50,'Learners',templ);

    あるいは、木ごとの最大分割数を選択します。

    templ = templateTree('MaxNumSplits',4);
    ens = fitcensemble(X,Y,'Method','AdaBoostM2','NumLearningCycles',50,'Learners',templ);

    fitrensemble では、既定以外の弱学習器も使用できます。

学習器テンプレートの cell 配列を fitcensemblefitrensemble に渡すことができますが、最も一般的な使用法は 1 つの弱学習器テンプレートだけを渡すことです。

テンプレートの使用例は、不均衡な分類コストによるアンサンブルの学習代理分岐を参照してください。

決定木では、XNaN 値を処理できます。このような値を "欠損している" と呼びます。X 行の一部に欠損値が存在する場合は、決定木は欠損していない値のみを使用して最適分割を検出します。行全体が NaN で構成されている場合、fitcensemblefitrensemble はその行を無視します。X のデータに含まれる欠損値の比率が高い場合は、代理決定分岐を使用します。代理分岐の例は、不均衡な分類コストによるアンサンブルの学習代理分岐を参照してください。

ツリー弱学習器の一般的な設定

  • 弱学習器のツリーの深さによって、学習時間、メモリ使用量および予測精度が変化します。次のパラメーターで深さを制御します。

    • MaxNumSplits ― 枝ノード分割の最大数は、ツリーあたり MaxNumSplits です。MaxNumSplits に大きい値を設定するとツリーが深くなります。バギングの既定値は size(X,1) - 1 です。ブースティングの既定値は 1 です。

    • MinLeafSize — 各リーフには少なくとも MinLeafSize の観測値があります。MinLeafSize に小さい値を設定するとツリーが深くなります。分類の既定値は 1、回帰の既定値は 5 です。

    • MinParentSize — ツリーの各分岐ノードには少なくとも MinParentSize の観測値があります。MinParentSize に小さい値を設定するとツリーが深くなります。分類の既定値は 2、回帰の既定値は 10 です。

    MinParentSizeMinLeafSize の両方を指定した場合、リーフが大きくなるツリー (浅いツリー) を生成する設定が学習器で使用されます。

    MinParent = max(MinParent,2*MinLeaf)

    MaxNumSplits をさらに指定した場合、3 つの分割基準のいずれかが満たされるまでツリーが分割されます。

  • SurrogateSurrogate'on' のときに、代理分岐をもつ決定木を成長させます。代理分岐はデータに欠損値があるときに使用します。

    メモ

    代理分岐を行うと、学習速度が低下し、メモリ使用量が増えます。

  • PredictorSelectionfitcensemblefitrensemble および TreeBagger は既定で標準 CART アルゴリズム[11]を使用して木を成長させます。予測子変数が異種混合の場合、または一部の予測子に多くのレベルがあり他の予測子はレベルの数が少ない場合、標準 CART は多くのレベルをもつ予測子を分割予測子として選択する傾向にあります。予測子がもつレベルの数に対してロバストな分割予測子選択については、'curvature' または 'interaction-curvature' の指定を検討してください。これらの指定では、各予測子とその応答との間、または各予測子ペアとその応答との間の関連についてのカイ二乗検定を実施します。p 値が最小になる予測子が特定のノードの分割予測子になります。詳細は、分割予測子選択手法の選択を参照してください。

    メモ

    決定木をブースティングする場合、曲率検定または交互作用検定を使用する分割予測子の選択は推奨されません。

fitcensemble または fitrensemble の呼び出し

fitcensemblefitrensemble の構文は同じです。fitrensemble の場合、構文は次のとおりです。

ens = fitrensemble(X,Y,Name,Value)
  • X は、データの行列です。各行には 1 つの観測値、各列には 1 つの予測子変数が含まれます。

  • Y は応答で、X の行で表される観測値の数と同じ数になります。

  • Name,Value では、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、引数 'Method' でアンサンブル集約法を、引数 'NumLearningCycles' でアンサンブル学習のサイクル数を、引数 'Learners' で弱学習器のタイプを指定できます。名前と値のペアの引数の完全なリストについては、関数 fitrensemble のページを参照してください。

fitrensemblefitcensemble の結果は、新しいデータに対する予測の作成に適したアンサンブル オブジェクトです。アンサンブル回帰の作成に関する基本的な例は、アンサンブル回帰に学習をさせるを参照してください。アンサンブル分類の作成に関する基本的な例は、アンサンブル分類に学習をさせるを参照してください。

名前と値のペアを設定する状況

名前と値のペアの引数には、fitcensemble または fitrensemble に渡すことができるものと、弱学習器 (templateDiscriminanttemplateKNNtemplateTree) に適用されるものがあります。どの名前と値のペアの引数がアンサンブルまたは弱学習器に適しているかを判断する基準は次のとおりです。

  • テンプレートの名前と値のペアを使用して、弱学習器の特性を制御します。

  • fitcensemble または fitrensemble の名前と値のペアの引数を使用して、アルゴリズムまたは構造のいずれかについてアンサンブル全体を制御します。

たとえば、ブースティングされた分類木のアンサンブルで各ツリーが既定より深い場合、templateTree の名前と値のペアの引数 MinLeafSize および MinParentSize に既定より小さい値を設定します。または、MaxNumSplits を既定より大きい値にします。すると、ツリーのリーフが多く (ツリーが深く) なります。

アンサンブル分類の予測子の名前を指定するには (アンサンブルの構造の一部にするには)、fitcensemble の名前と値のペア PredictorNames を使用します。

参考

| | | | | | |

関連するトピック