ドキュメンテーション

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

TreeBagger

クラス: TreeBagger

決定木の bag of trees の作成

個々の決定木には、過適合になる傾向があります。ブートストラップ集約された ("バギングされた") 決定木は多数の決定木の結果を結合するので、過適合の影響が少なくなり、汎化が改善されます。TreeBagger は、データのブートストラップ標本を使用して、アンサンブル内の決定木を成長させます。また、ランダム フォレスト アルゴリズム[1]の場合と同じように、TreeBagger は各決定分岐で使用する予測子のサブセットを無作為に選択します。

既定の設定では、TreeBagger は分類木をバギングします。代わりに回帰木をバギングするには、'Method','regression' を指定します。

回帰問題の場合、TreeBagger は平均および分位点回帰 (つまり、分位点回帰フォレスト[5]) をサポートします。

構文

Mdl = TreeBagger(NumTrees,Tbl,ResponseVarName)
Mdl = TreeBagger(NumTrees,Tbl,formula)
Mdl = TreeBagger(NumTrees,Tbl,Y)
B = TreeBagger(NumTrees,X,Y)
B = TreeBagger(NumTrees,X,Y,Name,Value)

説明

Mdl = TreeBagger(NumTrees,Tbl,ResponseVarName) は、テーブル Tbl 内の標本データを使用して学習させた、NumTrees 本のバギングされた分類木のアンサンブルを返します。ResponseVarName は、Tbl 内の応答変数の名前です。

Mdl = TreeBagger(NumTrees,Tbl,formula) は、テーブル Tbl 内の標本データを使用して学習させた、バギングされた分類木のアンサンブルを返します。formula は、Mdl のあてはめに使用する応答および Tbl 内の予測子変数サブセットの説明モデルです。Formula の指定にはウィルキンソンの表記法を使用します。詳細は、ウィルキンソンの表記法 を参照してください。

Mdl = TreeBagger(NumTrees,Tbl,Y) は、テーブル Tbl 内の予測子変数とベクトル Y 内のクラス ラベルを使用して、分類木のアンサンブルを返します。

Y は、応答データの配列です。Y の要素は Tbl の行に対応します。分類の場合、Y は真のクラス ラベルのセットです。ラベルは任意のグループ化変数、つまり数値ベクトル、logical ベクトル、文字行列、文字ベクトルの cell ベクトル、または categorical ベクトルにすることができます。TreeBagger は、ラベルを文字ベクトルの cell 配列に変換します。回帰の場合、Y は数値ベクトルです。回帰木を成長させるには、名前と値のペア 'Method','regression' を指定しなければなりません。

B = TreeBagger(NumTrees,X,Y) は、学習データの数値行列 X に格納されている予測子の関数として応答 Y を予測するための、NumTrees 本の決定木のアンサンブル B を作成します。X の各行は観測値を、各列は予測子または特徴を表します。

B = TreeBagger(NumTrees,X,Y,Name,Value) では、次のオプション パラメーターの名前と値のペアを指定します。

'InBagFraction'それぞれの新しいツリーを成長させるために入力データから復元抽出する、入力データの比率。既定値は 1 です。
'Cost'

正方行列 CC(i,j) は、真のクラスが i である場合に 1 つの点をクラス j に分類するためのコストです (行は真のクラス、列は予測したクラスに対応します)。Cost の行と列の順序は、学習済みの TreeBagger モデル BClassNames プロパティにおけるクラスの順序に対応します。

または、cost は 次の 2 つのフィールドをもつ構造体 S の場合もあります。

  • カテゴリカル変数、文字配列、または文字ベクトルの cell ベクトルとしてグループ名を格納する S.ClassNames

  • S.ClassificationCosts 。コスト行列 C を含みます。

既定値は、i ~= j である場合は C(i,j) = 1i = j である場合は C(i,j) = 0 です。

Cost の歪みが大きい場合、in-bag の標本について、ペナルティが大きいクラスの一意の観測値をオーバーサンプリングします。標本サイズが小さい場合、ペナルティが大きいクラスの out-of-bag の観測値の相対的頻度が非常に低くなることがあります。そのため、推定された out-of-bag の誤差の変動幅が非常に大きくなり、解釈が困難になる場合があります。

