カーネル平滑化の使用による条件付き分位の推定
この例では、分位点ランダム フォレストを使用し、カーネル平滑化を使用して応答の条件付き分布関数を推定することにより、与えられた予測子データに対する応答の条件付き分位を推定する方法を示します。
分位数を推定する速度のため、quantilePredict
、oobQuantilePredict
、quantileError
および oobQuantileError
は線形内挿を使用して応答の条件付き分布における分位数を予測します。ただし、分布関数を構成する応答の重みを取得して ksdensity
に渡すと、計算速度を犠牲にして精度を向上させることができる可能性があります。
次のモデルから 2000 個の観測値を生成します。
は 0 と 1 の間で一様分布しており、 です。データをテーブルに保存します。
n = 2000; rng('default'); % For reproducibility t = randsample(linspace(0,1,1e2),n,true)'; epsilon = randn(n,1).*sqrt(t.^2/2 + 0.01); y = 0.5 + t + epsilon; Tbl = table(t,y);
データセット全体を使用して、バギング回帰木のアンサンブルに学習をさせます。200 個の弱学習器を指定し、out-of-bag インデックスを格納します。
rng('default'); % For reproducibility Mdl = TreeBagger(200,Tbl,'y','Method','regression',... 'OOBPrediction','on');
Mdl
は TreeBagger
アンサンブルです。
oobQuantilePredict
を使用して、つまり内挿によって、すべての学習標本観測値について out-of-bag の条件付き 0.05 および 0.95 分位 (90% 信頼区間) を予測します。応答の重みを要求します。実行時間を記録します。
tau = [0.05 0.95];
tic
[quantInterp,yw] = oobQuantilePredict(Mdl,'Quantile',tau);
timeInterp = toc;
quantInterp
は、予測した分位数が格納されている 94 行 2 列の行列です。行は Mdl.X
内の観測値に、列は tau
内の分位確率に対応します。yw
は応答の重みが格納されている 94 行 94 列のスパース行列です。行は学習標本の観測値に、列は Mdl.X
内の観測値に対応します。応答の重みは tau
に依存しません。
カーネル平滑化を使用して out-of-bag の条件付き分位 0.05 および 0.95 を予測し、実行時間を記録します。
n = numel(Tbl.y); quantKS = zeros(n,numel(tau)); % Preallocation tic for j = 1:n quantKS(j,:) = ksdensity(Tbl.y,tau,'Function','icdf','Weights',yw(:,j)); end timeKS = toc;
quantKS
は quantInterp
に相応します。
カーネル平滑化推定と内挿の実行時間の比率を評価します。
timeKS/timeInterp
ans = 5.8737
内挿よりもカーネル平滑化を実行する方が、はるかに時間がかかります。この比率はマシンのメモリに依存するので、結果は環境によって異なります。
両方の予測した分位数のセットと共にデータをプロットします。
[sT,idx] = sort(t); figure; h1 = plot(t,y,'.'); hold on h2 = plot(sT,quantInterp(idx,:),'b'); h3 = plot(sT,quantKS(idx,:),'r'); legend([h1 h2(1) h3(1)],'Data','Interpolation','Kernel Smoothing'); title('Quantile Estimates') hold off
推定した分位数のセットは、どちらもかなり一致しています。ただし、t
の値が小さい場合、カーネル平滑化による分位数より内挿による分位数の方が間隔がわずかに狭くなっているようです。
参考
oobQuantilePredict
| TreeBagger
| ksdensity