В этом примере показано, как обучить модель ансамбля оптимальными гиперпараметрами, и затем использовать блок 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
массив ячеек из символьных векторов, который содержит соответствующие кредитные рейтинги.
Предположим, что вы получаете данные в последовательности, и у вас есть первые 3 000 наблюдений, но вы еще не получили последние 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'
из древовидных учеников.
Для воспроизводимости установите случайный 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)
PreLoadFcn
функция обратного вызова slexCreditRatingClassificationEnsemblePredictExample
включает код, чтобы загрузить выборочные данные, обучить модель с помощью оптимальных гиперпараметров и создать входной сигнал для модели Simulink. Если вы открываете модель Simulink, то программное обеспечение запускает код в PreLoadFcn
прежде, чем загрузить модель Simulink. Чтобы просмотреть функцию обратного вызова, в разделе Setup по вкладке Modeling, нажимают Model Settings и выбирают Model Properties. Затем на вкладке Callbacks выберите PreLoadFcn
функция обратного вызова в панели коллбэков Модели.
Чтобы создать новую модель Simulink, откройте шаблон Blank Model и добавьте блок ClassificationEnsemble Predict. Добавьте блоки Inport и Outport и соедините их с блоком ClassificationEnsemble Predict.
Дважды кликните блок ClassificationEnsemble Predict, чтобы открыть диалоговое окно Block Parameters. Укажите, что Выбор обучил параметр модели машинного обучения как ensMdl
, который является именем переменной рабочей области, которая содержит обученную модель. Нажмите Кнопку Обновить. Диалоговое окно отображается, опции раньше обучали модель ensMdl
в соответствии с Обученной Моделью Машинного обучения. Выберите выходной порт Add для предсказанного флажка баллов класса, чтобы добавить второй счет выходного порта.
Блок 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);
Импортировать данные сигнала из рабочей области:
Откройте диалоговое окно Configuration Parameters. На вкладке Modeling нажмите Model Settings.
В панели Импорта/Экспорта Данных установите флажок Input и введите creditRatingInput
в смежном текстовом поле.
В панели Решателя, под Временем симуляции, Временем остановки набора к creditRatingInput.time(end)
. При выборе Решателя, Типе набора к Fixed-step
, и Решатель набора к discrete (no continuous states)
.
Для получения дополнительной информации смотрите Данные сигнала Загрузки для Симуляции (Simulink).
Симулируйте модель.
sim(SimMdlName);
Когда блок Inport обнаруживает наблюдение, он направляет наблюдение в блок ClassificationEnsemble Predict. Можно использовать Инспектора Данных моделирования (Simulink), чтобы просмотреть записанные данные блоков Выходного порта.
ClassificationEnsemble Predict