'SampleWithReplacement'復元抽出の場合は 'on'、非復元抽出の場合は 'off'。非復元抽出の場合、'InBagFraction' を 1 より小さい値に設定する必要があります。既定の設定は 'on' です。
'OOBPrediction'各ツリーに対して out of bag である観測値についての情報を格納する場合は 'on'。この情報は、oobPrediction がアンサンブル内の各ツリーについて予測されたクラス確率を計算するために使用することができます。既定値は 'off' です。
'OOBPredictorImportance'アンサンブル内の特徴量の重要度の out-of-bag 推定値を格納する場合は 'on'。既定値は 'off' です。'on' を指定すると、'OOBPrediction' 値も 'on' に設定されます。予測子の重要度の分析が目標である場合は、'PredictorSelection','curvature' または 'PredictorSelection','interaction-curvature' も指定します。詳細については、fitctree または fitrtree を参照してください。
'Method''classification' または 'regression'。回帰では数値 Y が必要です。
'NumPredictorsToSample'各決定分岐で無作為に選択する変数の個数。既定の設定は、分類の場合は変数の個数の平方根、回帰の場合は変数の個数の 1/3 です。有効値は、'all' または正の整数です。この引数を 'all' 以外の任意の有効値に設定すると、Breiman のランダム フォレスト アルゴリズム[1]が呼び出されます。
'NumPrint'学習サイクルの数 (成長したツリー)。この後に、学習の進行を示す診断メッセージが TreeBagger により表示されます。既定の設定では、診断メッセージなしです。
'MinLeafSize'ツリー リーフ 1 枚あたりの観測値の最小個数。既定値は分類の場合は 1、回帰の場合は 5 です。
'Options'

決定木のアンサンブルを成長させるときの計算を左右するオプションを指定する構造体。Parallel Computing Toolbox™ を使用できる場合、オプション数を 1 にすると、複数のブートストラップ複製における決定木の計算で、複数のプロセッサを使用するように要求されます。オプション数が 2 の場合は、ブートストラップ複製を選択する際に乱数ストリームを使用するよう指定されます。この引数は、statset の呼び出しで作成できます。個別のフィールドの値は、statget の呼び出しで取得することができます。該当する statset パラメーターは次のとおりです。

  • 'UseParallel' - true を指定し、かつ Parallel Computing Toolbox の parpool が開いている場合は、個々のブートストラップ複製上に抽出された決定木を並列に計算します。Parallel Computing Toolbox がインストールされていないか、parpool が開いていない場合、計算は逐次モードで行われます。既定の設定は、false、つまり逐次計算です。

  • 'UseSubstreams' - true の場合、乱数発生器 (ストリームともいう) の独立したサブストリームを使用して各ブートストラップ複製を選択します。このオプションは、サブストリームをサポートする RandStream タイプでのみ使用することができます。'mlfg6331_64' または 'mrg32k3a' に設定します。既定値は false です。別のサブストリームを使用して各ブートストラップ複製を計算しないでください。

  • StreamsRandStream オブジェクトまたはそのようなオブジェクトの cell 配列。Streams を指定しないと、TreeBagger には既定のストリームが使用されます。Streams を指定するように選択した場合、次の場合を除いて単一オブジェクトを使用してください。

    • 開いている並列プールがある

    • UseParalleltrue

    • UseSubstreamsfalse

    この場合は、並列プールと同じサイズの cell 配列を使用します。

'Prior'

各クラスの事前確率。次のいずれかを指定します。

  • 文字ベクトル。

    • 'Empirical'Y のクラスの頻度からクラス確率を決定します。観測値の重みを渡す場合は、クラス確率の計算に使用されます。これは既定値です。

    • 'Uniform' はすべてのクラス確率を均等に設定します。

  • ベクトル (クラスごとに 1 つのスカラー値)。Prior の要素の順序は、学習済みの TreeBagger モデル BClassNames プロパティにおけるクラスの順序に対応します。

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

    • カテゴリカル変数、文字配列、または文字ベクトルの cell ベクトルとしてクラス名を格納する S.ClassNames

    • 対応する確率のベクトルを含む S.ClassProbs

WeightsPrior の両方に値を設定した場合は、重みは再正規化され、それぞれのクラスの事前確率の値に加算されます。

Prior の歪みが大きい場合、in-bag の標本について、事前確率が大きいクラスの一意の観測値をオーバーサンプリングします。標本サイズが小さい場合、事前確率が大きいクラスの out-of-bag の観測値の相対的頻度が非常に低くなることがあります。そのため、推定された out-of-bag の誤差の変動幅が非常に大きくなり、解釈が困難になる場合があります。

'PredictorNames'

予測子変数名。'PredictorNames' と一意な文字ベクトルの 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' を使用して学習に使用する予測子変数を選択できます。つまり、TreeBaggerPredictorNames 内の予測子変数と応答のみを学習で使用します。

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

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

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

