В этом примере показано, как обучить модель ансамбля с оптимальными гиперпараметрами, а затем использовать блок RegressionEnsemble Predict для предсказания отклика в Simulink ®. Блок принимает наблюдение (данные предиктора) и возвращает предсказанный ответ для наблюдения, используя обученную модель регрессионого ансамбля .
Загрузите carbig набор данных, содержащий измерения автомобилей 1970-х и начала 1980-х годов.
load carbig
whosName Size Bytes Class Attributes Acceleration 406x1 3248 double Cylinders 406x1 3248 double Displacement 406x1 3248 double Horsepower 406x1 3248 double MPG 406x1 3248 double Mfg 406x13 10556 char Model 406x36 29232 char Model_Year 406x1 3248 double Origin 406x7 5684 char Weight 406x1 3248 double cyl4 406x5 4060 char org 406x7 5684 char when 406x5 4060 char
Origin является категориальной переменной. Когда вы обучаете модель для блока RegressionEnsemble Predict, необходимо предварительно обработать категориальные предикторы при помощи dummyvar функция для включения категориальных предикторов в модель. Вы не можете использовать 'CategoricalPredictors' аргумент имя-значение. Создайте фиктивные переменные для Origin.
c_Origin = categorical(cellstr(Origin)); d_Origin = dummyvar(c_Origin);
dummyvar создает фиктивные переменные для каждой категории c_Origin. Определите количество категорий в c_Origin и количество фиктивных переменных в d_Origin.
unique(cellstr(Origin))
ans = 7x1 cell
{'England'}
{'France' }
{'Germany'}
{'Italy' }
{'Japan' }
{'Sweden' }
{'USA' }
size(d_Origin)
ans = 1×2
406 7
dummyvar создает фиктивные переменные для каждой категории Origin.
Создайте матрицу, содержащую шесть числовых переменных предиктора и семь фиктивных переменных для Origin. Также создайте вектор переменной отклика.
X = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight,d_Origin]; Y = MPG;
Обучите ансамбль с помощью X и Y с этими опциями:
Задайте 'OptimizeHyperparameters' как 'auto' обучить ансамбль с оптимальными гиперпараметрами. The 'auto' опция находит оптимальные значения для 'Method', 'NumLearningCycles', и 'LearnRate' (для применимых методов) fitrensemble и 'MinLeafSize' учащихся дерева.
Для воспроизводимости установите случайный seed и используйте 'expected-improvement-plus' функция сбора. Кроме того, для воспроизводимости алгоритма случайного леса задайте 'Reproducible' как true для учащихся дерева.
rng('default') t = templateTree('Reproducible',true); ensMdl = fitrensemble(X,Y,'Learners',t, ... 'OptimizeHyperparameters','auto', ... 'HyperparameterOptimizationOptions', ... struct('AcquisitionFunctionName','expected-improvement-plus'))
|===================================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | Method | NumLearningC-| LearnRate | MinLeafSize | | | result | log(1+loss) | runtime | (observed) | (estim.) | | ycles | | | |===================================================================================================================================| | 1 | Best | 2.7403 | 5.2831 | 2.7403 | 2.7403 | Bag | 184 | - | 69 | | 2 | Accept | 4.1317 | 0.40701 | 2.7403 | 2.8143 | Bag | 10 | - | 176 | | 3 | Best | 2.1687 | 4.661 | 2.1687 | 2.1689 | Bag | 118 | - | 2 | | 4 | Accept | 2.2747 | 1.1426 | 2.1687 | 2.1688 | LSBoost | 24 | 0.37779 | 7 | | 5 | Best | 2.1421 | 2.6108 | 2.1421 | 2.1422 | Bag | 75 | - | 1 | | 6 | Best | 2.1365 | 19.045 | 2.1365 | 2.1365 | Bag | 500 | - | 1 | | 7 | Accept | 2.4302 | 1.2523 | 2.1365 | 2.1365 | LSBoost | 37 | 0.94779 | 71 | | 8 | Accept | 2.1813 | 15.474 | 2.1365 | 2.1365 | LSBoost | 497 | 0.023582 | 1 | | 9 | Accept | 6.1992 | 3.5048 | 2.1365 | 2.1363 | LSBoost | 91 | 0.0012439 | 1 | | 10 | Accept | 2.2119 | 16.1 | 2.1365 | 2.1363 | LSBoost | 497 | 0.087441 | 11 | | 11 | Accept | 4.7782 | 0.59399 | 2.1365 | 2.1366 | LSBoost | 15 | 0.055744 | 1 | | 12 | Accept | 2.3093 | 16.744 | 2.1365 | 2.1366 | LSBoost | 493 | 0.39665 | 1 | | 13 | Accept | 4.1304 | 5.6411 | 2.1365 | 2.1366 | LSBoost | 198 | 0.33031 | 201 | | 14 | Accept | 2.595 | 0.64113 | 2.1365 | 2.1367 | LSBoost | 16 | 0.99848 | 1 | | 15 | Accept | 2.6643 | 0.96942 | 2.1365 | 2.1363 | LSBoost | 25 | 0.97637 | 5 | | 16 | Accept | 2.2388 | 0.49288 | 2.1365 | 2.1363 | LSBoost | 11 | 0.42205 | 1 | | 17 | Accept | 4.1304 | 0.6568 | 2.1365 | 2.1789 | LSBoost | 19 | 0.79808 | 202 | | 18 | Accept | 2.3399 | 2.3878 | 2.1365 | 2.1363 | LSBoost | 71 | 0.44856 | 1 | | 19 | Accept | 2.7734 | 3.5709 | 2.1365 | 2.1394 | LSBoost | 107 | 0.020776 | 2 | | 20 | Accept | 2.3204 | 12.775 | 2.1365 | 2.136 | Bag | 463 | - | 16 | |===================================================================================================================================| | Iter | Eval | Objective: | Objective | BestSoFar | BestSoFar | Method | NumLearningC-| LearnRate | MinLeafSize | | | result | log(1+loss) | runtime | (observed) | (estim.) | | ycles | | | |===================================================================================================================================| | 21 | Accept | 2.2146 | 13.957 | 2.1365 | 2.1361 | LSBoost | 491 | 0.10045 | 55 | | 22 | Accept | 4.3329 | 0.62329 | 2.1365 | 2.137 | LSBoost | 11 | 0.095932 | 1 | | 23 | Accept | 2.6395 | 0.53374 | 2.1365 | 2.1366 | LSBoost | 15 | 0.14881 | 17 | | 24 | Accept | 2.6223 | 15.344 | 2.1365 | 2.137 | LSBoost | 497 | 0.96521 | 27 | | 25 | Accept | 2.197 | 8.5088 | 2.1365 | 2.1366 | LSBoost | 268 | 0.066671 | 29 | | 26 | Accept | 2.4544 | 0.45973 | 2.1365 | 2.1398 | LSBoost | 10 | 0.96554 | 28 | | 27 | Accept | 2.1581 | 15.347 | 2.1365 | 2.1386 | LSBoost | 499 | 0.022533 | 37 | | 28 | Accept | 2.187 | 16.788 | 2.1365 | 2.1402 | LSBoost | 499 | 0.022909 | 6 | | 29 | Accept | 4.1304 | 13.939 | 2.1365 | 2.1366 | LSBoost | 494 | 0.035155 | 202 | | 30 | Accept | 2.2396 | 18.744 | 2.1365 | 2.1366 | LSBoost | 485 | 0.21133 | 21 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 280.2517 seconds
Total objective function evaluation time: 218.1981
Best observed feasible point:
Method NumLearningCycles LearnRate MinLeafSize
______ _________________ _________ ___________
Bag 500 NaN 1
Observed objective function value = 2.1365
Estimated objective function value = 2.1366
Function evaluation time = 19.0453
Best estimated feasible point (according to models):
Method NumLearningCycles LearnRate MinLeafSize
______ _________________ _________ ___________
Bag 500 NaN 1
Estimated objective function value = 2.1366
Estimated function evaluation time = 17.1759
ensMdl =
RegressionBaggedEnsemble
ResponseName: 'Y'
CategoricalPredictors: []
ResponseTransform: 'none'
NumObservations: 398
HyperparameterOptimizationResults: [1x1 BayesianOptimization]
NumTrained: 500
Method: 'Bag'
LearnerNames: {'Tree'}
ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
FitInfo: []
FitInfoDescription: 'None'
Regularization: []
FResample: 1
Replace: 1
UseObsForLearner: [398x500 logical]
Properties, Methods
fitrensemble возвращает RegressionBaggedEnsemble объект, потому что функция находит случайный алгоритм леса ('Bag') как оптимальный метод.
Этот пример предоставляет модель Simulink slexCarDataRegressionEnsemblePredictExample.slx, который включает блок RegressionEnsemble Predict. Можно открыть модель Simulink или создать новую модель, как описано в этом разделе.
Откройте модель Simulink slexCarDataRegressionEnsemblePredictExample.slx.
SimMdlName = 'slexCarDataRegressionEnsemblePredictExample';
open_system(SimMdlName)
The PreLoadFcn функция обратного вызова от slexCarDataRegressionEnsemblePredictExample включает код для загрузки выборочных данных, обучения модели с помощью оптимальных гиперпараметров и создания входного сигнала для модели Simulink. Если вы открываете модель Simulink, то программное обеспечение запускает код в PreLoadFcn перед загрузкой модели Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Setup на вкладке Modeling, нажмите Model Settings и выберите Model Properties. Затем на вкладке Callbacks выберите PreLoadFcn функция обратного вызова на панели обратных коллбэков Model.
Чтобы создать новую модель Simulink, откройте шаблон Blank Model и добавьте блок RegressionEnsemble Predict. Добавьте блоки Inport и Outport и соедините их с блоком RegressionEnsemble Predict.
Дважды кликните блок RegressionEnsemble Predict, чтобы открыть диалоговое окно Параметров блоков. Задайте значение Select trained машинного обучения параметра модели как ensMdl, которое является именем переменной рабочей области, содержащей обученную модель. "Нажмите кнопку ""Обновить""". В диалоговом окне отображаются опции, используемые для обучения модели ensMdl в рамках модели обученного машинного обучения.

