Этот пример показывает, как выбрать соответствующий метод выбора предиктора разделения для вашего набора данных при росте случайного леса деревьев регрессии. Этот пример также показывает, как решить, который предикторы являются самыми важными, чтобы включать в данные тренировки.
Загрузите набор данных 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.
Для каждого предиктора определите количество уровней в данных. Один способ сделать это, задают анонимную функцию что:
Преобразовывает все переменные в тип категориальных данных с помощью categorical
Определяет все уникальные категории при игнорировании отсутствующих значений с помощью categories
Считает категории с помощью 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
.
Оцените модель использование прогнозов из сумки.
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);
Вычислите из упрощенной модели.
yHatReduced = oobPredict(MdlReduced); r2Reduced = corr(Mdl.Y,yHatReduced)^2
r2Reduced = 0.8627
поскольку упрощенная модель близко к из полной модели. Этот результат предполагает, что упрощенная модель достаточна для прогноза.
corr
| fitrensemble
| oobPermutedPredictorImportance
| oobPredict
| predictorImportance
| templateTree