Этот пример показывает, как оценить условные квантования отклика данных предиктора с помощью случайного леса квантилей и путем оценки функции условного распределения отклика с помощью сглаживания ядра.
Для скорости оценки величины, 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 слабых учащихся и сохраните индексы вне сумки.
rng('default'); % For reproducibility Mdl = TreeBagger(200,Tbl,'y','Method','regression',... 'OOBPrediction','on');
Mdl
является TreeBagger
ансамбль.
Предсказание вне мешка, условных 0,05 и 0,95 квантилей (90% доверительные интервалы) для всех наблюдений обучающей выборки с помощью oobQuantilePredict
, то есть путем интерполяции. Запросите веса ответов. Запись времени выполнения.
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
.
Предсказать вне мешка, условные 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 = 8.6905
Для выполнения сглаживания ядра требуется гораздо больше времени, чем для интерполяции. Это соотношение зависит от памяти вашей машины, поэтому ваши результаты будут варьироваться.
Постройте график данных с обоими наборами предсказанных квантилей.
[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
чем таковые от сглаживания ядра.
ksdensity
| oobQuantilePredict
| TreeBagger
| TreeBagger