Блок RegressionEnsemble Predict ожидает наблюдения, содержащего 13 значений предиктора. Дважды кликните блок Inport и установите размерности порта равным 13 на вкладке Signal Attributes.
Создайте входной сигнал в виде массива структур для модели Simulink. Массив структур должен содержать следующие поля:
time - Точки времени, в которые наблюдения заходят в модель. Ориентация должна соответствовать наблюдениям в данных предиктора. Итак, в этом примере time должен быть вектор-столбец.
signals - массив структур 1 на 1, описывающий входные данные и содержащий поля values и dimensions, где values является матрицей данных предиктора и dimensions - количество переменных предиктора.
Создайте соответствующий массив структур для slexCarDataRegressionEnsemblePredictExample модель из carsmall набор данных. Когда вы преобразуете Origin в carsmall на categorical тип данных array c_Origin_small, использовать categories(c_Origin) так что c_Origin и c_Origin_small иметь одинаковое количество категорий в том же порядке.
load carsmall
c_Origin_small = categorical(cellstr(Origin),categories(c_Origin));
d_Origin_small = dummyvar(c_Origin_small);
testX = [Acceleration,Cylinders,Displacement,Horsepower,Model_Year,Weight,d_Origin_small];
testX = rmmissing(testX);
carsmallInput.time = (0:size(testX,1)-1)';
carsmallInput.signals(1).values = testX;
carsmallInput.signals(1).dimensions = size(testX,2);Для импорта данных о сигнале из рабочей области:
Откройте диалоговое окно Параметры конфигурации. На вкладке Моделирование (Modeling) щелкните Настройки модели (Model Settings).
На панели Импорт/экспорт данных установите флажок Вход и введите carsmallInput в соседнем текстовом поле.
На панели « Решатели» в разделе «Время симуляции» установите значение «Время остановки» carsmallInput.time(end). В группе «Выбор решателя» установите для параметра «Тип» значение Fixed-step, и установите решатель на discrete (no continuous states).
Для получения дополнительной информации смотрите Загрузку Данных Сигнала для Симуляции (Simulink).
Симулируйте модель.
sim(SimMdlName);
Когда блок Inport обнаруживает наблюдение, он направляет наблюдение в блок RegressionTree Predict. Можно использовать Данные моделирования Inspector (Simulink), чтобы просмотреть записанные данные блока Outport.