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