'CategoricalPredictors'

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

  • 1 から p までのインデックスを使用する数値ベクトル。p は、X の列数を示します。

  • 長さ p の logical ベクトル。true のエントリは、対応する X の列がカテゴリカル変数であることを示します。

  • 文字ベクトルの cell ベクトル。配列の各要素は予測子変数の名前です。名前は PredictorNames プロパティの値と一致してなければなりません。

  • 文字行列。行列の各行は、予測子変数の名前です。名前は PredictorNames プロパティの値と一致してなければなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。

  • 'all'、すべての予測子がカテゴリカルであることを示します。

'ChunkSize'

チャンクのサイズ。'ChunkSize' と正の整数から構成されるコンマ区切りのペアとして指定します。チャンクのサイズは、データの各チャンクに含まれる観測値の個数を指定します。既定値は 50000 です。

メモ

このオプションは、tall 配列に対して TreeBagger を使用する場合のみ適用されます。詳細は、拡張機能を参照してください。

上記のオプション引数に加えて、TreeBaggerfitctreefitrtree について次のオプション引数を受け入れます。

すべて展開する

フィッシャーのアヤメのデータセットを読み込みます。

load fisheriris

データセット全体を使用して、バギングされた分類木のアンサンブルに学習をさせます。50 個の弱学習器を指定します。木ごとにバギングしない観測値の情報を格納します。

rng(1); % For reproducibility
Mdl = TreeBagger(50,meas,species,'OOBPrediction','On',...
    'Method','classification')
Mdl = 
  TreeBagger
Ensemble with 50 bagged decision trees:
                    Training X:              [150x4]
                    Training Y:              [150x1]
                        Method:       classification
                 NumPredictors:                    4
         NumPredictorsToSample:                    2
                   MinLeafSize:                    1
                 InBagFraction:                    1
         SampleWithReplacement:                    1
          ComputeOOBPrediction:                    1
 ComputeOOBPredictorImportance:                    0
                     Proximity:                   []
                    ClassNames:        'setosa'    'versicolor'     'virginica'

  Properties, Methods

MdlTreeBagger アンサンブルです。

Mdl.Trees には、アンサンブルを構成する学習済み分類木 (CompactClassificationTree モデル オブジェクト) の 50 行 1 列の cell ベクトルが格納されます。

1 番目の学習済み分類木のグラフをプロットします。

view(Mdl.Trees{1},'Mode','graph')

既定の設定では、TreeBagger は木を深く成長させます。

Mdl.OOBIndices には、out-of-bag インデックスが論理値の行列として格納されます。

out-of-bag 誤差を、成長した分類木の数にプロットします。

figure;
oobErrorBaggedEnsemble = oobError(Mdl);
plot(oobErrorBaggedEnsemble)
xlabel 'Number of grown trees';
ylabel 'Out-of-bag classification error';

成長した分類木の数が増加すると、out-of-bag 誤差は減少します。

out-of-bag の観測値にラベル付けするには、MdloobPredict に渡します。

carsmall データセットを読み込みます。与えられたエンジン排気量に対して自動車の燃費を予測するモデルを考えます。

load carsmall

データセット全体を使用して、バギングされた回帰木のアンサンブルに学習をさせます。100 個の弱学習器を指定します。

rng(1); % For reproducibility
Mdl = TreeBagger(100,Displacement,MPG,'Method','regression');

MdlTreeBagger アンサンブルです。

学習済みの回帰の bag of trees を使用すると、条件付き平均応答の推定や、分位点回帰の実行による条件付き分位の予測が可能です。

標本内の最小値と最大値の間で 10 等分したエンジン排気量について、条件付き平均応答と条件付き四分位数を予測します。

predX = linspace(min(Displacement),max(Displacement),10)';
mpgMean = predict(Mdl,predX);
mpgQuartiles = quantilePredict(Mdl,predX,'Quantile',[0.25,0.5,0.75]);

観測値、推定された平均応答および四分位数を同じ Figure にプロットします。

figure;
plot(Displacement,MPG,'o');
hold on
plot(predX,mpgMean);
plot(predX,mpgQuartiles);
ylabel('Fuel economy');
xlabel('Engine displacement');
legend('Data','Mean Response','First quartile','Median','Third quartile');

carsmall データセットを読み込みます。与えられた加速、気筒数、エンジン排気量、馬力、製造業者、モデル年および重量に対して自動車の燃費の平均を予測するモデルを考えます。CylindersMfg および Model_Year はカテゴリカル変数であるとします。

