Выберите Predictors for Random Forests

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

Загрузите и предварительно обработайте данные

Загрузите набор данных carbig. Рассмотрите модель, которая предсказывает экономию топлива автомобиля, учитывая его количество цилиндров, объема двигателя, лошадиной силы, веса, ускорения, модельный год и страна происхождения. Рассмотрите Cylinders, Model_Year и Origin как категориальные переменные.

load carbig
Cylinders = categorical(Cylinders);
Model_Year = categorical(Model_Year);
Origin = categorical(cellstr(Origin));
X = table(Cylinders,Displacement,Horsepower,Weight,Acceleration,Model_Year,Origin);

Определите уровни в предикторах

Стандартный алгоритм CART имеет тенденцию разделять предикторы со многими уникальными значениями (уровни), например, непрерывные переменные, по тем с меньшим количеством уровней, например, категориальные переменные. Если ваши данные неоднородны, или ваши переменные прогноза отличаются значительно по своему количеству уровней, то рассматривают использование искривления или тестов взаимодействия для выбора предиктора разделения вместо стандартного CART.

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

  1. Преобразовывает все переменные в тип категориальных данных с помощью categorical

  2. Определяет все уникальные категории при игнорировании отсутствующих значений с помощью categories

  3. Считает категории с помощью numel

Затем примените функцию к каждой переменной с помощью varfun.

countLevels = @(x)numel(categories(categorical(x)));
numLevels = varfun(countLevels,X,'OutputFormat','uniform');

Сравните количество уровней среди переменных прогноза.

figure
bar(numLevels)
title('Number of Levels Among Predictors')
xlabel('Predictor variable')
ylabel('Number of levels')
h = gca;
h.XTickLabel = X.Properties.VariableNames(1:end-1);
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

Непрерывные переменные имеют намного больше уровней, чем категориальные переменные. Поскольку количество уровней среди предикторов отличается так, использование стандартного CART, чтобы выбрать предикторы разделения в каждом узле деревьев в случайном лесу может привести к неточным оценкам важности предиктора. В этом случае используйте тест искривления или тест взаимодействия. Задайте алгоритм при помощи аргумента пары "имя-значение" 'PredictorSelection'. Для получения дополнительной информации смотрите, Выбирают Split Predictor Selection Technique.

Обучите уволенный ансамбль деревьев регрессии

Обучите уволенный ансамбль 200 деревьев регрессии оценивать значения важности предиктора. Задайте древовидного ученика, использующего эти аргументы пары "имя-значение":

  • 'NumVariablesToSample','all' — Используйте все переменные прогноза в каждом узле, чтобы гарантировать, что каждое дерево использует все переменные прогноза.

  • 'PredictorSelection','interaction-curvature' — Задайте использование теста взаимодействия, чтобы выбрать предикторы разделения.

  • 'Surrogate','on' — Задайте использование суррогатных разделений, чтобы увеличить точность, потому что набор данных включает отсутствующие значения.

t = templateTree('NumVariablesToSample','all',...
    'PredictorSelection','interaction-curvature','Surrogate','on');
rng(1); % For reproducibility
Mdl = fitrensemble(X,MPG,'Method','Bag','NumLearningCycles',200, ...
    'Learners',t);

Mdl является моделью RegressionBaggedEnsemble.

Оцените модель R2 использование прогнозов из сумки.

yHat = oobPredict(Mdl);
R2 = corr(Mdl.Y,yHat)^2
R2 = 0.8744

Mdl объясняет 87% изменчивости вокруг среднего значения.

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

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

impOOB = oobPermutedPredictorImportance(Mdl);

impOOB 1 7 вектор оценок важности предиктора, соответствующих предикторам в Mdl.PredictorNames. Оценки не смещаются к предикторам, содержащим много уровней.

Сравните оценки важности предиктора.

figure
bar(impOOB)
title('Unbiased Predictor Importance Estimates')
xlabel('Predictor variable')
ylabel('Importance')
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';

Большие оценки важности указывают на более важные предикторы. Гистограмма предполагает, что Model_Year является самым важным предиктором, сопровождаемым Cylinders и Weight. Переменные Model_Year и Cylinders имеют только 13 и 5 отличных уровней, соответственно, тогда как переменная Weight имеет более чем 300 уровней.

Сравните оценки важности предиктора путем перестановки наблюдений из сумки и тех оценок, полученных путем подведения итогов усилений в среднеквадратической ошибке из-за разделений на каждом предикторе. Кроме того, получите меры ассоциации предиктора, оцененные суррогатными разделениями.

[impGain,predAssociation] = predictorImportance(Mdl);

figure
plot(1:numel(Mdl.PredictorNames),[impOOB' impGain'])
title('Predictor Importance Estimation Comparison')
xlabel('Predictor variable')
ylabel('Importance')
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';
legend('OOB permuted','MSE improvement')
grid on

Согласно значениям impGain, переменные Displacement, Horsepower и Weight, кажется, одинаково важны.

predAssociation 7 7 матрица мер ассоциации предиктора. Строки и столбцы соответствуют предикторам в Mdl.PredictorNames. Можно вывести силу отношения между парами предикторов с помощью элементов predAssociation. Большие значения указывают на более высоко коррелируемые пары предикторов.

figure
imagesc(predAssociation)
title('Predictor Association Estimates')
colorbar
h = gca;
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 45;
h.TickLabelInterpreter = 'none';
h.YTickLabel = Mdl.PredictorNames;

predAssociation(1,2)
ans = 0.6871

Крупнейшая ассоциация между Cylinders и Displacement, но значение не достаточно высоко, чтобы указать на прочные отношения между этими двумя предикторами.

Вырастите случайный лес Используя уменьшаемый набор предиктора

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

Вырастите случайный лес 200 деревьев регрессии с помощью лучших двух предикторов только. Значение 'NumVariablesToSample' по умолчанию templateTree является одной третью количества предикторов для регрессии, таким образом, fitrensemble использует случайный лесной алгоритм.

t = templateTree('PredictorSelection','interaction-curvature','Surrogate','on', ...
    'Reproducible',true); % For reproducibility of random predictor selections
MdlReduced = fitrensemble(X(:,{'Model_Year' 'Weight'}),MPG,'Method','Bag', ...
    'NumLearningCycles',200,'Learners',t);

Вычислите R2 из упрощенной модели.

yHatReduced = oobPredict(MdlReduced);
r2Reduced = corr(Mdl.Y,yHatReduced)^2
r2Reduced = 0.8627

R2 поскольку упрощенная модель близко к R2 из полной модели. Этот результат предполагает, что упрощенная модель достаточна для прогноза.

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

| | | | |

Похожие темы