Main Content

quantilePredict

回帰の bag of trees の使用による応答の分位数の予測

説明

YFit = quantilePredict(Mdl,X) は、回帰木の bag of trees Mdl を使用して、予測子データのテーブルまたは行列 X における予測応答の中央値のベクトルを返します。MdlTreeBagger モデル オブジェクトでなければなりません。

YFit = quantilePredict(Mdl,X,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、分位確率を指定したり分位推定に含める木を指定したりします。

[YFit,YW] = quantilePredict(___) は、応答の重みのスパース行列も返します。

入力引数

すべて展開する

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

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

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

  • 数値行列の場合

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

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

  • テーブルの場合

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

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

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

データ型: table | double | single

名前と値の引数

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

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

分位確率。'Quantile' と区間 [0,1] の値が含まれている数値ベクトルから構成されるコンマ区切りのペアとして指定します。quantilePredict は、X の各観測値 (行) について、Quantile 内のすべての確率に対応する分位数を返します。

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

データ型: single | double

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

'all' の場合、quantilePredict はインデックスとして 1:Mdl.NumTrees を使用します。

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

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

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

既定の設定は、ones(size(trees)) です。

データ型: single | double

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

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

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

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

データ型: char | string | logical

出力引数

すべて展開する

推定された分位数。nnumel(tau) 列の数値行列として返されます。nX 内の観測値の個数 (size(X,1))、tauQuantile の値です。つまり YFit(j,k) は、与えられた X(j,:) に対して Mdl を使用して推定した応答分布の 100*tau(k)% の百分位数です。

応答の重み。ntrain 行 n 列のスパース行列として返されます。ntrain は学習データ内の応答の個数 (numel(Mdl.Y))、n は X 内の観測値の個数 (size(X,1)) です。

quantilePredict は、経験的累積分布関数 (CDF) の線形内挿を使用して分位数を予測します。特定の観測値について、別の方法 (カーネル平滑化を使用した CDF の近似など) によって分位数を推定するために応答の重みを使用できます。

メモ

quantilePredict は、アンサンブル内の木を介して観測値を渡すことにより応答の重みを導き出します。UseInstanceForTree を指定し、行 j 全体の値を false にした場合は、代わりに YW(:,j) = Mdl.W、つまり観測値の重みになります。

すべて展開する

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

load carsmall

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

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

MdlTreeBagger アンサンブルです。

分位点回帰を実行して、すべての並べ替えられた学習観測値について MPG の中央値を予測します。

medianMPG = quantilePredict(Mdl,sort(Displacement));

medianMPG は、並べ替えられた Displacement 内の観測値が与えられた場合の応答の条件付き分布に対応する中央値が含まれている n 行 1 列の数値ベクトルです。nDisplacement 内の観測値の個数です。

同じ Figure に観測値と推定された中央値をプロットします。中央値および平均応答を比較します。

meanMPG = predict(Mdl,sort(Displacement));

figure;
plot(Displacement,MPG,'k.');
hold on
plot(sort(Displacement),medianMPG);
plot(sort(Displacement),meanMPG,'r--');
ylabel('Fuel economy');
xlabel('Engine displacement');
legend('Data','Median','Mean');
hold off;

Figure contains an axes object. The axes object with xlabel Engine displacement, ylabel Fuel economy contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Median, Mean.

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

load carsmall

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

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

分位点回帰を実行して、標本内の最小値と最大値の間で 10 等分したエンジン排気量について 2.5% および 97.5% の百分位数を予測します。

predX = linspace(min(Displacement),max(Displacement),10)';
quantPredInts = quantilePredict(Mdl,predX,'Quantile',[0.025,0.975]);

quantPredInts は、predX 内の観測値に対応する予測区間が含まれている 10 行 2 列の数値行列です。1 列目には 2.5% 百分位数が、2 列目には 97.5% 百分位数が含まれています。

同じ Figure に観測値と推定された中央値をプロットします。MPG の条件付き分布がガウス分布であると仮定して、百分位数の予測区間と 95% の予測区間を比較します。

[meanMPG,steMeanMPG] = predict(Mdl,predX);
stndPredInts = meanMPG + [-1 1]*norminv(0.975).*steMeanMPG;

figure;
h1 = plot(Displacement,MPG,'k.');
hold on
h2 = plot(predX,quantPredInts,'b');
h3 = plot(predX,stndPredInts,'r--');
ylabel('Fuel economy');
xlabel('Engine displacement');
legend([h1,h2(1),h3(1)],{'Data','95% percentile prediction intervals',...
    '95% Gaussian prediction intervals'});
hold off;

Figure contains an axes object. The axes object with xlabel Engine displacement, ylabel Fuel economy contains 5 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, 95% percentile prediction intervals, 95% Gaussian prediction intervals.

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

load carsmall

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

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

4 つの学習観測値の無作為標本について、応答の重みを予測します。学習標本をプロットし、選択された観測値を特定します。

[predX,idx] = datasample(Mdl.X,4);
[~,YW] = quantilePredict(Mdl,predX);
n = numel(Mdl.Y);

figure;
plot(Mdl.X,Mdl.Y,'o');
hold on
plot(predX,Mdl.Y(idx),'*','MarkerSize',10);
text(predX-10,Mdl.Y(idx)+1.5,{'obs. 1' 'obs. 2' 'obs. 3' 'obs. 4'});
legend('Training Data','Chosen Observations');
xlabel('Engine displacement')
ylabel('Fuel economy')
hold off

Figure contains an axes object. The axes object with xlabel Engine displacement, ylabel Fuel economy contains 6 objects of type line, text. One or more of the lines displays its values using only markers These objects represent Training Data, Chosen Observations.

YW は、応答の重みが含まれている n 行 4 列のスパース行列です。列はテスト観測値に、行は学習標本内の応答に対応します。応答の重みは、指定された分位確率に依存しません。

以下により、応答の条件付き累積分布関数 (CCDF) を推定します。

  1. 応答を昇順にソートし、さらにそれによって導かれたインデックスを使用して応答の重みをソートします。

  2. 並べ替えられた応答の重みの各列に対する累積和を計算します。

[sortY,sortIdx] = sort(Mdl.Y);
cpdf = full(YW(sortIdx,:));
ccdf = cumsum(cpdf);

ccdf(:,j) は、与えられたテスト観測値 j に対する応答の経験的 CCDF です。

同じ Figure に 4 つの経験的 CCDF をプロットします。

figure;
plot(sortY,ccdf);
legend('C.C.D.F. given test obs. 1','C.C.D.F. given test obs. 2',...
    'C.C.D.F. given test obs. 3','C.C.D.F. given test obs. 4',...
    'Location','SouthEast')
title('Conditional Cumulative Distribution Functions')
xlabel('Fuel economy')
ylabel('Empirical CDF')

Figure contains an axes object. The axes object with title Conditional Cumulative Distribution Functions, xlabel Fuel economy, ylabel Empirical CDF contains 4 objects of type line. These objects represent C.C.D.F. given test obs. 1, C.C.D.F. given test obs. 2, C.C.D.F. given test obs. 3, C.C.D.F. given test obs. 4.

詳細

すべて展開する

ヒント

quantilePredict は、呼び出されるたびに学習データを使用して応答の条件付き分布を推定します。多数の分位数または多数の観測値についての分位数を効率的に予測するには、観測値の行列またはテーブルとして X を渡し、名前と値のペアの引数 Quantile を使用してベクトルですべての分位数を指定します。つまり、ループ内では quantilePredict を呼び出さないようにします。

アルゴリズム

  • TreeBagger は、学習データを使用して回帰木のランダム フォレストを成長させます。そして、分位点ランダム フォレストを実装するため、quantilePredict は与えられた予測子変数の観測値に対する応答の経験的な条件付き分布を使用して分位数を予測します。応答の経験的な条件付き分布を取得するため、以下を行います。

    1. quantilePredict は、アンサンブル内のすべての木を介して Mdl.X 内のすべての学習観測値を渡し、学習観測値が属している葉ノードを格納します。

    2. quantilePredict は同様に、アンサンブル内のすべての木を介して X 内の各観測値を渡します。

    3. X 内の各観測値について、quantilePredict は以下を行います。

      1. 各木の応答の重みを計算することにより、応答の条件付き分布を推定します。

      2. X 内の観測値 k について、アンサンブル全体に対する条件付き分布を集約します。

        F^(y|X=xk)=j=1nt=1T1Twtj(xk)I{Yjy}.

        n は学習観測値の個数 (size(Y,1))、T はアンサンブル内の木の本数 (Mdl.NumTrees) です。

    4. X 内の観測値 k について、τ の分位数、つまり 100τ% の百分位数は Qτ(xk)=inf{y:F^(y|X=xk)τ}. になります。

  • quantilePredict は、すべての指定された重みを以下のようにして使用します。

    1. すべての学習観測値 j = 1,...,n およびすべての選択された木 t = 1,...,T について、

      quantilePredict は (Mdl.X(j,:)Mdl.Y(j) に格納されている) 学習観測値 j に対して積 vtj = btjwj,obs を求めます。btj は、木 t のブートストラップ標本に観測値 j が含まれていた回数です。wj,obsMdl.W(j) 内の観測値の重みです。

    2. 選択された各木について、quantilePredict は各学習観測値が属する葉を特定します。観測値 j が属している木 t の葉に含まれているすべての観測値の集合を St(xj) とします。

    3. 選択された各木について、quantilePredict は特定の葉に含まれているすべての重みを合計が 1 になるように正規化します。つまり、次のようになります。

      vtj=vtjiSt(xj)vti.

    4. 各学習観測値および木について、quantilePredictTreeWeights で指定された木の重み (wt,tree) を組み込みます。つまり、w*tj,tree = wt,treevtj* を求めます。予測に選択されなかった木の重みは 0 になります。

    5. X 内のすべての検定観測値 k = 1,...,K および選択されたすべての木 t = 1,...,T について、quantilePredict は観測値が属する一意な葉を予測し、予測した葉に含まれるすべての学習観測値を特定します。quantilePredict は、次のように重み utj を割り当てます。

      utj={wtj,tree;if xkSt(xj)0;otherwise.

    6. quantilePredict は、選択されたすべての木に対する重みを合計します。つまり、次のようになります。

      uj=t=1Tutj.

    7. quantilePredict は、合計が 1 になるように重みを正規化することにより、応答の重みを作成します。つまり、次のようになります。

      wj=ujj=1nuj.

参考文献

[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 で導入