exponenta event banner

Прогнозирование меток классов с использованием блока прогнозирования Ensemble

В этом примере показано, как обучить модель ансамбля оптимальным гиперпараметрам, а затем использовать блок Прогнозирование ансамбля для прогнозирования меток в Simulink ®. Блок принимает наблюдение (данные предиктора) и возвращает предсказанную метку класса и оценку класса для наблюдения с использованием обученной модели классификационного ансамбля .

Модель классификации поездов с оптимальными гиперпараметрами

Загрузить CreditRating_Historical набор данных. Этот набор данных содержит идентификаторы клиентов и их финансовые коэффициенты, отраслевые наклейки и кредитные рейтинги. Определите размер выборки.

tbl = readtable('CreditRating_Historical.dat');
n = numel(tbl)
n = 31456

Отображение первых трех строк таблицы.

head(tbl,3)
ans=3×8 table
     ID      WC_TA    RE_TA    EBIT_TA    MVE_BVTD    S_TA     Industry    Rating
    _____    _____    _____    _______    ________    _____    ________    ______

    62394    0.013    0.104     0.036      0.447      0.142       3        {'BB'}
    48608    0.232    0.335     0.062      1.969      0.281       8        {'A' }
    42444    0.311    0.367     0.074      1.935      0.366       1        {'A' }

tbl.Industry является категориальной переменной для отраслевой метки. При обучении модели для блока Прогнозирование Ensemble необходимо предварительно обработать категориальные предикторы с помощью dummyvar функция для включения категориальных предикторов в модель. Вы не можете использовать 'CategoricalPredictors' аргумент «имя-значение». Создать фиктивные переменные для tbl.Industry.

d = dummyvar(tbl.Industry);

dummyvar создает фиктивные переменные для каждой категории tbl.Industry. Определение количества категорий в tbl.Industry и количество фиктивных переменных в d.

unique(tbl.Industry)'
ans = 1×12

     1     2     3     4     5     6     7     8     9    10    11    12

size(d)
ans = 1×2

        3932          12

Создайте числовую матрицу для переменных предиктора и массив ячеек для переменной ответа.

X = [table2array(tbl(:,2:6)) d];
Y = tbl.Rating;

X - числовая матрица, содержащая 17 переменных: пять финансовых коэффициентов и 12 фиктивных переменных для отраслевой метки. X не использует tbl.ID потому что переменная не полезна при прогнозировании кредитных рейтингов. Y является массивом ячеек символьных векторов, который содержит соответствующие кредитные рейтинги.

Предположим, что вы получаете данные последовательно, и у вас есть первые 3000 наблюдений, но вы еще не получили последние 932. Разбейте данные на текущую и будущую выборки.

prsntX = X(1:3000,:);
prsntY = Y(1:3000);
ftrX = X(3001:end,:);
ftrY = Y(3001:end);

Обучение ансамбля с использованием всех имеющихся в настоящее время данных prsntX и prsntY с этими опциями:

  • Определить 'OptimizeHyperparameters' как 'auto' обучить ансамбль оптимальным гиперпараметрам. 'auto' опция находит оптимальные значения для 'Method','NumLearningCycles', и 'LearnRate' (для применимых методов) fitcensemble и 'MinLeafSize' обучающихся деревьям.

  • Для воспроизводимости задайте случайное начальное число и используйте 'expected-improvement-plus' функция приобретения. Также для воспроизводимости алгоритма случайного леса укажите 'Reproducible' как true для обучающихся на деревьях.

  • Укажите порядок классов с помощью 'ClassNames' аргумент «имя-значение». Выходные значения из порта оценки блока прогнозирования Ensemble имеют одинаковый порядок.

rng('default')
t = templateTree('Reproducible',true);
ensMdl = fitcensemble(prsntX,prsntY, ...
    'ClassNames',{'AAA' 'AA' 'A' 'BBB' 'BB' 'B' 'CCC'}, ...
    'OptimizeHyperparameters','auto','Learners',t, ...
    'HyperparameterOptimizationOptions', ...
    struct('AcquisitionFunctionName','expected-improvement-plus'))
