В этом примере показано, как обучить модель ансамбля с оптимальными гиперпараметрами, а затем использовать блок RegressionEnsemble Predict для предсказания отклика в Simulink ®. Блок принимает наблюдение (данные предиктора) и возвращает предсказанный ответ для наблюдения, используя обученную модель регрессионого ансамбля .
Загрузите carbig
набор данных, содержащий измерения автомобилей 1970-х и начала 1980-х годов.
load carbig
whos
Name 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.