ドキュメンテーション

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

fitensemble

アンサンブル学習器を分類および回帰用に準備

fitensemble は、決定木学習器または判別分析分類器のブースティングまたはバギングを行うことができます。また、KNN のランダム部分空間アンサンブルまたは判別分析分類器に学習をさせることもできます。

よりシンプルなインターフェイスでアンサンブル分類およびアンサンブル回帰をあてはめるには、それぞれ fitcensemble および fitrensemble を代わりに使用します。また、fitcensemblefitrensemble にはベイズ最適化のためのオプションもあります。

構文

Mdl = fitensemble(Tbl,ResponseVarName,Method,NLearn,Learners)
Mdl = fitensemble(Tbl,formula,Method,NLearn,Learners)
Mdl = fitensemble(Tbl,Y,Method,NLearn,Learners)
Mdl = fitensemble(X,Y,Method,NLearn,Learners)
Mdl = fitensemble(___,Name,Value)

説明

Mdl = fitensemble(Tbl,ResponseVarName,Method,NLearn,Learners) は、NLearn 個の分類学習器または回帰学習器のアンサンブル (Learners) をテーブル Tbl 内のすべての変数にあてはめた結果が格納されている学習済みのアンサンブル モデル オブジェクトを返します。ResponseVarName は、Tbl 内の応答変数の名前です。Method は、アンサンブル集約法です。

Mdl = fitensemble(Tbl,formula,Method,NLearn,Learners) は、formula で指定されたモデルをあてはめます。

Mdl = fitensemble(Tbl,Y,Method,NLearn,Learners) は、Tbl 内の変数をすべて予測子変数として扱います。Y は、Tbl に含まれていない応答変数です。

Mdl = fitensemble(X,Y,Method,NLearn,Learners) は、X 内の予測子データと Y 内の応答データを使用してアンサンブルに学習をさせます。

Mdl = fitensemble(___,Name,Value) は、1 つ以上の Name,Value ペア引数で指定された追加オプションと前の構文のいずれかを使用して、アンサンブルに学習をさせます。たとえば、クラスの順序、10 分割交差検証の実施、学習率を指定できます。

すべて折りたたむ

学習されたブースティング アンサンブル分類の決定木について、再代入損失を推定します。

ionosphere データセットを読み込みます。

load ionosphere;

AdaBoost、学習サイクル 100 およびデータセット全体を使用して、決定木アンサンブルを学習させます。

ClassTreeEns = fitensemble(X,Y,'AdaBoostM1',100,'Tree');

ClassTreeEns は学習させた ClassificationEnsemble アンサンブル分類器です。

累積再代入損失 (学習データのラベルの累積誤分類誤差) を特定します。

rsLoss = resubLoss(ClassTreeEns,'Mode','Cumulative');

rsLoss は 100 行 1 列のベクトルです。要素 k には最初の k 学習サイクルの後の再代入損失が格納されます。

学習サイクル数の上に累積再代入損失をプロットします。

plot(rsLoss);
xlabel('Number of Learning Cycles');
ylabel('Resubstitution Loss');

一般的に、学習させたアンサンブル分類の決定木の数が増加すると、再代入損失は減少します。

再代入損失の減少は、アンサンブル学習が十分に行われていることを示す可能性もあります。ただし、この減少からアンサンブルの予測力を推定することはできません。アンサンブルの予測力を測定するには、次の方法で汎化誤差を推定します。

  1. データを学習セットと交差検証セットに無作為に分割します。この操作を行うには、fitensemble を使用してアンサンブルを学習させる際に 'holdout',holdoutProportion を指定します。

  2. 学習させたアンサンブルを kfoldLoss に渡します。これにより、汎化誤差が推定されます。

学習およびブースティングされたアンサンブル回帰木を使用して、自動車の燃費を予測します。予測子として気筒数、気筒ごとの排気量、馬力、重量を選択します。次に、予測子の数を減らしてアンサンブルに学習をさせ、初めのアンサンブルに対して標本内予測精度を比較します。

carsmall データセットを読み込みます。学習データをテーブルに格納します。

load carsmall
Tbl = table(Cylinders,Displacement,Horsepower,Weight,MPG);

代理分岐を使用する回帰木テンプレートを指定し、NaN 値が存在する場合の予測精度を向上させます。

t = templateTree('Surrogate','On');

LSBoost と 100 学習サイクルを使用して、アンサンブル回帰木を学習させます。

Mdl1 = fitensemble(Tbl,'MPG','LSBoost',100,t);

Mdl1 は学習させた RegressionEnsemble アンサンブル回帰です。MPG は MATLAB® ワークスペースの変数なので、次のように入力すると同じ結果を得ることができます。

Mdl1 = fitensemble(Tbl,MPG,'LSBoost',100,t);

学習させたアンサンブル回帰を使用して、排気量が 200 立方インチ、150 馬力、重量 3,000 lbs の 4 気筒搭載車の燃費を予測します。

predMPG = predict(Mdl1,[4 200 150 3000])
predMPG = 22.8462

この仕様の自動車の平均燃費は 21.78 mpg です。

Displacement を除く Tbl 内の予測子をすべて使用して、新しいアンサンブルに学習をさせます。

formula = 'MPG ~ Cylinders + Horsepower + Weight';
Mdl2 = fitensemble(Tbl,formula,'LSBoost',100,t);

