Когда значение оптимального предиктора разделения для наблюдения отсутствует, если вы задаете, чтобы использовать суррогатные разделения, программа отправляет наблюдение в левый или правый дочерний узел, используя лучший суррогатный предиктор. Когда у вас отсутствуют данные, деревья и ансамбли деревьев с суррогатными сплитами дают лучшие предсказания. В этом примере показано, как улучшить точность предсказаний для данных с отсутствующими значениями с помощью деревьев решений с суррогатными разделениями.
Загрузите ionosphere
набор данных.
load ionosphere
Разделите набор данных на наборы для обучения и тестирования. Продержитесь 30% данных для проверки.
rng('default') % For reproducibility cv = cvpartition(Y,'Holdout',0.3);
Идентифицируйте обучающие и тестовые данные.
Xtrain = X(training(cv),:); Ytrain = Y(training(cv)); Xtest = X(test(cv),:); Ytest = Y(test(cv));
Предположим, что половина значений в тестовом наборе отсутствует. Установите половину значений в тестовом наборе равной NaN
.
Xtest(rand(size(Xtest))>0.5) = NaN;
Обучите случайный лес из 150 классификационных деревьев без суррогатных расщеплений.
templ = templateTree('Reproducible',true); % For reproducibility of random predictor selections Mdl = fitcensemble(Xtrain,Ytrain,'Method','Bag','NumLearningCycles',150,'Learners',templ);
Создайте шаблон дерева решений, который использует суррогатные разделения. Дерево, использующее суррогатные разделения, не отбрасывает все наблюдение, когда оно включает отсутствующие данные в некоторых предикторах.
templS = templateTree('Surrogate','On','Reproducible',true);
Обучите случайный лес с помощью шаблона templS
.
Mdls = fitcensemble(Xtrain,Ytrain,'Method','Bag','NumLearningCycles',150,'Learners',templS);
Проверяйте точность предсказаний с и без суррогатных расщеплений.
Спрогнозируйте ответы и создайте матричные графики неточностей, используя оба подхода.
Ytest_pred = predict(Mdl,Xtest);
figure
cm = confusionchart(Ytest,Ytest_pred);
cm.Title = 'Model Without Surrogates';
Ytest_preds = predict(Mdls,Xtest);
figure
cms = confusionchart(Ytest,Ytest_preds);
cms.Title = 'Model with Surrogates';
Все off-диагональные элементы в матрице неточностей представляют неправильно классифицированные данные. Хороший классификатор приводит к матрице неточностей, которая выглядит доминирующим образом по диагонали. В этом случае классификационная ошибка ниже для модели, обученной с суррогатными сплитами.
Вычислите совокупные ошибки классификации. Задайте 'Mode','Cumulative'
при оценке классификационных ошибок при помощи loss
функция. The loss
функция возвращает вектор, в котором находится элемент J
указывает на ошибку при использовании первого J
учащиеся.
figure plot(loss(Mdl,Xtest,Ytest,'Mode','Cumulative')) hold on plot(loss(Mdls,Xtest,Ytest,'Mode','Cumulative'),'r--') legend('Trees without surrogate splits','Trees with surrogate splits') xlabel('Number of trees') ylabel('Test classification error')
Значение ошибки уменьшается, когда количество деревьев увеличивается, что указывает на хорошую эффективность. Классификационная ошибка ниже для модели, обученной с суррогатными сплитами.
Проверяйте статистическую значимость различия в результатах при помощи compareHoldout
. Эта функция использует тест Макнемара.
[~,p] = compareHoldout(Mdls,Mdl,Xtest,Xtest,Ytest,'Alternative','greater')
p = 0.0384
Низкое значение p указывает, что ансамбль с суррогатными расщеплениями лучше статистически значимым образом.
Оценки важности предиктора могут варьироваться в зависимости от того, использует ли дерево суррогатные расщепления. Оцените измерения важности предиктора путем перестановки наблюдений вне мешка. Затем найдите пять самых важных предикторов.
imp = oobPermutedPredictorImportance(Mdl); [~,ind] = maxk(imp,5)
ind = 1×5
5 3 27 8 14
imps = oobPermutedPredictorImportance(Mdls); [~,inds] = maxk(imps,5)
inds = 1×5
3 5 8 27 7
После оценки важности предиктора можно исключить неважные предикторы и снова обучить модель. Устранение неважных предикторов экономит время и память для предсказаний и облегчает понимание предсказаний.
Если обучающие данные включают много предикторов, и вы хотите проанализировать важность предиктора, задайте 'NumVariablesToSample'
от templateTree
функционировать как 'all'
для древовидных учеников ансамбля. В противном случае программное обеспечение может не выбрать некоторые предикторы, недооценив их важность. Для получения примера смотрите Выбор предикторов для случайных лесов.
compareHoldout
| fitcensemble
| fitrensemble