Суррогатные разделения

Когда значение оптимального предиктора разделения для наблюдения отсутствует, если вы задаете, чтобы использовать суррогатные разделения, программное обеспечение отправляет наблюдение в левый или правый дочерний узел с помощью лучшего суррогатного предиктора. Когда у вас есть недостающие данные, деревья и ансамбли деревьев с суррогатными разделениями дают лучшие предсказания. В этом примере показано, как улучшить точность предсказаний для данных с отсутствующими значениями при помощи деревьев решений с суррогатными разделениями.

Загрузка демонстрационных данных

Загрузите 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.1051

Низкое p-значение указывает, что ансамбль с суррогатными разделениями лучше статистически значительным способом.

Оцените важность предиктора

Оценки важности предиктора могут варьироваться в зависимости от того, использует ли дерево суррогатные разделения. После оценки важности предиктора можно исключить неважные предикторы и обучить модель снова. Устранение неважных предикторов экономит время и память для предсказаний, и делает предсказания легче понять.

Оцените меры по важности предиктора путем перестановки наблюдений из сумки. Затем найдите пять самых важных предикторов.

imp = oobPermutedPredictorImportance(Mdl);
[~,ind] = maxk(imp,5)
ind = 1×5

     3     5    27     7     8

imps = oobPermutedPredictorImportance(Mdls);
[~,inds] = maxk(imps,5)
inds = 1×5

     5     3     7    27     8

Пять самых важных предикторов являются тем же самым, но порядки важности отличаются.

Если обучающие данные включают много предикторов, и вы хотите анализировать важность предиктора, затем задать 'NumVariablesToSample' из templateTree функционируйте как 'all' для древовидных учеников ансамбля. В противном случае программное обеспечение не может выбрать некоторые предикторы, недооценив их важность. Для примера смотрите, Выбирают Predictors for Random Forests.

Смотрите также

| |

Похожие темы