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