Предсказание откликов с помощью блока RegressionEnsemble Predict

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

Figure contains an axes. The axes with title Min objective vs. Number of function evaluations contains 2 objects of type line. These objects represent Min observed objective, Estimated min objective.

__________________________________________________________
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

Этот пример предоставляет модель 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.

См. также

Похожие темы