Mdl1Mdl2 の再代入 MSE を比較します。

mse1 = resubLoss(Mdl1)
mse1 = 6.4721
mse2 = resubLoss(Mdl2)
mse2 = 7.8599

すべての予測子に対して学習を行ったアンサンブルの方が、標本内 MSE が小さくなります。

決定木の、学習されたブースティング アンサンブル分類の汎化誤差を推定します。

ionosphere データセットを読み込みます。

load ionosphere;

AdaBoostM1、学習サイクル 100、無作為に選択された半分のデータを使用して、決定木アンサンブルを学習させます。残りの半分を使用してアルゴリズムが検証されます。

rng(2); % For reproducibility
ClassTreeEns = fitensemble(X,Y,'AdaBoostM1',100,'Tree',...
    'Holdout',0.5);

ClassTreeEns は学習させた ClassificationEnsemble アンサンブル分類器です。

累積汎化誤差 (検証データのラベルの累積誤分類誤差) を特定します。

genError = kfoldLoss(ClassTreeEns,'Mode','Cumulative');

genError は 100 行 1 列のベクトルです。要素 k には最初の k 学習サイクルの後の汎化誤差が格納されています。

学習サイクル数の上に汎化誤差をプロットします。

plot(genError);
xlabel('Number of Learning Cycles');
ylabel('Generalization Error');

25 件の弱学習器がアンサンブル分類器を構成している場合、累積汎化誤差は約 7% まで低下します。

決定木のアンサンブルにおける木の深さを制御できます。また、名前と値のペアの引数 MaxNumSplitsMinLeafSize または MinParentSize を使用すると、決定木バイナリ学習器が含まれている ECOC モデルにおける木の深さも制御できます。

  • 決定木をバギングする場合、既定の設定では fitensemble は深い決定木を成長させます。モデルの複雑さや計算時間の削減のために、より浅い木を成長させることもできます。

  • 決定木をブースティングする場合、既定の設定では fitensemble は切り株 (1 つの分割がある木) を成長させます。木を深くすると、精度を向上させることができます。

carsmall データセットを読み込みます。変数 AccelerationDisplacementHorsepower および Weight を予測子として、MPG を応答として指定します。

load carsmall
X = [Acceleration Displacement Horsepower Weight];
Y = MPG;

回帰木をブースティングする場合、木の深さの制御に関する既定値は次のとおりです。

  • MaxNumSplits1。このオプションは切り株を成長させます。

  • 5 (次の場合) MinLeafSize

  • 10 (次の場合) MinParentSize

最適な分割数は次により求めます。

  1. 一連のアンサンブルを学習させます。以後のアンサンブルの最大分割数を、切り株から最大 n - 1 個の分割まで指数的に増やします。n は学習標本のサイズです。また、アンサンブルごとの学習率を 1 から 0.1 に減らします。

  2. アンサンブルの交差検証を実行します。

  3. アンサンブルごとに交差検証の平均二乗誤差 (MSE) を推定します。

  4. 交差検証の MSE を比較します。MSE が最も小さいアンサンブルは性能が最適であり、そのデータセットに最適な最大分割数、木の数、および学習率も表示されます。

深い回帰木と切り株を成長させ交差検証を実行します。欠損値がデータに含まれているので、代理分岐を使用するように指定します。これらはベンチマークとして機能します。

MdlDeep = fitrtree(X,Y,'CrossVal','on','MergeLeaves','off',...
    'MinParentSize',1,'Surrogate','on');
MdlStump = fitrtree(X,Y,'MaxNumSplits',1,'CrossVal','on','Surrogate','on');

150 個の回帰木を使用してブースティング アンサンブルを学習させます。アンサンブルに対して 5 分割の交差検証を実行します。 という数列の値を使用して分割の最大数を変化させます。m は、n - 1 を超えない値です。n は学習標本のサイズです。{0.1, 0.25, 0.5, 1}; という集合の各値に対して、それぞれの学習率を調整します。

n = size(X,1);
m = floor(log2(n - 1));
lr = [0.1 0.25 0.5 1];
maxNumSplits = 2.^(0:m);
numTrees = 150;
Mdl = cell(numel(maxNumSplits),numel(lr));
rng(1); % For reproducibility
for k = 1:numel(lr);
    for j = 1:numel(maxNumSplits);
        t = templateTree('MaxNumSplits',maxNumSplits(j),'Surrogate','on');
        Mdl{j,k} = fitensemble(X,Y,'LSBoost',numTrees,t,...
            'Type','regression','KFold',5,'LearnRate',lr(k));
    end;
end;

各アンサンブルについて相互検定の MSE を計算します。

kflAll = @(x)kfoldLoss(x,'Mode','cumulative');
errorCell = cellfun(kflAll,Mdl,'Uniform',false);
error = reshape(cell2mat(errorCell),[numTrees numel(maxNumSplits) numel(lr)]);
errorDeep = kfoldLoss(MdlDeep);
errorStump = kfoldLoss(MdlStump);

少数のアンサンブル、深い木、切り株について、アンサンブルの木の数が増加すると交差検証の MSE がどのように変化するかをプロットします。同じプロットで、学習率に関する曲線をプロットします。木の複雑さの変化を別のプロットにプロットします。木の複雑さのレベルのサブセットを選択します。

