アンサンブル学習のフレームワーク
さまざまな方法を使用して、複数の弱学習器の結果を 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 つの変数または予測子を表します。
応答データの準備
応答データには、さまざまなデータ型を使用できます。
アンサンブル回帰の場合、
YはXの行数と同じ数の要素をもつ数値ベクトルでなければなりません。アンサンブル分類の場合、
Yは数値ベクトル、categorical ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、logical ベクトルが可能です。たとえば、応答データに 3 つの観測、
true、false、trueがこの順序で含まれているとします。この場合、Yは次のように表現できます。[1;0;1](数値ベクトル)categorical({'true','false','true'})(categorical ベクトル)[true;false;true](logical ベクトル)['true ';'false';'true '](各行が同じ長さになるように空白が埋め込まれた、文字配列)["true","false","true"](string 配列){'true','false','true'}(文字ベクトルの cell 配列)
最も適切なデータ型を使用してください。欠損値は論理エントリでは表現できないため、
Yに欠損値が存在するときには論理エントリは使用しないでください。
fitcensemble と fitrensemble は、アンサンブルを作成するときに Y の欠損値を無視します。次の表は、欠損値を表現する方法を示しています。
| データ型 | 欠損値 |
|---|---|
| 数値ベクトル | NaN |
| categorical ベクトル | <undefined> |
| 文字配列 | 空白行 |
| string 配列 | <missing> または "" |
| 文字ベクトルの cell 配列 | '' |
| logical ベクトル | (表現されない) |
適用するアンサンブル集約法の選択
fitcensemble と fitrensemble でそれぞれアンサンブル分類とアンサンブル回帰を作成するには、次のリストから適切なアルゴリズムを選択します。
2 つのクラスによる分類:
'AdaBoostM1'— 適応ブースティング'LogitBoost'— 適応ロジスティック回帰'GentleBoost'— ジェントル適応ブースティング'RobustBoost'— ロバスト ブースティング (Optimization Toolbox™ が必要)'LPBoost'— 線形計画ブースティング (Optimization Toolbox が必要)'TotalBoost'— 完全補正ブースティング (Optimization Toolbox が必要)'RUSBoost'— ランダム アンダーサンプリング ブースティング'Subspace'— ランダム部分空間'Bag'— bootstrap aggregation (バギング)
3 つ以上のクラスによる分類:
'AdaBoostM2'— 適応ブースティング'LPBoost'— 線形計画ブースティング (Optimization Toolbox が必要)'TotalBoost'— 完全補正ブースティング (Optimization Toolbox が必要)'RUSBoost'— ランダム アンダーサンプリング ブースティング'Subspace'— ランダム部分空間'Bag'— bootstrap aggregation (バギング)
回帰:
'LSBoost'— 最小二乗ブースティング'Bag'— bootstrap aggregation (バギング)
各アルゴリズムの説明については、アンサンブル アルゴリズムを参照してください。
適切なアンサンブル アルゴリズムの選択に関するヒントを参照してください。
次の表は、各アルゴリズムの特徴の一覧です。この表では、以下のように表記されています。
Imbalance — 不均衡な (あるクラスの観測値数が他のクラスよりはるかに多い) データの場合に適切
Stop — アルゴリズムが自動終了
Sparse — 必要な弱学習器の数が他のアンサンブル アルゴリズムより少ない
| アルゴリズム | 回帰 | バイナリ分類 | マルチクラス分類 | クラスの不均衡 | 停止 | Sparse |
|---|---|---|---|---|---|---|
Bag | × | × | × | |||
AdaBoostM1 | × | |||||
AdaBoostM2 | × | |||||
LogitBoost | × | |||||
GentleBoost | × | |||||
RobustBoost | × | |||||
LPBoost | × | × | × | × | ||
TotalBoost | × | × | × | × | ||
RUSBoost | × | × | × | |||
LSBoost | × | |||||
Subspace | × | × |
RobustBoost、LPBoost と TotalBoost には Optimization Toolbox ライセンスが必要です。LPBoost の前に TotalBoost を使用してみてください。TotalBoost の方がロバストな場合があります。
適切なアンサンブル アルゴリズムの選択に関するヒント
回帰 —
LSBoostまたはBagを選択します。ブースティングとバギングの主な違いについては、アンサンブル アルゴリズムの一般的な特徴を参照してください。バイナリ分類 — まず
AdaBoostM1を選択し、次のように変更します。データの特徴 推奨アルゴリズム 予測子が多数ある Subspaceデータが歪んでいる (1 つのクラスだけに観測が多数ある) RUSBoostラベル ノイズ (一部の学習データのクラスが誤っている) RobustBoost観測が多数ある LPBoostとTotalBoostは使用しないマルチクラス分類 — まず
AdaBoostM2を選択し、次のように変更します。データの特徴 推奨アルゴリズム 予測子が多数ある Subspaceデータが歪んでいる (1 つのクラスだけに観測が多数ある) RUSBoost観測が多数ある LPBoostとTotalBoostは使用しない
これらのアルゴリズムの詳細は、アンサンブル アルゴリズムを参照してください。
アンサンブル アルゴリズムの一般的な特徴
Boostアルゴリズムでは一般的に非常に浅いツリーが使用されます。この作成処理にかかる時間は比較的短く、メモリの消費量も少なくなります。ただし、効果的な予測を行うには、ブースティング木で必要なアンサンブル メンバーの数がバギング木の場合より多くなることがあります。そのため、どちらのアルゴリズムが優れているかは一概には言えません。Bagでは一般的に深いツリーが作成されます。この作成処理は時間がかかり、メモリの消費量も非常に多くなります。このため、予測は比較的低速になります。Bagでは、追加の交差検証を行わずに汎化誤差を推定できます。oobLossを参照してください。Subspaceを除くすべてのブースティングおよびバギング アルゴリズムは決定木学習器に基づいています。Subspaceでは判別分析または k 最近傍法学習器を使用できます。
各アンサンブル メンバーの特徴の詳細は、分類アルゴリズムの特性を参照してください。
アンサンブル メンバー数の設定
速度と精度のバランスが適切に保たれるアンサンブルのサイズを選択します。
アンサンブルのサイズが大きいと、学習や予測の生成に時間がかかります。
アンサンブル アルゴリズムのタイプによっては、サイズが大きすぎると、過学習になる (精度が低下する) 可能性があります。
適切なサイズを設定するには、アンサンブルのメンバー数を数十から数百程度から開始して、アンサンブルを学習させ、その後でアンサンブル品質テストで説明している方法でアンサンブル品質をチェックします。メンバー数を増やす必要があると判断できる場合は、コマンド ラインで resume メソッド (分類木の場合)、または resume メソッド (回帰木の場合) を使用します。メンバーを追加してもアンサンブル品質が改善されなくなるまで手順を繰り返します。
ヒント
分類上、LPBoost と TotalBoost アルゴリズムは自動終了型です。そのため、適切なアンサンブル サイズを調べる必要はありません。NumLearningCycles を 500 に設定してみてください。アルゴリズムは通常、これより少ないメンバーで終了します。
弱学習器の準備
現在、弱学習器タイプには次のものがあります。
'Discriminant'(Subspaceアンサンブルに推奨されます)'KNN'(Subspaceアンサンブルのみ対象)'Tree'(Subspaceを除くすべてのアンサンブル用)
アンサンブルにおける弱学習器のタイプを設定する方法には、次の 2 つがあります。
既定の弱学習器オプションでアンサンブルを作成するには、名前と値のペアの引数
'Learners'の値として弱学習器の名前の文字ベクトルまたは string スカラーを指定します。以下に例を示します。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 配列を fitcensemble と fitrensemble に渡すことができますが、最も一般的な使用法は 1 つの弱学習器テンプレートだけを渡すことです。
テンプレートの使用例は、アンサンブル分類における不均衡データまたは一様ではない誤分類コストの処理と代理分岐を参照してください。
決定木では、X の NaN 値を処理できます。このような値を "欠損している" と呼びます。X 行の一部に欠損値が存在する場合は、決定木は欠損していない値のみを使用して最適分割を検出します。行全体が NaN で構成されている場合、fitcensemble と fitrensemble はその行を無視します。X のデータに含まれる欠損値の比率が高い場合は、代理決定分岐を使用します。代理分岐の例は、アンサンブル分類における不均衡データまたは一様ではない誤分類コストの処理と代理分岐を参照してください。
木弱学習器の一般的な設定
弱学習器の木の深さによって、学習時間、メモリ使用量および予測精度が変化します。次のパラメーターで深さを制御します。
MaxNumSplits― 枝ノード分割の最大数は、ツリーあたりMaxNumSplitsです。MaxNumSplitsに大きい値を設定するとツリーが深くなります。バギングの既定値はsize(X,1) - 1です。ブースティングの既定値は1です。MinLeafSize— 各リーフには少なくともMinLeafSizeの観測値があります。MinLeafSizeに小さい値を設定するとツリーが深くなります。分類の既定値は1、回帰の既定値は5です。MinParentSize— ツリーの各枝ノードには少なくともMinParentSizeの観測値があります。MinParentSizeに小さい値を設定するとツリーが深くなります。分類の既定値は2、回帰の既定値は10です。
MinParentSizeとMinLeafSizeの両方を指定した場合、リーフが大きくなる木 (浅い木) を生成する設定が学習器で使用されます。MinParent = max(MinParent,2*MinLeaf)MaxNumSplitsをさらに指定した場合、3 つの分割基準のいずれかが満たされるまでツリーが分割されます。Surrogate—Surrogateが'on'のときに、代理分岐をもつ決定木を成長させます。代理分岐はデータに欠損値があるときに使用します。メモ
代理分岐を行うと、学習速度が低下し、メモリ使用量が増えます。
PredictorSelection—fitcensemble、fitrensembleおよびTreeBaggerは既定で標準 CART アルゴリズム[1]を使用して木を成長させます。予測子変数が異種混合の場合、または一部の予測子に多くのレベルがあり他の予測子はレベルの数が少ない場合、標準 CART は多くのレベルをもつ予測子を分割予測子として選択する傾向にあります。予測子がもつレベルの数に対してロバストな分割予測子選択については、'curvature'または'interaction-curvature'の指定を検討してください。これらの指定では、各予測子とその応答との間、または各予測子ペアとその応答との間の関連についてのカイ二乗検定を実施します。p 値が最小になる予測子が特定のノードの分割予測子になります。詳細は、分割予測子選択手法の選択を参照してください。メモ
決定木をブースティングする場合、曲率検定または交互作用検定を使用する分割予測子の選択は推奨されません。
fitcensemble または fitrensemble の呼び出し
fitcensemble と fitrensemble の構文は同じです。fitrensemble の場合、構文は次のとおりです。
ens = fitrensemble(X,Y,Name,Value)
Xは、データの行列です。各行には 1 つの観測値、各列には 1 つの予測子変数が含まれます。Yは応答で、Xの行で表される観測値の数と同じ数になります。Name,Valueでは、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、引数'Method'でアンサンブル集約法を、引数'NumLearningCycles'でアンサンブル学習のサイクル数を、引数'Learners'で弱学習器のタイプを指定できます。名前と値のペアの引数の完全なリストについては、関数fitrensembleのページを参照してください。
fitrensemble と fitcensemble の結果は、新しいデータに対する予測の作成に適したアンサンブル オブジェクトです。アンサンブル回帰の作成に関する基本的な例は、アンサンブル回帰に学習をさせるを参照してください。アンサンブル分類の作成に関する基本的な例は、アンサンブル分類に学習をさせるを参照してください。
名前と値のペアを設定する状況
名前と値のペアの引数には、fitcensemble または fitrensemble に渡すことができるものと、弱学習器 (templateDiscriminant、templateKNN、templateTree) に適用されるものがあります。どの名前と値のペアの引数がアンサンブルまたは弱学習器に適しているかを判断する基準は次のとおりです。
テンプレートの名前と値のペアを使用して、弱学習器の特性を制御します。
fitcensembleまたはfitrensembleの名前と値のペアの引数を使用して、アルゴリズムまたは構造のいずれかについてアンサンブル全体を制御します。
たとえば、ブースティング分類木のアンサンブルで各ツリーが既定より深い場合、templateTree の名前と値のペアの引数 MinLeafSize および MinParentSize に既定より小さい値を設定します。または、MaxNumSplits を既定より大きい値にします。すると、ツリーのリーフが多く (ツリーが深く) なります。
アンサンブル分類の予測子の名前を指定するには (アンサンブルの構造の一部にするには)、fitcensemble の名前と値のペア PredictorNames を使用します。
参照
[1] Breiman, L., J. H. Friedman, R. A. Olshen, and C. J. Stone. Classification and Regression Trees. Boca Raton, FL: Chapman & Hall, 1984.
参考
fitcensemble | fitrensemble | oobLoss | resume | resume | templateDiscriminant | templateKNN | templateTree