В этом примере показано, как оптимизировать гиперпараметры повышенного ансамбля регрессии. Оптимизация минимизирует потерю перекрестной проверки модели.
Проблема состоит в том, чтобы смоделировать КПД в милях на галлон автомобиля, на основе его ускорения, объема двигателя, лошадиной силы и веса. Загрузите carsmall данные, которые содержат эти и другие предикторы.
load carsmall
X = [Acceleration Displacement Horsepower Weight];
Y = MPG;Соответствуйте ансамблю регрессии к данным с помощью LSBoost алгоритм и использование суррогатных разделений. Оптимизируйте получившуюся модель путем варьирования количества изучения циклов, максимального количества суррогатных разделений и изучить уровня. Кроме того, позвольте оптимизации повторно делить перекрестную проверку между каждой итерацией.
Для воспроизводимости установите случайный seed и используйте 'expected-improvement-plus' функция приобретения.
rng('default') Mdl = fitrensemble(X,Y, ... 'Method','LSBoost', ... 'Learner',templateTree('Surrogate','on'), ... 'OptimizeHyperparameters',{'NumLearningCycles','MaxNumSplits','LearnRate'}, ... 'HyperparameterOptimizationOptions',struct('Repartition',true, ... 'AcquisitionFunctionName','expected-improvement-plus'))
|====================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | NumLearningC-| LearnRate | MaxNumSplits | | | result | log(1+loss) | runtime | (observed) | (estim.) | ycles | | | |====================================================================================================================| | 1 | Best | 3.5219 | 12.762 | 3.5219 | 3.5219 | 383 | 0.51519 | 4 | | 2 | Best | 3.4752 | 1.0824 | 3.4752 | 3.4777 | 16 | 0.66503 | 7 | | 3 | Best | 3.1575 | 1.5703 | 3.1575 | 3.1575 | 33 | 0.2556 | 92 | | 4 | Accept | 6.3076 | 0.65033 | 3.1575 | 3.1579 | 13 | 0.0053227 | 5 | | 5 | Accept | 3.4449 | 9.5959 | 3.1575 | 3.1579 | 277 | 0.45891 | 99 | | 6 | Accept | 3.9806 | 0.44253 | 3.1575 | 3.1584 | 10 | 0.13017 | 33 | | 7 | Best | 3.059 | 0.48004 | 3.059 | 3.06 | 10 | 0.30126 | 3 | | 8 | Accept | 3.1707 | 0.52678 | 3.059 | 3.1144 | 10 | 0.28991 | 15 | | 9 | Accept | 3.0937 | 0.51983 | 3.059 | 3.1046 | 10 | 0.31488 | 13 | | 10 | Accept | 3.196 | 0.50347 | 3.059 | 3.1233 | 10 | 0.32005 | 11 | | 11 | Best | 3.0495 | 0.40737 | 3.0495 | 3.1083 | 10 | 0.27882 | 85 | | 12 | Best | 2.946 | 0.39281 | 2.946 | 3.0774 | 10 | 0.27157 | 7 | | 13 | Accept | 3.2026 | 0.51172 | 2.946 | 3.0995 | 10 | 0.25734 | 20 | | 14 | Accept | 5.595 | 15.127 | 2.946 | 3.0996 | 440 | 0.0010008 | 36 | | 15 | Accept | 3.1976 | 16.499 | 2.946 | 3.0935 | 496 | 0.027133 | 18 | | 16 | Accept | 3.9809 | 1.2163 | 2.946 | 3.0927 | 34 | 0.041016 | 18 | | 17 | Accept | 3.0512 | 13.382 | 2.946 | 3.0939 | 428 | 0.019766 | 3 | | 18 | Accept | 3.4832 | 7.2531 | 2.946 | 3.0946 | 205 | 0.99989 | 8 | | 19 | Accept | 3.3389 | 3.2927 | 2.946 | 3.0956 | 95 | 0.021453 | 2 | | 20 | Accept | 3.2818 | 17.258 | 2.946 | 3.0979 | 494 | 0.020773 | 12 | |====================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | NumLearningC-| LearnRate | MaxNumSplits | | | result | log(1+loss) | runtime | (observed) | (estim.) | ycles | | | |====================================================================================================================| | 21 | Accept | 3.4367 | 16.049 | 2.946 | 3.0962 | 480 | 0.27412 | 7 | | 22 | Accept | 6.2247 | 0.5334 | 2.946 | 3.0995 | 10 | 0.010965 | 15 | | 23 | Accept | 3.2847 | 6.7898 | 2.946 | 3.0991 | 181 | 0.057422 | 22 | | 24 | Accept | 3.142 | 8.8034 | 2.946 | 3.0997 | 222 | 0.025594 | 25 | | 25 | Accept | 3.2174 | 0.88584 | 2.946 | 3.106 | 18 | 0.32203 | 37 | | 26 | Accept | 3.064 | 4.7416 | 2.946 | 3.1057 | 108 | 0.18554 | 1 | | 27 | Accept | 3.4532 | 3.0553 | 2.946 | 3.1038 | 93 | 0.22441 | 3 | | 28 | Accept | 3.1992 | 9.249 | 2.946 | 3.1038 | 252 | 0.020628 | 3 | | 29 | Best | 2.9432 | 0.475 | 2.9432 | 3.0766 | 10 | 0.36141 | 86 | | 30 | Best | 2.891 | 0.54495 | 2.891 | 3 | 10 | 0.38339 | 2 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 208.1748 seconds
Total objective function evaluation time: 154.602
Best observed feasible point:
NumLearningCycles LearnRate MaxNumSplits
_________________ _________ ____________
10 0.38339 2
Observed objective function value = 2.891
Estimated objective function value = 2.9674
Function evaluation time = 0.54495
Best estimated feasible point (according to models):
NumLearningCycles LearnRate MaxNumSplits
_________________ _________ ____________
10 0.30126 3
Estimated objective function value = 3
Estimated function evaluation time = 0.49592
Mdl =
RegressionEnsemble
ResponseName: 'Y'
CategoricalPredictors: []
ResponseTransform: 'none'
NumObservations: 94
HyperparameterOptimizationResults: [1x1 BayesianOptimization]
NumTrained: 10
Method: 'LSBoost'
LearnerNames: {'Tree'}
ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
FitInfo: [10x1 double]
FitInfoDescription: {2x1 cell}
Regularization: []
Properties, Methods
Сравните потерю для той из повышенной, неоптимизированной модели, и тому из ансамбля по умолчанию.
loss = kfoldLoss(crossval(Mdl,'kfold',10))loss = 20.6082
Mdl2 = fitrensemble(X,Y, ... 'Method','LSBoost', ... 'Learner',templateTree('Surrogate','on')); loss2 = kfoldLoss(crossval(Mdl2,'kfold',10))
loss2 = 36.4539
Mdl3 = fitrensemble(X,Y);
loss3 = kfoldLoss(crossval(Mdl3,'kfold',10))loss3 = 36.6756
Для различного способа оптимизировать этот ансамбль, смотрите, Оптимизируют Ансамбль Регрессии Используя Перекрестную проверку.