В этом примере показано, как обучить модель ансамбля оптимальными гиперпараметрами, и затем использовать блок 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' обучать ансамбль оптимальными гиперпараметрами. '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)
PreLoadFcn функция обратного вызова slexCarDataRegressionEnsemblePredictExample включает код, чтобы загрузить выборочные данные, обучить модель с помощью оптимальных гиперпараметров и создать входной сигнал для модели Simulink. Если вы открываете модель Simulink, то программное обеспечение запускает код в PreLoadFcn прежде, чем загрузить модель Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Setup по вкладке Modeling, нажимают Model Settings и выбирают Model Properties. Затем на вкладке Callbacks выберите PreLoadFcn функция обратного вызова в панели коллбэков Модели.
Чтобы создать новую модель Simulink, откройте шаблон Blank Model и добавьте блок RegressionEnsemble Predict. Добавьте блоки Inport и Outport и соедините их с блоком RegressionEnsemble Predict.
Дважды кликните блок RegressionEnsemble Predict, чтобы открыть диалоговое окно Block Parameters. Укажите, что Выбор обучил параметр модели машинного обучения как ensMdl, который является именем переменной рабочей области, которая содержит обученную модель. Нажмите Кнопку Обновить. Диалоговое окно отображается, опции раньше обучали модель ensMdl в соответствии с обученной моделью машинного обучения.

Блок RegressionEnsemble Predict ожидает наблюдение, содержащее 13 значений предиктора. Дважды кликните блок Inport и установите размерности Порта на 13 на вкладке Signal Attributes.
Создайте входной сигнал в форме массива структур для модели Simulink. Массив структур должен содержать эти поля:
time — Моменты времени, в которых наблюдения вводят модель. Ориентация должна соответствовать наблюдениям в данных о предикторе. Так, в этом примере, time должен быть вектор-столбец.
signals — Массив структур 1 на 1, описывающий входные данные и содержащий поля values и dimensions, где values матрица данных о предикторе и dimensions количество переменных предикторов.
Создайте соответствующий массив структур для slexCarDataRegressionEnsemblePredictExample модель от carsmall набор данных. Когда вы преобразуете Origin в carsmall к categorical массив типа данных 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);Импортировать данные сигнала из рабочей области:
Откройте диалоговое окно Configuration Parameters. На вкладке Modeling нажмите Model Settings.
В панели Импорта/Экспорта Данных установите флажок Input и введите carsmallInput в смежном текстовом поле.
В панели Решателя, под Временем симуляции, Временем остановки набора к carsmallInput.time(end). При выборе Решателя, Типе набора к Fixed-step, и Решатель набора к discrete (no continuous states).
Для получения дополнительной информации смотрите Данные сигнала Загрузки для Симуляции (Simulink).
Симулируйте модель.
sim(SimMdlName);
Когда блок Inport обнаруживает наблюдение, он направляет наблюдение в блок RegressionTree Predict. Можно использовать Инспектора Данных моделирования (Simulink), чтобы просмотреть записанные данные блока Outport.