|===================================================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   |       Method | NumLearningC-|    LearnRate |  MinLeafSize |
|      | result |             | runtime     | (observed)  | (estim.)    |              | ycles        |              |              |
|===================================================================================================================================|
|    1 | Best   |     0.51133 |      13.652 |     0.51133 |     0.51133 |   AdaBoostM2 |          429 |     0.082478 |          871 |
|    2 | Best   |     0.26133 |      18.827 |     0.26133 |     0.27463 |   AdaBoostM2 |          492 |      0.19957 |            4 |
|    3 | Accept |     0.85133 |     0.76925 |     0.26133 |     0.28421 |     RUSBoost |           10 |      0.34528 |         1179 |
|    4 | Accept |       0.263 |     0.61254 |     0.26133 |     0.26124 |   AdaBoostM2 |           13 |      0.27107 |           10 |
|    5 | Best   |        0.26 |      0.9413 |        0.26 |     0.26003 |          Bag |           10 |            - |            1 |
|    6 | Accept |     0.28933 |      1.7101 |        0.26 |      0.2602 |          Bag |           36 |            - |          101 |
|    7 | Best   |     0.25667 |      1.3583 |     0.25667 |     0.25726 |   AdaBoostM2 |           33 |      0.99501 |           11 |
|    8 | Best   |       0.244 |      28.725 |       0.244 |     0.24406 |          Bag |          460 |            - |            7 |
|    9 | Accept |       0.246 |        4.19 |       0.244 |     0.24435 |          Bag |           60 |            - |            4 |
|   10 | Accept |     0.25533 |      1.3969 |       0.244 |     0.24437 |   AdaBoostM2 |           33 |      0.99516 |            1 |
|   11 | Accept |     0.25733 |      1.5294 |       0.244 |      0.2442 |          Bag |           25 |            - |            8 |
|   12 | Accept |     0.74267 |      16.444 |       0.244 |     0.24995 |          Bag |          488 |            - |         1494 |
|   13 | Accept |     0.28567 |      7.9382 |       0.244 |     0.24624 |     RUSBoost |          158 |    0.0010063 |            1 |
|   14 | Accept |       0.257 |      23.416 |       0.244 |     0.24559 |          Bag |          491 |            - |           31 |
|   15 | Accept |     0.28433 |     0.71501 |       0.244 |     0.24557 |     RUSBoost |           12 |      0.48085 |            6 |
|   16 | Accept |       0.267 |       17.82 |       0.244 |      0.2456 |   AdaBoostM2 |          484 |    0.0028818 |           43 |
|   17 | Accept |     0.24667 |      33.219 |       0.244 |     0.24601 |          Bag |          488 |            - |            3 |
|   18 | Best   |       0.244 |      34.953 |       0.244 |      0.2454 |          Bag |          498 |            - |            3 |
|   19 | Accept |     0.24467 |      31.568 |       0.244 |     0.24489 |          Bag |          473 |            - |            3 |
|   20 | Accept |       0.259 |      19.187 |       0.244 |     0.24488 |   AdaBoostM2 |          497 |      0.67001 |           19 |
|===================================================================================================================================|
| Iter | Eval   | Objective   | Objective   | BestSoFar   | BestSoFar   |       Method | NumLearningC-|    LearnRate |  MinLeafSize |
|      | result |             | runtime     | (observed)  | (estim.)    |              | ycles        |              |              |
|===================================================================================================================================|
|   21 | Accept |     0.27733 |      19.735 |       0.244 |     0.24468 |     RUSBoost |          386 |      0.91461 |            2 |
|   22 | Accept |       0.245 |      32.172 |       0.244 |      0.2441 |          Bag |          482 |            - |            4 |
|   23 | Accept |       0.244 |      33.117 |       0.244 |     0.24388 |          Bag |          497 |            - |            4 |
|   24 | Accept |       0.245 |       34.32 |       0.244 |     0.24406 |          Bag |          497 |            - |            4 |
|   25 | Best   |       0.243 |      33.134 |       0.243 |     0.24394 |          Bag |          499 |            - |            5 |
|   26 | Accept |     0.25733 |     0.55541 |       0.243 |     0.24371 |   AdaBoostM2 |           12 |      0.87848 |           53 |
|   27 | Accept |       0.263 |     0.52438 |       0.243 |     0.24371 |   AdaBoostM2 |           11 |       0.6978 |            2 |
|   28 | Accept |     0.24367 |      31.167 |       0.243 |     0.24344 |          Bag |          484 |            - |            5 |
|   29 | Accept |       0.292 |      19.748 |       0.243 |     0.24342 |   AdaBoostM2 |          497 |    0.0010201 |            1 |
|   30 | Accept |       0.292 |      0.7854 |       0.243 |     0.24342 |     RUSBoost |           13 |    0.0012334 |            3 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 488.5833 seconds
Total objective function evaluation time: 464.2275

Best observed feasible point:
    Method    NumLearningCycles    LearnRate    MinLeafSize
    ______    _________________    _________    ___________

     Bag             499              NaN            5     

Observed objective function value = 0.243
Estimated objective function value = 0.24342
Function evaluation time = 33.1343

Best estimated feasible point (according to models):
    Method    NumLearningCycles    LearnRate    MinLeafSize
    ______    _________________    _________    ___________

     Bag             499              NaN            5     

