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

В этом примере показано, как обучить модель ансамбля с оптимальными гиперпараметрами, а затем использовать блок ClassificationEnsemble Predict для предсказания меток в 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 является категориальной переменной для отраслевой метки. Когда вы обучаете модель для блока ClassificationEnsemble Predict, необходимо предварительно обработать категориальные предикторы при помощи 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' обучить ансамбль с оптимальными гиперпараметрами. The 'auto' опция находит оптимальные значения для 'Method', 'NumLearningCycles', и 'LearnRate' (для применимых методов) fitcensemble и 'MinLeafSize' учащихся дерева.

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

  • Задайте порядок классов при помощи 'ClassNames' аргумент имя-значение. Значения выхода из счета порта блока ClassificationEnsemble Predict имеют одинаковый порядок.

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, который включает блок ClassificationEnsemble Predict. Можно открыть модель Simulink или создать новую модель, как описано в этом разделе.

Откройте модель Simulink slexCreditRatingClassificationEnsemblePredictExample.slx.

SimMdlName = 'slexCreditRatingClassificationEnsemblePredictExample'; 
open_system(SimMdlName)

The PreLoadFcn функция обратного вызова от slexCreditRatingClassificationEnsemblePredictExample включает код для загрузки выборочных данных, обучения модели с помощью оптимальных гиперпараметров и создания входного сигнала для модели Simulink. Если вы открываете модель Simulink, то программное обеспечение запускает код в PreLoadFcn перед загрузкой модели Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Setup на вкладке Modeling, нажмите Model Settings и выберите Model Properties. Затем на вкладке Callbacks выберите PreLoadFcn функция обратного вызова на панели обратных коллбэков Model.

Чтобы создать новую модель Simulink, откройте шаблон Blank Model и добавьте блок ClassificationEnsemble Predict. Добавьте блоки Inport и Outport и соедините их с блоком ClassificationEnsemble Predict.

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

Блок ClassificationEnsemble Predict ожидает наблюдения, содержащего 17 значений предиктора. Дважды кликните блок Inport и установите размерности порта равным 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 в соседнем текстовом поле.

  • На панели « Решатели» в разделе «Время симуляции» установите значение «Время остановки» creditRatingInput.time(end). В группе «Выбор решателя» установите для параметра «Тип» значение Fixed-step, и установите решатель на discrete (no continuous states).

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

Симулируйте модель.

sim(SimMdlName);

Когда блок Inport обнаруживает наблюдение, он направляет наблюдение в блок ClassificationEnsemble Predict. Можно использовать Данные моделирования Inspector (Simulink), чтобы просмотреть записанные данные блоков Outport.

См. также

Похожие темы