Выберите 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 из полной модели. Этот результат предполагает, что упрощенная модель достаточна для предсказания.

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

| | | | |

Похожие темы