load carsmall
Cylinders = categorical(Cylinders);
Mfg = categorical(cellstr(Mfg));
Model_Year = categorical(Model_Year);
X = table(Acceleration,Cylinders,Displacement,Horsepower,Mfg,...
    Model_Year,Weight,MPG);
rng('default'); % For reproducibility

カテゴリカル変数で表現されるカテゴリの個数を表示します。

numCylinders = numel(categories(Cylinders))
numCylinders = 3
numMfg = numel(categories(Mfg))
numMfg = 28
numModelYear = numel(categories(Model_Year))
numModelYear = 3

CylindersModel_Year には 3 つしかカテゴリがないので、予測子分割アルゴリズムの標準 CART ではこの 2 つの変数よりも連続予測子が分割されます。

データセット全体を使用して、200 本の回帰木のランダム フォレストに学習をさせます。偏りの無い木を成長させるため、予測子の分割に曲率検定を使用するよう指定します。データには欠損値が含まれているので、代理分岐を使用するよう指定します。予測子の重要度の推定に関する out-of-bag 情報を格納します。

Mdl = TreeBagger(200,X,'MPG','Method','regression','Surrogate','on',...
    'PredictorSelection','curvature','OOBPredictorImportance','on');

TreeBagger は、予測子の重要度の推定を OOBPermutedPredictorDeltaError プロパティに格納します。棒グラフを使用して推定を比較します。

imp = Mdl.OOBPermutedPredictorDeltaError;

figure;
bar(imp);
title('Curvature Test');
ylabel('Predictor importance estimates');
xlabel('Predictors');
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

このケースでは、最も重要な予測子は Model_Year であり、次に重要なのは Weight です。

標準 CART を使用して木を成長させるランダム フォレストから計算された予測子の重要度の推定と imp とを比較します。

MdlCART = TreeBagger(200,X,'MPG','Method','regression','Surrogate','on',...
    'OOBPredictorImportance','on');

impCART = MdlCART.OOBPermutedPredictorDeltaError;

figure;
bar(impCART);
title('Standard CART');
ylabel('Predictor importance estimates');
xlabel('Predictors');
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

このケースでは、最も重要な予測子は連続予測子 Weight です。次に重要な 2 つの予測子は Model_Year と、ほぼ同程度の連続予測子 Horsepower です。

ヒント

  • より平衡な誤分類コスト行列または歪みが少ない事前確率ベクトルを設定して、out-of-bag の推定誤差の変動幅が大きくならないようにします。

  • BTrees プロパティには、B.NumTrees 個の CompactClassificationTree または CompactRegressionTree モデル オブジェクトから構成される cell ベクトルが格納されます。cell ベクトルの木 t をテキストまたはグラフィックで表示するには、次のように入力します。

    view(B.Trees{t})

  • 標準 CART アルゴリズムには、相違する値が少ない分割予測子 (カテゴリカル変数など) よりも、相違する値が多い分割予測子 (連続変数など) を選択する傾向があります[4]。以下のいずれかに該当する場合は、曲率検定または交互作用検定の指定を検討してください。

    • 相違する値の個数が他の予測子よりも比較的少ない予測子がある場合 (予測子データセットが異種混合である場合など)。

    • 予測子の重要度の分析が目標である場合。TreeBagger は、予測子の重要度の推定を MdlOOBPermutedPredictorDeltaError プロパティに格納します。

    予測子の選択に関する詳細については、分類木の場合は PredictorSelection を、回帰木の場合は PredictorSelection を参照してください。

アルゴリズム

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

  • 決定木を成長させるときの分割予測子の選択とノード分割アルゴリズムの詳細については、分類木の場合はアルゴリズムを、回帰木の場合はアルゴリズムを参照してください。

参照

[1] Breiman, L. Random Forests. Machine Learning 45, pp. 5–32, 2001.

[2] Breiman, L., J. Friedman, R. Olshen, and C. Stone. Classification and Regression Trees. Boca Raton, FL: CRC Press, 1984.

[3] Loh, W.Y. “Regression Trees with Unbiased Variable Selection and Interaction Detection.” Statistica Sinica, Vol. 12, 2002, pp. 361–386.

[4] Loh, W.Y. and Y.S. Shih. “Split Selection Methods for Classification Trees.” Statistica Sinica, Vol. 7, 1997, pp. 815–840.

[5] Meinshausen, N. “Quantile Regression Forests.” Journal of Machine Learning Research, Vol. 7, 2006, pp. 983–999.

拡張機能

R2009a で導入