Main Content

quantileError

回帰の bag of trees の使用による分位点損失

説明

err = quantileError(Mdl,X) は、回帰の bag of trees MdlX 内の予測子データの観測値に適用することにより予測した中央値に対してテーブル X 内の真の応答を比較して、平均絶対偏差 (MAD) の 1/2 を返します。

  • MdlTreeBagger モデル オブジェクトでなければなりません。

  • X 内の応答変数名は、学習データが格納されているテーブルに含まれている応答変数の名前と同じでなければなりません。

err = quantileError(Mdl,X,ResponseVarName) は、テーブル X に含まれている真の応答および予測子の変数を使用します。ResponseVarName は応答変数の名前です。Mdl.PredictorNames には予測子変数の名前を格納します。

err = quantileError(Mdl,X,Y) は、テーブルまたは行列 X 内の予測子データとベクトル Y 内の応答データを使用します。

err = quantileError(___,Name,Value) では、前の構文のいずれかと、1 つ以上の Name,Value ペア引数によって指定される追加オプションを使用します。たとえば、分位確率、誤差のタイプ、分位点回帰誤差の推定に含める木を指定します。

入力引数

すべて展開する

回帰の bag of trees。関数 TreeBagger によって作成された TreeBagger モデル オブジェクトとして指定します。Mdl.Method の値は regression でなければなりません。

分位数の推定に使用する標本データ。数値行列またはテーブルを指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。Y を指定する場合は、X の行数と Y の長さが等しくなければなりません。

  • 数値行列の場合

    • X の列を構成する変数の順序は、Mdl に学習させた (Mdl.PredictorNames に格納されている) 予測子変数の順序と同じでなければなりません。

    • テーブル (たとえば Tbl) を使用して Mdl に学習をさせた場合、Tbl に含まれている予測子変数がすべて数値変数であれば、X を数値行列にすることができます。Tbl に種類の異なる予測子変数 (数値および categorical データ型など) が混在している場合、quantileError でエラーがスローされます。

    • 真の応答は Y で指定します。

  • テーブルの場合

    • quantileError は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。

    • テーブル (たとえば Tbl) を使用して Mdl に学習をさせた場合、X 内のすべての予測子変数は変数名およびデータ型が、Mdl に学習させた (Mdl.PredictorNames に格納されている) 変数と同じでなければなりません。ただし、X の列の順序が Tbl の列の順序に対応する必要はありません。TblX に追加の変数 (応答変数や観測値の重みなど) を含めることができます。

    • 数値行列を使用して Mdl に学習をさせた場合、Mdl.PredictorNames 内の予測子名と X 内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定する方法については、関数 TreeBagger の名前と値のペアの引数 PredictorNames を参照してください。X 内の予測子変数はすべて数値ベクトルでなければなりません。X に追加の変数 (応答変数や観測値の重みなど) を含めることができます。

    • X に応答変数が含まれている場合

      • 応答変数の名前が Mdl に学習させた応答変数と同じである場合、応答変数名や真の応答のベクトルを指定する必要はありません。quantileError の既定設定ではその変数が真の応答に使用されます。

      • 真の応答は ResponseVarName または Y で指定できます。

データ型: table | double | single

応答変数名。文字ベクトルまたは string スカラーを指定します。ResponseVarName は、標本データの table X に含まれている応答変数の名前でなければなりません。

table X に応答変数が含まれており、Mdl の学習に使用した応答変数と同じ名前である場合、ResponseVarName を指定する必要はありません。quantileError の既定設定ではその変数が真の応答に使用されます。

データ型: char | string

真の応答。数値ベクトルを指定します。X の行数と Y の長さは等しくなければなりません。

データ型: double | single

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

アンサンブル誤差のタイプ。'Mode' と次の表の値から構成されるコンマ区切りのペアとして指定します。tauQuantile の値であるとします。

説明
'cumulative'

