アンサンブル学習のフレームワーク
さまざまな方法を使用して、複数の弱学習器の結果を 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'
3 つ以上のクラスによる分類:
'AdaBoostM2'
'LPBoost'
(Optimization Toolbox が必要)'TotalBoost'
(Optimization Toolbox が必要)'RUSBoost'
'Subspace'
'Bag'
回帰:
'LSBoost'
'Bag'
各アルゴリズムの説明については、アンサンブル アルゴリズムを参照してください。
適切なアンサンブル アルゴリズムの選択に関するヒントを参照してください。
次の表は、各アルゴリズムの特徴の一覧です。この表では、以下のように表記されています。
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 アルゴリズム[11]を使用して木を成長させます。予測子変数が異種混合の場合、または一部の予測子に多くのレベルがあり他の予測子はレベルの数が少ない場合、標準 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
を使用します。
参考
fitcensemble
| fitrensemble
| oobLoss
| resume
| resume
| templateDiscriminant
| templateKNN
| templateTree