В этом примере показано, как оптимизировать гиперпараметры повышенного ансамбля регрессии. Оптимизация минимизирует потерю перекрестной проверки модели.
Проблема состоит в том, чтобы смоделировать КПД в милях на галлон автомобиля, на основе его ускорения, объема двигателя, лошадиной силы и веса. Загрузите 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.5457 | 8.2128 | 3.5457 | 3.5457 | 383 | 0.51519 | 4 |
| 2 | Best | 3.4903 | 0.41109 | 3.4903 | 3.4933 | 16 | 0.66503 | 7 |
| 3 | Best | 3.1763 | 0.78207 | 3.1763 | 3.1764 | 33 | 0.2556 | 92 |
| 4 | Accept | 6.3076 | 0.34868 | 3.1763 | 3.1768 | 13 | 0.0053227 | 5 |
| 5 | Accept | 3.4071 | 1.7753 | 3.1763 | 3.1768 | 78 | 0.47249 | 99 |
| 6 | Accept | 3.7443 | 0.26439 | 3.1763 | 3.1774 | 10 | 0.14669 | 86 |
| 7 | Accept | 3.1772 | 0.28254 | 3.1763 | 3.1756 | 10 | 0.29922 | 20 |
| 8 | Best | 3.1503 | 9.8543 | 3.1503 | 3.1677 | 495 | 0.26141 | 1 |
| 9 | Accept | 3.4226 | 0.91397 | 3.1503 | 3.168 | 37 | 0.99969 | 24 |
| 10 | Accept | 3.2646 | 0.72349 | 3.1503 | 3.193 | 31 | 0.27693 | 10 |
| 11 | Accept | 3.3428 | 7.0584 | 3.1503 | 3.2275 | 314 | 0.27312 | 47 |
| 12 | Accept | 5.9344 | 5.6579 | 3.1503 | 3.2289 | 259 | 0.0010001 | 21 |
| 13 | Best | 3.0379 | 2.7762 | 3.0379 | 3.0497 | 139 | 0.024969 | 1 |
| 14 | Accept | 3.2336 | 2.1551 | 3.0379 | 3.0571 | 97 | 0.037926 | 24 |
| 15 | Accept | 3.1774 | 9.9179 | 3.0379 | 3.1059 | 439 | 0.027258 | 20 |
| 16 | Accept | 4.8699 | 0.66609 | 3.0379 | 3.0764 | 31 | 0.026817 | 2 |
| 17 | Accept | 3.2566 | 5.4116 | 3.0379 | 3.0579 | 244 | 0.058858 | 8 |
| 18 | Best | 3.0314 | 4.8355 | 3.0314 | 3.0191 | 214 | 0.025201 | 44 |
| 19 | Accept | 3.2227 | 11.275 | 3.0314 | 3.0179 | 500 | 0.12391 | 52 |
| 20 | Accept | 3.0635 | 3.6356 | 3.0314 | 3.0321 | 180 | 0.02991 | 2 |
|====================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | NumLearningC-| LearnRate | MaxNumSplits | | | result | log(1+loss) | runtime | (observed) | (estim.) | ycles | | | |====================================================================================================================| | 21 | Accept | 3.2057 | 5.2988 | 3.0314 | 3.0363 | 237 | 0.01568 | 97 |
| 22 | Accept | 3.1692 | 1.7442 | 3.0314 | 3.0381 | 76 | 0.14203 | 53 |
| 23 | Accept | 3.1204 | 4.0391 | 3.0314 | 3.0561 | 178 | 0.025816 | 63 |
| 24 | Best | 2.9564 | 3.6824 | 2.9564 | 3.003 | 185 | 0.028069 | 1 |
| 25 | Best | 2.8344 | 4.448 | 2.8344 | 2.9067 | 224 | 0.023927 | 1 |
| 26 | Accept | 2.9268 | 5.2045 | 2.8344 | 2.9136 | 262 | 0.021782 | 1 |
| 27 | Accept | 3.0143 | 4.8904 | 2.8344 | 2.9443 | 249 | 0.022608 | 1 |
| 28 | Accept | 6.4222 | 0.26882 | 2.8344 | 2.9451 | 10 | 0.0010031 | 25 |
| 29 | Accept | 3.513 | 9.9166 | 2.8344 | 2.9458 | 499 | 0.0038235 | 1 |
| 30 | Accept | 3.01 | 9.915 | 2.8344 | 2.9461 | 499 | 0.011582 | 1 |
__________________________________________________________ Optimization completed. MaxObjectiveEvaluations of 30 reached. Total function evaluations: 30 Total elapsed time: 159.6818 seconds. Total objective function evaluation time: 126.3662 Best observed feasible point: NumLearningCycles LearnRate MaxNumSplits _________________ _________ ____________ 224 0.023927 1 Observed objective function value = 2.8344 Estimated objective function value = 2.9461 Function evaluation time = 4.448 Best estimated feasible point (according to models): NumLearningCycles LearnRate MaxNumSplits _________________ _________ ____________ 224 0.023927 1 Estimated objective function value = 2.9461 Estimated function evaluation time = 4.4346
Mdl = classreg.learning.regr.RegressionEnsemble ResponseName: 'Y' CategoricalPredictors: [] ResponseTransform: 'none' NumObservations: 94 HyperparameterOptimizationResults: [1×1 BayesianOptimization] NumTrained: 224 Method: 'LSBoost' LearnerNames: {'Tree'} ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.' FitInfo: [224×1 double] FitInfoDescription: {2×1 cell} Regularization: [] Properties, Methods
Сравните потерю для той из повышенной, неоптимизированной модели, и тому из ансамбля по умолчанию.
loss = kfoldLoss(crossval(Mdl,'kfold',10))
loss = 19.7084
Mdl2 = fitrensemble(X,Y,... 'Method','LSBoost',... 'Learner',templateTree('Surrogate','on')); loss2 = kfoldLoss(crossval(Mdl2,'kfold',10))
loss2 = 30.9569
Mdl3 = fitrensemble(X,Y);
loss3 = kfoldLoss(crossval(Mdl3,'kfold',10))
loss3 = 38.0049
Для различного способа оптимизировать этот ансамбль, смотрите, Оптимизируют Ансамбль Регрессии Используя Перекрестную проверку.