В этом примере показано, как обучить модель ансамбля оптимальными гиперпараметрами, и затем использовать блок 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'
обучать ансамбль оптимальными гиперпараметрами. '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.