В этом примере показано, как реализовать байесовскую оптимизацию, чтобы настроить гиперпараметры случайного леса регрессионых деревьев с помощью ошибки квантования. Настройка модели с помощью ошибки квантования, а не средней квадратичной невязки, подходит, если вы планируете использовать модель для предсказания условных квантилей, а не условных средств.
Загрузите carsmall
набор данных. Рассмотрим модель, которая предсказывает медианную экономию топлива автомобиля с учетом его ускорения, количества цилиндров, объема двигателя, мощности, производителя, модельного года и веса. Рассмотрим Cylinders
, Mfg
, и Model_Year
как категориальные переменные.
load carsmall Cylinders = categorical(Cylinders); Mfg = categorical(cellstr(Mfg)); Model_Year = categorical(Model_Year); X = table(Acceleration,Cylinders,Displacement,Horsepower,Mfg,... Model_Year,Weight,MPG); rng('default'); % For reproducibility
Рассмотрите настройку:
Сложность (глубина) деревьев в лесу. Глубокие деревья имеют тенденцию к избыточной подгонке, но мелкие деревья имеют тенденцию к подгонке. Поэтому укажите, что минимальное количество наблюдений на лист составляет не более 20.
При выращивании деревьев количество предикторов для выборки в каждом узле. Задайте выборку от 1 до всех предикторов.
bayesopt
функция, которая реализует байесовскую оптимизацию, требует, чтобы вы прошли эти спецификации как optimizableVariable
объекты.
maxMinLS = 20; minLS = optimizableVariable('minLS',[1,maxMinLS],'Type','integer'); numPTS = optimizableVariable('numPTS',[1,size(X,2)-1],'Type','integer'); hyperparametersRF = [minLS; numPTS];
hyperparametersRF
массив 2 на 1 OptimizableVariable
объекты.
Также следует рассмотреть настройку количества деревьев в ансамбле. bayesopt
имеет тенденцию выбирать случайные леса, содержащие много деревьев, поскольку ансамбли с большим количеством учащихся являются более точными. Если расчеты ресурсы доступны, это фактор, и вы предпочитаете ансамбли с таким меньшим количеством деревьев, затем рассмотрите настройку количества деревьев отдельно от других параметров или наказание моделей, содержащих много учащихся.
Задайте целевую функцию для оптимизированного алгоритма оптимизации Байеса. Функция должна:
Примите параметры, чтобы настроить как вход.
Обучите случайный лес, используя TreeBagger
. В TreeBagger
вызовите, укажите параметры для настройки и задайте возврат индексов вне сумки.
Оцените ошибку вне сумки на основе медианы.
Верните ошибку quantle out-of-bag.
function oobErr = oobErrRF(params,X) %oobErrRF Trains random forest and estimates out-of-bag quantile error % oobErr trains a random forest of 300 regression trees using the % predictor data in X and the parameter specification in params, and then % returns the out-of-bag quantile error based on the median. X is a table % and params is an array of OptimizableVariable objects corresponding to % the minimum leaf size and number of predictors to sample at each node. randomForest = TreeBagger(300,X,'MPG','Method','regression',... 'OOBPrediction','on','MinLeafSize',params.minLS,... 'NumPredictorstoSample',params.numPTS); oobErr = oobQuantileError(randomForest); end
Найдите модель, достигающую минимальной, наказанной, вне мешка ошибки количества с точки зрения сложности дерева и количества предикторов для выборки в каждом узле, используя байесовскую оптимизацию. Задайте ожидаемое улучшение плюс функцию как функцию сбора и подавьте печать информации оптимизации.
results = bayesopt(@(params)oobErrRF(params,X),hyperparametersRF,... 'AcquisitionFunctionName','expected-improvement-plus','Verbose',0);
results
является BayesianOptimization
объект, содержащий, помимо прочего, минимум целевой функции и оптимизированные значения гиперзначений параметров.
Отобразите наблюдаемый минимум целевой функции и оптимизированные значения гиперзначений параметров.
bestOOBErr = results.MinObjective bestHyperparameters = results.XAtMinObjective
bestOOBErr = 1.0890 bestHyperparameters = 1×2 table minLS numPTS _____ ______ 7 7
Обучите случайный лес, используя весь набор данных и оптимизированные значения гиперзначений параметров.
Mdl = TreeBagger(300,X,'MPG','Method','regression',... 'MinLeafSize',bestHyperparameters.minLS,... 'NumPredictorstoSample',bestHyperparameters.numPTS);
Mdl
является TreeBagger
оптимизированный для медианного предсказания объект. Можно предсказать медианную экономию топлива по данным предиктора путем передачи Mdl
и новые данные для quantilePredict
.
bayesopt
| oobQuantileError
| optimizableVariable
| TreeBagger
| TreeBagger