В этом примере показано, как обучить модель ансамбля оптимальным гиперпараметрам, а затем использовать блок прогнозирования RegingEnsemble для прогнозирования отклика в 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 является категориальной переменной. При подготовке модели для блока прогнозирования RegingEnsemble необходимо предварительно обработать категориальные предикторы с помощью 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' обучающихся деревьям.
Для воспроизводимости задайте случайное начальное число и используйте '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, который включает блок прогнозирования RegingEnsemble. Можно открыть модель Simulink или создать новую модель, как описано в этом разделе.
Открытие модели Simulink slexCarDataRegressionEnsemblePredictExample.slx.
SimMdlName = 'slexCarDataRegressionEnsemblePredictExample';
open_system(SimMdlName)
PreLoadFcn функция обратного вызова slexCarDataRegressionEnsemblePredictExample включает код для загрузки данных выборки, обучения модели с использованием оптимальных гиперпараметров и создания входного сигнала для модели Simulink. При открытии модели Simulink программа запускает код в PreLoadFcn перед загрузкой модели Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Настройка (Setup) на вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings) и выберите Свойства модели (Model Properties). Затем на вкладке Callbacks выберите PreLoadFcn функция обратного вызова на панели Обратные вызовы модели.
Чтобы создать новую модель Simulink, откройте шаблон «Пустая модель» и добавьте блок «Прогнозирование ансамбля». Добавьте блоки Inport и Outport и подключите их к блоку RegingEnsemble Predict.
Чтобы открыть диалоговое окно «Параметры блока», дважды щелкните блок «Прогнозирование ансамбля». Укажите параметр Выбрать обучаемую модель машинного обучения (Select trained machine learning model) как ensMdl, которое является именем переменной рабочей области, содержащей обучаемую модель. "Нажмите кнопку ""Обновить""". В диалоговом окне отображаются опции, используемые для обучения модели. ensMdl в разделе Обучаемая модель машинного обучения.

Блок прогнозирования RegingEnsemble ожидает наблюдения, содержащего 13 предикторных значений. Дважды щелкните блок «Inport» и установите для параметра «Port dimensions» значение 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);Чтобы импортировать данные сигнала из рабочей области:
Откройте диалоговое окно «Параметры конфигурации». На вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings).
На панели Импорт/экспорт данных установите флажок Ввод и введите carsmallInput в соседнем текстовом поле.
На панели Решатель (Solver) в разделе Время моделирования (Simulation time) задайте для параметра Время остановки (Stop time) значение carsmallInput.time(end). В разделе Выбор решателя (Solver selection) задайте для параметра Тип (Type) значение Fixed-stepи установите для решателя значение discrete (no continuous states).
Дополнительные сведения см. в разделе Загрузка данных сигналов для моделирования (Simulink).
Моделирование модели.
sim(SimMdlName);
Когда блок Inport обнаруживает наблюдение, он направляет его в блок прогнозирования RegingTree. Инспектор данных моделирования (Simulation Data Inspector, Simulink) можно использовать для просмотра зарегистрированных данных блока исходящего трафика.