err は、分位点回帰の累積誤差が格納されている Mdl.NumTreesnumel(tau) 列の数値行列です。err(j,k) は、Mdl.Trees(1:j) の学習器のみを使用した tau(k) の分位点回帰誤差です。

'ensemble'

err は、アンサンブル全体に対する分位点回帰の累積誤差が格納されている 1 行 numel(tau) 列の数値ベクトルです。err(k) は、tau(k) のアンサンブル分位点回帰誤差です。

'individual'

err は、個々の学習器の分位点回帰誤差が格納されている Mdl.NumTreesnumel(tau) 列の数値行列です。err(j,k) は、Mdl.Trees(j) の学習器のみを使用した tau(k) の分位点回帰誤差です。

'cumulative' または 'individual' の場合、Trees または UseInstanceForTree を使用して分位点推定に含める木の本数を減らすと、err の行数は Mdl.NumTrees より少なくなります。

例: 'Mode','cumulative'

観測値の重み。'Weights' と、size(X,1) に等しい長さをもつ正の値の数値ベクトルから構成されるコンマ区切りのペアとして指定します。分位点回帰誤差を推定するときに、quantileErrorWeights を使用して偏差の加重平均を計算します。

既定では、quantileError1 という重みを各観測値に割り当てており、これは偏差の非加重平均となります。

分位確率。'Quantile' と区間 [0,1] の値が含まれている数値ベクトルから構成されるコンマ区切りのペアとして指定します。quantileError は、Quantile の各要素について、Quantile 内のすべての確率に対応する分位点回帰誤差を返します。

例: 'Quantile',[0 0.25 0.5 0.75 1]

データ型: single | double

応答の推定に使用する木のインデックス。'Trees''all' または正の整数の数値ベクトルから構成されるコンマ区切りのペアとして指定します。インデックスは Mdl.Trees のセルに対応します。各セルにはアンサンブル内の木が格納されます。Trees の最大値は、アンサンブル内の木の本数 (Mdl.NumTrees) 以下でなければなりません。

'all' の場合、quantileError はアンサンブル内のすべての木を使用します (つまり、インデックスは 1:Mdl.NumTrees になります)。

既定以外の値を指定すると、err の行数が変化する可能性があります。

例: 'Trees',[1 10 Mdl.NumTrees]

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

各木の応答の重み。'TreeWeights'numel(trees) 個の非負値による数値ベクトルから構成されるコンマ区切りのペアとして指定します。treesTrees の値です。

'Mode','individual' を指定した場合、quantileErrorTreeWeights を無視します。

データ型: single | double

各観測値に対する予測に使用する木を指定するインジケーター。'UseInstanceForTree' と n 行 Mdl.Trees 列の logical 行列から構成されるコンマ区切りのペアとして指定します。n は X 内の観測値 (行) の個数です。UseInstanceForTree の行は観測値に、列は Mdl.Trees 内の学習器に対応します。'all' は、分位数を推定するときにすべての観測値に対してすべての木を使用するよう指定します。

UseInstanceForTree(j,k) = true である場合、quantileError は観測値 X(j,:) の応答を予測するときに Mdl.Trees(k) 内の木を使用します。

すべてが false 値から構成されている行を指定すると、ランダム フォレストによる予測の代わりに Mdl.Y 内の応答データを直接使用して分位数を推定できます。たとえば、応答データを使用して観測値 j の分位数を推定し、他のすべての観測値についてはランダム フォレストによる予測を使用するには、次の行列を指定します。

UseInstanceForTree = true(size(Mdl.X,2),Mdl.NumTrees);
UseInstanceForTree(j,:) = false(1,Mdl.NumTrees);

既定以外の値を指定すると、err の行数が変化する可能性があります。また、Trees の値は UseInstanceForTree の値に影響を与えます。UseInstanceForTree の値が U であるとします。quantileError は、Trees の指定による推定には使用されない木に対応する U の列を無視します。つまり、quantileError'UseInstanceForTree' の値を U(:,trees) に再設定します。trees'Trees' の値です。

