В этом примере показано, как оценить условные квантили ответа, данного данные о предикторе с помощью квантиля случайный лес и путем оценки функции условного распределения ответа с помощью сглаживания ядра.
Для скорости оценки квантиля, quantilePredict
, oobQuantilePredict
, quantileError
, и oobQuantileError
используйте линейную интерполяцию, чтобы предсказать квантили в условном распределении ответа. Однако можно получить веса ответа, которые включают функцию распределения, и затем передают их ksdensity
возможно получать точность за счет скорости расчета.
Сгенерируйте 2 000 наблюдений из модели
равномерно распределено между 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 = 17.1775
Требуется намного больше времени, чтобы выполнить сглаживание ядра, чем интерполяция. Это отношение зависит от памяти о вашей машине, таким образом, ваши результаты будут варьироваться.
Отобразите данные на графике с обоими наборами предсказанных квантилей.
[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
чем те от сглаживания ядра.
TreeBagger
| TreeBagger
| ksdensity
| oobQuantilePredict