Когда значение оптимального предиктора разделения для наблюдения отсутствует, если вы задаете, чтобы использовать суррогатные разделения, программное обеспечение отправляет наблюдение в левый или правый дочерний узел с помощью лучшего суррогатного предиктора. Когда у вас есть недостающие данные, деревья и ансамбли деревьев с суррогатными разделениями дают лучшие предсказания. В этом примере показано, как улучшить точность предсказаний для данных с отсутствующими значениями при помощи деревьев решений с суррогатными разделениями.
Загрузите 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';
Все недиагональные элементы на матрице беспорядка представляют неправильно классифицированные данные. Хороший классификатор дает к матрице беспорядка, которая выглядит доминируя диагональной. В этом случае ошибка классификации ниже для модели, обученной с суррогатными разделениями.
Оцените совокупные ошибки классификации. Задайте 'Mode','Cumulative'
при оценке ошибок классификации при помощи loss
функция. 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'
для древовидных учеников ансамбля. В противном случае программное обеспечение не может выбрать некоторые предикторы, недооценив их важность. Для примера смотрите, Выбирают Predictors for Random Forests.
compareHoldout
| fitcensemble
| fitrensemble