データ型: char | string | logical

出力引数

すべて展開する

分位点回帰誤差の 1/2。数値スカラーまたは Tnumel(tau) 列の行列として返されます。tauQuantile の値です。

T は、ModeTreesUseInstanceForTree および Quantile の値に依存します。'Trees',trees を指定し、既定値の 'UseInstanceForTree' を使用するとします。

  • 'Mode','cumulative' の場合、errnumel(trees)numel(tau) 列の数値行列になります。err(j,k) は、Mdl.Trees(trees(1:j)) の学習器を使用した tau(k) の累積的な分位点回帰誤差です。

  • 'Mode','ensemble' の場合、err1numel(tau) 列の数値ベクトルになります。err(k) は、Mdl.Trees(trees) の学習器を使用した tau(k) の累積的な分位点回帰誤差です。

  • 'Mode','individual' の場合、errnumel(trees)numel(tau) 列の数値行列になります。err(j,k) は、Mdl.Trees(trees(j)) の学習器を使用した tau(k) の分位点回帰誤差です。

すべて展開する

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

load carsmall
Cylinders = categorical(Cylinders);
X = table(Displacement,Weight,Cylinders,MPG);

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

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

MdlTreeBagger アンサンブルです。

分位点回帰を実行し、予測された条件付き中央値を使用してアンサンブル全体の MAD を推定します。

err = quantileError(Mdl,X)
err = 1.2339

X は応答および同等の変数名が含まれているテーブルなので、応答変数の名前またはデータを指定する必要はありません。ただし、次の構文を使用して応答を指定することができます。

err = quantileError(Mdl,X,'MPG')
err = 1.2339

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

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

データの 75% を学習セットに、25% をテスト セットに無作為に分割します。サブセットのインデックスを抽出します。

rng(1); % For reproducibility 
cvp = cvpartition(size(X,1),'Holdout',0.25);
idxTrn = training(cvp);
idxTest = test(cvp);

学習セットを使用して、バギング回帰木のアンサンブルに学習をさせます。250 個の弱学習器を指定します。

Mdl = TreeBagger(250,X(idxTrn,:),'MPG','Method','regression');

テスト セットについて、0.25、0.5 および 0.75 の累積的な分位点回帰誤差を推定します。予測子データを数値行列として、応答データをベクトルとして渡します。

err = quantileError(Mdl,X{idxTest,1:3},MPG(idxTest),'Quantile',[0.25 0.5 0.75],...
    'Mode','cumulative');

err は、累積的な分位点回帰誤差が含まれている 250 行 3 列の行列です。列は分位確率に、行はアンサンブル内の木に対応します。誤差は累積的なので、前の木から集約した予測が含まれています。Mdl の学習にはテーブルを使用しましたが、テーブル内の予測子変数がすべて数値型である場合は、代わりに予測子データの行列を指定することができます。

同じプロットに累積的な分位数誤差をプロットします。

figure;
plot(err);
legend('0.25 quantile error','0.5 quantile error','0.75 quantile error');
ylabel('Quantile error');
xlabel('Tree index');
title('Cumulative Quantile Regression Error')

Figure contains an axes object. The axes object with title Cumulative Quantile Regression Error, xlabel Tree index, ylabel Quantile error contains 3 objects of type line. These objects represent 0.25 quantile error, 0.5 quantile error, 0.75 quantile error.

初めの 2 つの四分位数については約 60 本の木を使用して学習をさせれば十分であると考えられますが、3 番目の四分位数には約 150 本の木が必要です。

詳細

すべて展開する

ヒント

  • アンサンブル内の木の本数を調整するには、'Mode','cumulative' を設定し、木のインデックスに対して分位点回帰誤差をプロットします。必要な木の最大本数は、分位点回帰誤差が横ばい状態になる木のインデックスです。

  • 学習標本が小さい場合にモデルの性能を調べるには、代わりに oobQuantileError を使用します。

参考文献

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

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

バージョン履歴

R2016b で導入