Этот пример показывает, как оценить условные квантили ответа, заданного данными предиктора, используя случайный лес квантиля и оценивая функцию условного распределения ответа, используя сглаживание ядра.
Для скорости квантовой оценки, quantilePredict, oobQuantilePredict, quantileError, и oobQuantileError использовать линейную интерполяцию для предсказания квантилей в условном распределении отклика. Однако можно получить веса ответа, которые включают функцию распределения, и затем передать их в ksdensity для возможного повышения точности при затратах на скорость вычислений.
Создание 2000 наблюдений на основе модели
+ αt.
равномерно распределяется между 0 и 1, и 0,01). Сохраните данные в таблице.
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