Estimated objective function value = 0.24342
Estimated function evaluation time = 32.1002
ensMdl = 
  ClassificationBaggedEnsemble
                         ResponseName: 'Y'
                CategoricalPredictors: []
                           ClassNames: {'AAA'  'AA'  'A'  'BBB'  'BB'  'B'  'CCC'}
                       ScoreTransform: 'none'
                      NumObservations: 3000
    HyperparameterOptimizationResults: [1×1 BayesianOptimization]
                           NumTrained: 499
                               Method: 'Bag'
                         LearnerNames: {'Tree'}
                 ReasonForTermination: 'Terminated normally after completing the requested number of training cycles.'
                              FitInfo: []
                   FitInfoDescription: 'None'
                            FResample: 1
                              Replace: 1
                     UseObsForLearner: [3000×499 logical]


  Properties, Methods

fitcensemble возвращает ClassificationBaggedEnsemble потому что функция находит алгоритм случайного леса ('Bag') как оптимальный метод.

Создание модели Simulink

В этом примере представлена модель Simulink slexCreditRatingClassificationEnsemblePredictExample.slx, который включает в себя блок Предсказания Ансамбля. Можно открыть модель Simulink или создать новую модель, как описано в этом разделе.

Открытие модели Simulink slexCreditRatingClassificationEnsemblePredictExample.slx.

SimMdlName = 'slexCreditRatingClassificationEnsemblePredictExample'; 
open_system(SimMdlName)

PreLoadFcn функция обратного вызова slexCreditRatingClassificationEnsemblePredictExample включает код для загрузки данных выборки, обучения модели с использованием оптимальных гиперпараметров и создания входного сигнала для модели Simulink. При открытии модели Simulink программа запускает код в PreLoadFcn перед загрузкой модели Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Настройка (Setup) на вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings) и выберите Свойства модели (Model Properties). Затем на вкладке Callbacks выберите PreLoadFcn функция обратного вызова на панели Обратные вызовы модели.

Чтобы создать новую модель Simulink, откройте шаблон «Пустая модель» и добавьте блок «Прогнозирование ансамбля». Добавьте блоки Inport и Outport и подключите их к блоку IntegrationEnsemble Predict.

Для открытия диалогового окна «Параметры блока» дважды щелкните на блоке «Прогнозирование». Укажите параметр Выбрать обучаемую модель машинного обучения (Select trained machine learning model) как ensMdl, которое является именем переменной рабочей области, содержащей обучаемую модель. "Нажмите кнопку ""Обновить""". В диалоговом окне отображаются опции, используемые для обучения модели. ensMdl в разделе Обучаемая модель машинного обучения. Установите флажок Добавить выходной порт для прогнозируемых оценок класса, чтобы добавить второй балл выходного порта.

Блок предсказания Ensemble ожидает наблюдения, содержащего 17 предикторных значений. Дважды щелкните блок «Inport» и установите для параметра «Port dimensions» значение 17 на вкладке «Signal Attributes».

Создайте входной сигнал в виде массива структуры для модели Simulink. Структурный массив должен содержать следующие поля:

  • time - моменты времени, в которые наблюдения входят в модель. В этом примере длительность включает целые числа от 0 до 931. Ориентация должна соответствовать наблюдениям в данных предиктора. Итак, в данном случае, time должен быть вектором столбца.

  • signals - Структурный массив 1 к 1, описывающий входные данные и содержащий поля values и dimensions, где values является матрицей данных предиктора, и dimensions - количество переменных предиктора.

Создайте соответствующий структурный массив для будущих образцов.

creditRatingInput.time = (0:931)';
creditRatingInput.signals(1).values = ftrX;
creditRatingInput.signals(1).dimensions = size(ftrX,2);

Чтобы импортировать данные сигнала из рабочей области:

  • Откройте диалоговое окно «Параметры конфигурации». На вкладке Моделирование (Modeling) щелкните Параметры модели (Model Settings).

  • На панели Импорт/экспорт данных установите флажок Ввод и введите creditRatingInput в соседнем текстовом поле.

  • На панели Решатель (Solver) в разделе Время моделирования (Simulation time) задайте для параметра Время остановки (Stop time) значение creditRatingInput.time(end). В разделе Выбор решателя (Solver selection) задайте для параметра Тип (Type) значение Fixed-stepи установите для решателя значение discrete (no continuous states).

Дополнительные сведения см. в разделе Загрузка данных сигналов для моделирования (Simulink).

Моделирование модели.

sim(SimMdlName);

Когда блок Inport обнаруживает наблюдение, он направляет это наблюдение в блок прогнозирования Ensemble. Инспектор данных моделирования (Simulation Data Inspector, Simulink) можно использовать для просмотра зарегистрированных данных блоков исходящего порта.

См. также

Связанные темы