mnsPlot = [1 round(numel(maxNumSplits)/2) numel(maxNumSplits)];
figure;
for k = 1:3;
    subplot(2,2,k);
    plot(squeeze(error(:,mnsPlot(k),:)),'LineWidth',2);
    axis tight;
    hold on;
    h = gca;
    plot(h.XLim,[errorDeep errorDeep],'-.b','LineWidth',2);
    plot(h.XLim,[errorStump errorStump],'-.r','LineWidth',2);
    plot(h.XLim,min(min(error(:,mnsPlot(k),:))).*[1 1],'--k');
    h.YLim = [10 50];    
    xlabel 'Number of trees';
    ylabel 'Cross-validated MSE';
    title(sprintf('MaxNumSplits = %0.3g', maxNumSplits(mnsPlot(k))));
    hold off;
end;
hL = legend([cellstr(num2str(lr','Learning Rate = %0.2f'));...
        'Deep Tree';'Stump';'Min. MSE']);
hL.Position(1) = 0.6;

各曲線では、アンサンブル内の木の本数が最適な位置で交差検証の MSE が最小になります。

全体的に MSE が最小になる最大分割数、木の数および学習率を特定します。

[minErr,minErrIdxLin] = min(error(:));
[idxNumTrees,idxMNS,idxLR] = ind2sub(size(error),minErrIdxLin);

fprintf('\nMin. MSE = %0.5f',minErr)
Min. MSE = 18.42979
fprintf('\nOptimal Parameter Values:\nNum. Trees = %d',idxNumTrees);
Optimal Parameter Values:
Num. Trees = 1
fprintf('\nMaxNumSplits = %d\nLearning Rate = %0.2f\n',...
    maxNumSplits(idxMNS),lr(idxLR))
MaxNumSplits = 4
Learning Rate = 1.00

このアンサンブルを最適化する別の方法については、ブースティングされたアンサンブル回帰の最適化を参照してください。

入力引数

すべて折りたたむ

モデルを学習させるために使用する標本データ。テーブルとして指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。Tbl には、応答変数用の追加の 1 列を含めることができます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

  • Tbl に応答変数が含まれている場合に他の変数をすべて予測子として使用するには、ResponseVarName を使用して応答変数を指定します。

  • Tbl に応答変数が含まれている場合に他の変数の一部のみを予測子として使用するには、formula を使用して式を指定します。

  • Tbl に応答変数が含まれていない場合は、Y を使用して応答データを指定します。応答変数の長さと Tbl の行数は、同じでなければなりません。

メモ

メモリと実行時間を節約するには、Tbl ではなく XY を指定します。

データ型: テーブル

応答変数名。Tbl 内の応答変数の名前を指定します。

ResponseVarName には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、Tbl.Y が応答変数である場合、ResponseVarName には 'Y' を指定します。それ以外の場合、fitensembleTbl の列をすべて予測子変数として扱います。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

分類の場合、名前と値のペアの引数 ClassNames を使用してクラスの順序を指定できます。それ以外の場合、fitensemble がクラスの順序を決定して Mdl.ClassNames に格納します。

データ型: char | string

予測子変数のサブセットおよび応答の説明モデル。'Y~X1+X2+X3' という形式の文字ベクトルまたは string スカラーを指定します。この式では、Y は応答変数を、X1X2 および X3 は予測子変数を表します。変数は、Tbl (Tbl.Properties.VariableNames) に含まれている変数の名前でなければなりません。

モデルに学習をさせるための予測子として Tbl 内の変数のサブセットを指定するには、式を使用します。式を指定した場合、formula に現れない Tbl 内の変数は使用されません。

データ型: char | string

予測子データ。数値行列を指定します。

各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。

Y の長さと X の行数は等しくなければなりません。

予測子の名前を X に表示される順序で指定するには、PredictorNames 名前と値のペアの引数を使用します。

データ型: single | double

応答データ。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y の各エントリは、X または Tbl の対応する行の観測値に対する応答またはラベルです。Y の長さと X または Tbl の行数は、同じでなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

  • 分類の場合、サポートされるどのデータ型でも Y に使用できます。名前と値のペアの引数 ClassNames を使用してクラスの順序を指定できます。それ以外の場合、fitensemble がクラスの順序を決定して Mdl.ClassNames に格納します。

  • 回帰の場合、Y は数値列ベクトルでなければなりません。

データ型: categorical | char | string | logical | single | double | cell

アンサンブル集約法。次の一覧に記載されている方式名のいずれかを指定します。

  • 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'

分類問題と回帰問題では 'Bag' を指定できるので、名前と値のペアの引数 Type を使用して問題のタイプを指定します。

アンサンブル学習サイクルの数。正の整数または 'AllPredictorCombinations' を指定します。

  • 正の整数を指定した場合、すべての学習サイクルで、1 つの弱学習器が Learners 内のすべてのテンプレート オブジェクトについて学習します。この結果、延べ NLearn*numel(Learners) 個の学習器が学習を行います。

  • 'AllPredictorCombinations' を指定する場合は、Method'Subspace' に設定し、Learners で 1 つの学習器のみを指定します。このように設定すると、予測子が一度に NPredToSample 個抽出され、その可能な組み合わせすべてに対して学習器が学習を行います。この結果、延べ nchoosek(size(X,2),NPredToSample) 個の学習器が学習を行います。

アンサンブルはすべての訓練済み学習器を使用して構成され、Mdl.Trained に格納されます。

詳細は、ヒントを参照してください。

データ型: single | double | char | string

アンサンブルで使用する弱学習器。弱学習器の名前、弱学習器テンプレート オブジェクト、または弱学習器テンプレート オブジェクトの cell 配列を指定します。

弱学習器弱学習器の名前テンプレート オブジェクト作成関数Method の設定
判別分析'Discriminant'templateDiscriminant'Subspace' を推奨
k 最近傍'KNN'templateKNN'Subspace' のみ
決定木'Tree'templateTree'Subspace' を除くすべての手法

詳細は、NLearnおよびヒントを参照してください。

例: 2 種類の分類木から構成されるアンサンブルの場合、{t1 t2} を指定します。t1t2 は分類木テンプレートです。

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で閉じなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: 'CrossVal','on','LearnRate',0.05 は、10 分割交差検証を実施し、学習率として 0.05 を使用するよう指定します。

一般的なアンサンブル オプション

すべて折りたたむ

カテゴリカル予測子のリスト。'CategoricalPredictors' と次の表のいずれかの値から構成されるコンマ区切りのペアとして指定します。

説明
正の整数のベクトルベクトルのエントリは、カテゴリカル変数が含まれている予測子データ (X または Tbl) の列に対応するインデックス値です。
logical ベクトルtrue というエントリは、予測子データ (X または Tbl) の対応する列がカテゴリカル変数であることを意味します。
文字行列行列の各行は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
文字ベクトルの cell 配列または string 配列配列の各要素は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。
'all'すべての予測子がカテゴリカルです。

CategoricalPredictors の仕様は以下の場合適切です。

  • 'Learners''tree'

  • すべての予測子がカテゴリカルである場合に 'Learners''knn' である。

既定では、予測子データが table (Tbl) 内にあり、この table に論理値、カテゴリカル値、string 配列、または文字ベクトルの cell 配列が格納されている場合、fitensemble は変数がカテゴリカルであると見なします。予測子データが行列 (X) である場合、fitensemble はすべての予測子が連続的であると見なします。データが行列の場合にカテゴリカル予測子を確認するには、名前と値のペアの引数 'CategoricalPredictors' を使用します。

例: 'CategoricalPredictors','all'

データ型: single | double | logical | char | string | cell

出力頻度。'NPrint' と正の整数または 'off' から構成されるコンマ区切りのペアとして指定します。

それまでに fitensemble が "弱学習器" または "分割" に学習をさせた回数を追跡するには、正の整数を指定します。つまり、正の整数 m を指定した場合、次のようになります。

  • 交差検証オプション (CrossVal など) を指定していない場合、fitensemble で m 個の弱学習器の学習が完了するたびに、コマンド ラインにメッセージが表示されます。

  • 交差検証オプションを指定した場合、fitensemble で m 個の分割の学習が完了するたびに、コマンド ラインにメッセージが表示されます。

'off' を指定した場合、fitensemble で弱学習器の学習が完了してもメッセージは表示されません。

ヒント

大規模なデータセットに対して多数の弱学習器のアンサンブルに学習をさせる場合、正の整数を NPrint に指定してください。

例: 'NPrint',5

データ型: single | double | char | string

予測子変数名。'PredictorNames' と一意な名前の string 配列または一意な文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。'PredictorNames' の機能は、学習データの提供方法によって決まります。

  • XY を指定した場合、'PredictorNames' を使用して X の名前で予測子変数を指定できます。

    • PredictorNames 内の名前の順序は、X の列の順序に一致しなければなりません。つまり、PredictorNames{1}X(:,1) の名前、PredictorNames{2}X(:,2) の名前であり、他も同様です。また、size(X,2)numel(PredictorNames) は等しくなければなりません。

    • 既定では PredictorNames{'x1','x2',...} です。

  • Tbl が与えられた場合、'PredictorNames' を使用して学習に使用する予測子変数を選択できます。つまり、fitensemblePredictorNames の予測子変数と応答変数のみを学習で使用します。

    • PredictorNamesTbl.Properties.VariableNames のサブセットでなければならず、応答変数の名前を含めることはできません。

    • 既定では、すべての予測子変数の名前が PredictorNames に格納されます。

    • 'PredictorNames'formula のいずれか一方のみを使用して学習用の予測子を指定することをお勧めします。

例: 'PredictorNames',{'SepalLength','SepalWidth','PetalLength','PetalWidth'}

データ型: string | cell

応答変数名。'ResponseName' と文字ベクトルまたは string スカラーから構成されるコンマ区切りのペアとして指定します。

  • Y を指定した場合、'ResponseName' を使用して応答変数の名前を指定できます。

  • ResponseVarName または formula を指定した場合、'ResponseName' を使用することはできません。

例: 'ResponseName','response'

データ型: char | string

教師あり学習のタイプ。'Type''classification' または 'regression' から構成されるコンマ区切りのペアとして指定します。

  • Method'bag' の場合、教師あり学習のタイプが明確ではなくなります。このため、バギングを行うときは Type を指定します。

  • それ以外の場合は、Method の値により教師あり学習のタイプが決まります。

例: 'Type','classification'

交差検証オプション

すべて折りたたむ

交差検証フラグ。'Crossval''on' または 'off' から構成されるコンマ区切りのペアとして指定します。

'on' を指定した場合、10 分割の交差検証が実施されます。

この交差検証の設定をオーバーライドするには、名前と値のペアの引数 CVPartitionHoldoutKFoldLeaveout のいずれかを使用します。交差検証済みモデルを作成するために使用できる交差検証の名前と値のペアの引数は、一度に 1 つだけです。

あるいは、crossval または crossvalMdl を渡すことにより、後で交差検証を実行します。

例: 'Crossval','on'

交差検証分割。'CVPartition'cvpartition により作成された cvpartition 分割オブジェクトで構成されるコンマ区切りのペアとして指定します。分割オブジェクトは、交差検証のタイプと、学習セットおよび検証セットのインデックス付けを指定します。

交差検証済みモデルの作成に使用できる名前と値のペアの引数は、'CVPartition''Holdout''KFold''Leaveout' の 4 つのうちのいずれかのみです。

例: cvp = cvpartition(500,'KFold',5) を使用して、500 個の観測値に対する 5 分割交差検証について無作為な分割を作成するとします。この場合、'CVPartition',cvp を使用して交差検証済みモデルを指定できます。

ホールドアウト検定に使用されるデータの比率。'Holdout' と範囲 (0,1) のスカラー値から構成されるコンマ区切りのペアとして指定します。'Holdout',p を指定した場合、以下の手順が実行されます。

  1. p*100% のデータを無作為に選択して検証データとして確保し、残りのデータを使用してモデルに学習をさせる。

  2. コンパクトな学習済みモデルを交差検証済みモデルの Trained プロパティに格納する。

交差検証済みモデルの作成に使用できる名前と値のペアの引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

例: 'Holdout',0.1

データ型: double | single

交差検証済みモデルで使用する分割数。'KFold' と 1 より大きい正の整数から構成されるコンマ区切りのペアとして指定します。'KFold',k を指定した場合、以下の手順が実行されます。

  1. データを無作為に k 個のセットに分割する。

  2. 各セットについて、そのセットを検定データとして確保し、他の k - 1 個のセットを使用してモデルに学習をさせる。

  3. k 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている k 行 1 列の cell ベクトルのセルに格納する。

交差検証済みモデルの作成に使用できる名前と値のペアの引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

例: 'KFold',5

データ型: single | double

Leave-one-out 法の交差検証のフラグ。'Leaveout''on' または 'off' で構成されるコンマ区切りのペアとして指定します。'Leaveout','on' を指定した場合、n 個の観測値 (n は、モデルの NumObservations プロパティで指定される、欠損観測値を除外した観測値の個数) のそれぞれについて以下の手順が実行されます。

  1. その観測値を検証データとして確保し、他の n - 1 個の観測値を使用してモデルに学習をさせる。

  2. n 個のコンパクトな学習済みモデルを、交差検証済みモデルの Trained プロパティに含まれている n 行 1 列の cell ベクトルのセルに格納する。

交差検証済みモデルの作成に使用できる名前と値のペアの引数は、CVPartitionHoldoutKFoldLeaveout の 4 つのうちのいずれかのみです。

例: 'Leaveout','on'

その他の分類または回帰のオプション

すべて折りたたむ

学習に使用するクラスの名前。'ClassNames' と categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。ClassNames のデータ型は Y と同じでなければなりません。

ClassNames が文字配列の場合、各要素は配列の 1 つの "行" に対応しなければなりません。

ClassNames の使用目的は次のとおりです。

  • 学習時のクラスの順序を指定する。

  • クラスの順序に対応する入力または出力引数の次元の順序を指定する。たとえば、Cost の次元の順序や predict によって返される分類スコアの列の順序を指定するために ClassNames を使用します。

  • 学習用にクラスのサブセットを選択する。たとえば、Y に含まれているすべての異なるクラス名の集合が {'a','b','c'} であるとします。クラス 'a' および 'c' のみの観測値を使用してモデルに学習をさせるには、'ClassNames',{'a','c'} を指定します。

ClassNames の既定値は、Y に含まれているすべての異なるクラス名の集合です。

例: 'ClassNames',{'b','g'}

データ型: categorical | char | string | logical | single | double | cell

誤分類のコスト。'Cost' と正方行列または構造体から構成されるコンマ区切りペアとして指定します。指定する項目によって、内容は次のように変わります。

  • 正方行列 Cost の場合、Cost(i,j) は真のクラスが i である点をクラス j に分類するコストです。つまり、行は真のクラスに、列は予測するクラスに対応します。Cost の対応する行と列についてクラスの順序を指定するには、名前と値のペアの引数 ClassNames も指定します。

  • 構造体 S の場合、次の 2 つのフィールドが必要となります。

    • S.ClassNames: Y と同じデータ型のクラス名を表す変数を含む。

    • S.ClassificationCosts。行と列の順序が S.ClassNames と同じコスト行列。

既定値は ones(K) - eye(K) です。K は異なるクラスの数です。

メモ

fitensembleCost を使用して、Prior で指定されたクラスの事前確率を調整します。その後、fitensemble は調整した事前確率を学習に使用し、コスト行列を既定設定にリセットします。

例: 'Cost',[0 1 2 ; 1 0 2; 2 2 0]

データ型: double | single | 構造体

各クラスの事前確率。'Prior' と次の表の値から構成されるコンマ区切りのペアとして指定します。

説明
'empirical'クラスの事前確率は、Y のクラスの相対的頻度です。
'uniform'クラスの事前確率はいずれも 1/K (K はクラス数) となります。
数値ベクトル各要素はクラスの事前確率です。Mdl.ClassNames に従って要素を並べ替えるか、ClassNames 名前と値のペアの引数を使用して順序を指定します。要素は合計が 1 になるように正規化されます。
構造体配列

構造体 S には 2 つのフィールドがあります。

  • S.ClassNames: Y と同じ型の変数のクラス名が格納されます。

  • S.ClassProbs: 対応する事前確率のベクトルが格納されます。要素は合計が 1 になるように正規化されます。

fitensemble は、合計が 1 になるように Prior の事前確率を正規化します。

例: struct('ClassNames',{{'setosa','versicolor','virginica'}},'ClassProbs',1:3)

データ型: char | string | double | single | 構造体

観測値の重み。'Weights' と、正の値の数値ベクトルまたは Tbl 内の変数の名前から構成されるコンマ区切りのペアとして指定します。X または Tbl の各行に含まれている観測値は、Weights の対応する値で重み付けされます。Weights のサイズは、X または Tbl の行数と等しくなければなりません。

入力データをテーブル Tbl として指定した場合、Weights は数値ベクトルが含まれている Tbl 内の変数の名前にすることができます。この場合、Weights には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みベクトル WTbl.W として格納されている場合、'W' として指定します。それ以外の場合、モデルに学習をさせるときに、Tbl の列は W を含めてすべて予測子または応答として扱われます。

合計が各クラスの事前確率の値と等しくなるように Weights が正規化されます。

既定の設定では、Weightsones(n,1) です。nX または Tbl の観測値数です。

データ型: double | single | char | string

ブースティング法およびバギングのサンプリング オプション

すべて折りたたむ

すべての弱学習器についてリサンプリングされる学習セットの比率。'FResample' と (0,1] の正のスカラーから構成されるコンマ区切りのペアとして指定します。

'FResample' を使用するには、Method'bag' を指定するか、Resample'on' に設定します。

例: 'FResample',0.75

データ型: single | double

復元抽出を示すフラグ。'Replace''off' または 'on' から構成されるコンマ区切りのペアとして指定します。

  • 'on' の場合、学習観測値が復元抽出されます。

  • 'off' の場合、学習観測値が非復元抽出されます。Resample'on' に設定した場合、重みが均一であるという前提で学習観測値がサンプリングされます。ブースティング法も指定した場合、観測値が再重み付けされてブースティングが行われます。

Method'bag' に設定した場合と Resample'on' に設定した場合を除いて、Replace の効果はありません。

例: 'Replace','off'

リサンプリングを示すフラグ。'Resample''off' または 'on' から構成されるコンマ区切りのペアとして指定します。

  • Method がいずれかのブースティング法である場合、次のようになります。

    • 'Resample','on' は、更新された重みを多項サンプリング確率として使用することにより学習観測値をサンプリングするよう指定します。

    • 'Resample','off' は、すべての学習反復で観測値を再重み付けするよう指定します。これは既定の設定です。

  • Method'bag' の場合、'Resample''on' でなければなりません。一定の比率 (FResample を参照) の学習観測値が復元抽出または非復元抽出 (Replace を参照) でリサンプリングされます。

AdaBoostM1、AdaBoostM2、LogitBoost、GentleBoost および LSBoost 法のオプション

すべて折りたたむ

縮小学習率。区間 (0,1] の数値スカラーから構成されるコンマ区切りのペアとして指定します。

縮小を使用してアンサンブルに学習をさせるには、LearnRate1 未満の値 (一般的な 0.1 など) に設定します。縮小を使用してアンサンブルに学習をさせると、学習反復数を増やす必要がありますが、多くの場合精度が向上します。

例: 'LearnRate',0.1

データ型: single | double

RUSBoost 法のオプション

すべて折りたたむ

縮小学習率。区間 (0,1] の数値スカラーから構成されるコンマ区切りのペアとして指定します。

縮小を使用してアンサンブルに学習をさせるには、LearnRate1 未満の値 (一般的な 0.1 など) に設定します。縮小を使用してアンサンブルに学習をさせると、学習反復数を増やす必要がありますが、多くの場合精度が向上します。

例: 'LearnRate',0.1

データ型: single | double

最小相当クラスについてのサンプリング比率。'RatioToSmallest' と数値スカラー、または学習データ内の異なるクラス数と同じ長さをもつ正の値の数値ベクトルから構成されるコンマ区切りのペアとして指定します。

学習データに K 個のクラスがあり、最小相当クラスには m 個の観測値があるとします。

  • 正の数値スカラー s を指定した場合、fitensembles*m 個の観測値を各クラスから抽出します。つまり、各クラスでサンプリングの比率が同じになります。詳細は、アルゴリズムを参照してください。

  • 数値ベクトル [s1,s2,...,sK] を指定した場合、fitensemblesi*m 個の観測値をクラス i (i = 1,...,K) から抽出します。RatioToSmallest の要素は、ClassNames を使用して指定されるクラス名に同じ順序で対応します (ヒントを参照)。

既定値は ones(K,1) で、m 個の観測値を各クラスから抽出するよう指定します。

例: 'RatioToSmallest',[2,1]

データ型: single | double

LPBoost および TotalBoost 法のオプション

すべて折りたたむ

収束速度を制御するマージン精度。'MarginPrecision' と区間 [0,1] の数値スカラーから構成されるコンマ区切りのペアとして指定します。MarginPrecision は、収束に必要なブースティング反復回数に影響を与えます。

ヒント

多数の学習器を使用してアンサンブルに学習をさせるには、MarginPrecision に小さい値を指定します。少数の学習器を使用して学習をさせる場合は、大きい値を指定します。

例: 'MarginPrecision',0.5

データ型: single | double

RobustBoost 法のオプション

すべて折りたたむ

目標分類誤差。'RobustErrorGoal' と非負の数値スカラーから構成されるコンマ区切りのペアとして指定します。可能な値の上限は、RobustMarginSigma および RobustMaxMargin の値によって決まります。ただし、上限が 1 を超えることはできません。

ヒント

通常は、特定の学習セットについて RobustErrorGoal の最適な範囲が存在します。小さすぎる値または大きすぎる値を設定した場合、分類精度が低いモデルが生成される可能性があります。適切な値を求めるには、交差検証を試してください。

例: 'RobustErrorGoal',0.05

データ型: single | double

学習データに対する分類マージンの分布の広がり。'RobustMarginSigma' と正の数値スカラーから構成されるコンマ区切りのペアとして指定します。RobustMarginSigma を指定する前に、RobustBoost に関する文献 ([19]など) を調べてください。

例: 'RobustMarginSigma',0.5

データ型: single | double

学習データの最大分類マージン。'RobustMaxMargin' と非負の数値スカラーから構成されるコンマ区切りのペアとして指定します。分類マージンが RobustMaxMargin 未満になるように学習データ内の観測値数が最小化されます。

例: 'RobustMaxMargin',1

データ型: single | double

ランダム部分空間法のオプション

すべて折りたたむ

各ランダム部分空間学習器についてサンプリングする予測子の個数。'NPredToSample' と区間 1,...,p の正の整数から構成されるコンマ区切りのペアとして指定します。p は予測子変数の個数 (size(X,2) または size(Tbl,2)) です。

データ型: single | double

出力引数

すべて折りたたむ

学習済みのアンサンブル モデル。次の表のモデル オブジェクトのいずれかとして返されます。

モデル オブジェクトType の設定交差検証オプションの指定Method の設定Resample の設定
ClassificationBaggedEnsemble'classification'なし'Bag''on'
ClassificationEnsemble'classification'なし分類用のアンサンブル集約法のいずれか'off'
ClassificationPartitionedEnsemble'classification'ありアンサンブル分類集約法のいずれか'off' または 'on'
RegressionBaggedEnsemble'regression'なし'Bag''on'
RegressionEnsemble'regression'なし'LSBoost''off'
RegressionPartitionedEnsemble'regression'あり'LSBoost' または 'Bag''off' または 'on'

交差検証を制御する名前と値のペアの引数は CrossValHoldoutKFoldLeaveout および CVPartition です。

Mdl のプロパティを参照するには、ドット表記を使用します。たとえば、交差検証されていないアンサンブルについて弱学習器モデル オブジェクトの cell ベクトルのアクセスまたは表示を行うには、コマンド ラインで Mdl.Trained を入力します。

ヒント

  • NLearn は数十から数千までさまざまな数になります。通常、予測力が高いアンサンブルでは数百から数千の弱学習器が必要です。しかし、このような多数のサイクルの学習をアンサンブルが一度に行う必要はありません。数十個の学習器の学習から開始してアンサンブルの性能を調査し、必要な場合は分類問題用の resume または回帰問題用の resume を使用して弱学習器の数を増やすことができます。

  • アンサンブルの性能は、アンサンブルの設定と弱学習器の設定によって決まります。つまり、既定のパラメーターを使用する弱学習器を指定すると、アンサンブルの性能が低下する可能性があります。このため、アンサンブルの設定と同じように、テンプレートを使用して弱学習器のパラメーターを調整し、汎化誤差が最小になる値を選択することをお勧めします。

  • Resample を使用してリサンプリングを指定する場合は、データセット全体に対してのリサンプリングをお勧めします。つまり、FResample の既定設定である 1 を使用します。

  • 分類問題の場合 (つまり、Type'classification' の場合)

    • アンサンブル集約法 (Method) が 'bag' で、

      • 誤分類コスト (Cost) が非常に不均衡である場合、in-bag の標本について、ペナルティが大きいクラスから一意な観測値がオーバーサンプリングされます。

      • クラスの事前確率 (Prior) の歪みが大きい場合、事前確率が大きいクラスから一意な観測値がオーバーサンプリングされます。

      これらの組み合わせにより、標本サイズが小さい場合、ペナルティまたは事前確率が大きいクラスから抽出される out-of-bag 観測値の相対頻度が低くなる可能性があります。この結果、out-of-bag の推定誤差の変動幅が非常に大きくなり、解釈が困難になる可能性があります。特に標本サイズが小さい場合に、out-of-bag の推定誤差の変動幅が大きくならないようにするには、Cost を使用して誤分類コスト行列をより平衡にするか、Prior を使用して事前確率ベクトルの歪みを小さくします。

    • 一部の入力引数および出力引数の順序は学習データ内の各クラスに対応するので、名前と値のペアの引数 ClassNames を使用してクラスの順序を指定することをお勧めします。

      • クラスの順序を簡単に求めるには、未分類の (つまり欠損ラベルがある) 観測値を学習データからすべて削除し、異なるクラスがすべて含まれている配列を取得および表示してから、その配列を ClassNames に指定します。たとえば、応答変数 (Y) がラベルの cell 配列であるとします。次のコードは、変数 classNames でクラスの順序を指定します。

        Ycat = categorical(Y);
        classNames = categories(Ycat)
        categorical<undefined> を未分類観測値に割り当て、categories<undefined> を出力から除外します。したがって、このコードをラベルの cell 配列に対して使用するか、同様のコードを categorical 配列に対して使用すると、欠損ラベルがある観測値を削除しなくても各クラスのリストを取得できます。

      • 最小相当ラベルから最大相当ラベルの順になるようにクラスの順序を指定するには、(前の項目のように) クラスの順序を簡単に調べ、リスト内のクラスの順序を頻度順に変更してから、リストを ClassNames に渡します。前の例に従うと、次のコードは最小相当から最大相当の順にクラスの順序を classNamesLH で指定します。

        Ycat = categorical(Y);
        classNames = categories(Ycat);
        freq = countcats(Ycat);
        [~,idx] = sort(freq);
        classNamesLH = classNames(idx);

アルゴリズム

  • アンサンブル集約アルゴリズムの詳細については、アンサンブル アルゴリズムを参照してください。

  • Method がブースティング アルゴリズム、Learners が決定木になるように指定した場合、既定では "切り株" が成長します。決定株は、2 つの終端ノード (葉ノード) に接続されている 1 つのルート ノードです。木の深さは、templateTree を使用して名前と値のペアの引数 MaxNumSplitsMinLeafSize および MinParentSize を指定することにより調整できます。

  • fitensemble は誤分類コストが大きいクラスをオーバーサンプリングし、誤分類コストが小さいクラスをアンダーサンプリングして、in-bag の標本を生成します。その結果、out-of-bag の標本では、誤分類コストが大きいクラスの観測値は少なくなり、誤分類コストが小さいクラスの観測値は多くなります。小さいデータセットと歪みが大きいコスト行列を使用してアンサンブル分類に学習をさせる場合、クラスあたりの out-of-bag 観測値の数が少なくなる可能性があります。このため、out-of-bag の推定誤差の変動幅が非常に大きくなり、解釈が困難になる可能性があります。事前確率が大きいクラスでも同じ現象が発生する場合があります。

  • アンサンブル集約法 (Method) が RUSBoost である場合、名前と値のペアの引数 RatioToSmallest では最小相当クラスに関して各クラスのサンプリングの比率を指定します。たとえば、学習データに A および B という 2 つのクラスがあるとします。A には 100 個の観測値、B には 10 個の観測値があり、学習データ内の最小相当クラスには m 個の観測値があるとします。

    • 'RatioToSmallest',2 を設定した場合、s*m = 2*10 = 20 になります。したがって、fitensemble はクラス A の 20 個の観測値とクラス B の 20 個の観測値を使用して、すべての学習器に学習をさせます。'RatioToSmallest',[2 2] を設定した場合も同じ結果になります。

    • 'RatioToSmallest',[2,1] を設定した場合、s1*m = 2*10 = 20 および s2*m = 1*10 = 10 になります。したがって、fitensemble はクラス A の 20 個の観測値とクラス B の 10 個の観測値を使用して、すべての学習器に学習をさせます。

  • 決定木のアンサンブルの場合とデュアルコア以上のシステムの場合、fitensemble では Intel® スレッディング ビルディング ブロック (TBB) を使用して学習を並列化します。Intel TBB についての詳細は、https://software.intel.com/en-us/intel-tbb を参照してください。

参照

[1] Breiman, L. “Bagging Predictors.” Machine Learning. Vol. 26, pp. 123–140, 1996.

[2] Breiman, L. “Random Forests.” Machine Learning. Vol. 45, pp. 5–32, 2001.

[3] Freund, Y. “A more robust boosting algorithm.” arXiv:0905.2138v1, 2009.

[4] Freund, Y. and R. E. Schapire. “A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting.” J. of Computer and System Sciences, Vol. 55, pp. 119–139, 1997.

[5] Friedman, J. “Greedy function approximation: A gradient boosting machine.” Annals of Statistics, Vol. 29, No. 5, pp. 1189–1232, 2001.

[6] Friedman, J., T. Hastie, and R. Tibshirani. “Additive logistic regression: A statistical view of boosting.” Annals of Statistics, Vol. 28, No. 2, pp. 337–407, 2000.

[7] Hastie, T., R. Tibshirani, and J. Friedman. The Elements of Statistical Learning section edition, Springer, New York, 2008.

[8] Ho, T. K. “The random subspace method for constructing decision forests.” IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 20, No. 8, pp. 832–844, 1998.

[9] Schapire, R. E., Y. Freund, P. Bartlett, and W.S. Lee. “Boosting the margin: A new explanation for the effectiveness of voting methods.” Annals of Statistics, Vol. 26, No. 5, pp. 1651–1686, 1998.

[10] Seiffert, C., T. Khoshgoftaar, J. Hulse, and A. Napolitano. “RUSBoost: Improving clasification performance when training data is skewed.” 19th International Conference on Pattern Recognition, pp. 1–4, 2008.

[11] Warmuth, M., J. Liao, and G. Ratsch. “Totally corrective boosting algorithms that maximize the margin.” Proc. 23rd Int’l. Conf. on Machine Learning, ACM, New York, pp. 1001–1008, 2006.

R2011a で導入