Этот пример показывает, как обучить обобщенную аддитивную модель (GAM) с оптимальными параметрами и как оценить прогнозирующую эффективность обученной модели. Пример сначала находит оптимальные значения параметров для одномерного GAM (параметры для линейных членов), а затем находит значения для двухмерного GAM (параметры для членов взаимодействия). Кроме того, пример объясняет, как интерпретировать обученную модель, исследуя локальные эффекты членов на конкретном предсказании и вычисляя частичную зависимость предсказаний от предикторов.
Загрузка данных переписи 1994 года, хранящихся в census1994.mat. Набор данных состоит из демографических данных Бюро переписи населения США, чтобы предсказать, составляет ли индивидуум более 50 000 долларов в год. Задача классификации состоит в том, чтобы соответствовать модели, которая предсказывает категорию заработной платы людей с учетом их возраста, рабочего класса, уровня образования, семейного положения, расы и так далее.
load census1994census1994 содержит обучающий набор обучающих данных adultdata и набор тестовых данных adulttest. Чтобы уменьшить время работы для этого примера, выделите 500 обучающих наблюдений и 500 тестовых наблюдений при помощи datasample функция.
rng('default') NumSamples = 5e2; adultdata = datasample(adultdata,NumSamples,'Replace',false); adulttest = datasample(adulttest,NumSamples,'Replace',false);
Оптимизируйте параметры для одномерной GAM относительно перекрестной валидации с помощью bayesopt функция.
Подготовка optimizableVariable объекты для аргументов имя-значение одномерного GAM: MaxNumSplitsPerPredictor, NumTreesPerPredictor, и InitialLearnRateForPredictors.
maxNumSplitsPerPredictor = optimizableVariable('maxNumSplitsPerPredictor',[1,10],'Type','integer'); numTreesPerPredictor = optimizableVariable('numTreesPerPredictor',[1,500],'Type','integer'); initialLearnRateForPredictors = optimizableVariable('initialLearnRateForPredictors',[1e-3,1],'Type','real');
Создайте целевую функцию, которая принимает вход z = [maxNumSplitsPerPredictor,numTreesPerPredictor,initialLearnRateForPredictors] и возвращает перекрестно проверенное значение потерь в параметрах в z.
minfun1 = @(z)kfoldLoss(fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'CrossVal','on', ... 'InitialLearnRateForPredictors',z.initialLearnRateForPredictors, ... 'MaxNumSplitsPerPredictor',z.maxNumSplitsPerPredictor, ... 'NumTreesPerPredictor',z.numTreesPerPredictor));
Если вы задаете опцию перекрестной проверки 'CrossVal','on', затем fitcgam функция возвращает перекрестно проверенный объект модели ClassificationPartitionedGAM. The kfoldLoss функция возвращает классификационные потери, полученные перекрестной проверенной моделью. Поэтому указатель на функцию minfun вычисляет потери перекрестной валидации у параметров в z.
Поиск оптимальных параметров с помощью bayesopt. Для повторяемости выберите 'expected-improvement-plus' функция сбора. Функция сбора по умолчанию зависит от времени выполнения и, следовательно, может давать различные результаты.
results1 = bayesopt(minfun1, ... [initialLearnRateForPredictors,maxNumSplitsPerPredictor,numTreesPerPredictor], ... 'IsObjectiveDeterministic',true, ... 'AcquisitionFunctionName','expected-improvement-plus');
|====================================================================================================================| | Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | initialLearn-| maxNumSplits-| numTreesPerP-| | | result | | runtime | (observed) | (estim.) | RateForPredi | PerPredictor | redictor | |====================================================================================================================| | 1 | Best | 0.18549 | 5.6957 | 0.18549 | 0.18549 | 0.73503 | 7 | 99 | | 2 | Accept | 0.19145 | 20.383 | 0.18549 | 0.18549 | 0.72917 | 10 | 399 | | 3 | Best | 0.17703 | 13.412 | 0.17703 | 0.17703 | 0.079299 | 8 | 267 | | 4 | Best | 0.14955 | 0.402 | 0.14955 | 0.14955 | 0.24236 | 4 | 3 | | 5 | Accept | 0.15999 | 12.363 | 0.14955 | 0.14955 | 0.25509 | 1 | 377 | | 6 | Accept | 0.15158 | 1.5035 | 0.14955 | 0.14955 | 0.23051 | 7 | 29 | | 7 | Accept | 0.16181 | 0.18204 | 0.14955 | 0.14955 | 0.34396 | 4 | 1 | | 8 | Accept | 0.15079 | 0.38418 | 0.14955 | 0.14955 | 0.26669 | 10 | 5 | | 9 | Accept | 0.16102 | 0.55525 | 0.14955 | 0.14955 | 0.26065 | 2 | 10 | | 10 | Accept | 0.19259 | 8.6487 | 0.14955 | 0.14955 | 0.24894 | 10 | 182 | | 11 | Accept | 0.18628 | 0.20681 | 0.14955 | 0.14955 | 0.13389 | 6 | 2 | | 12 | Accept | 0.15653 | 0.24643 | 0.14955 | 0.14955 | 0.24172 | 10 | 2 | | 13 | Best | 0.14699 | 0.82743 | 0.14699 | 0.14699 | 0.26745 | 7 | 12 | | 14 | Best | 0.14634 | 0.47528 | 0.14634 | 0.14634 | 0.25025 | 6 | 6 | | 15 | Best | 0.14312 | 0.34493 | 0.14312 | 0.14312 | 0.30452 | 9 | 3 | | 16 | Accept | 0.14334 | 0.51583 | 0.14312 | 0.14312 | 0.33507 | 10 | 7 | | 17 | Best | 0.13791 | 0.32248 | 0.13791 | 0.13791 | 0.33179 | 9 | 4 | | 18 | Accept | 0.14875 | 0.3551 | 0.13791 | 0.13791 | 0.36806 | 8 | 5 | | 19 | Accept | 0.1651 | 1.3731 | 0.13791 | 0.13791 | 0.32691 | 8 | 27 | | 20 | Accept | 0.15895 | 0.37324 | 0.13791 | 0.13791 | 0.32985 | 7 | 5 | |====================================================================================================================| | Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | initialLearn-| maxNumSplits-| numTreesPerP-| | | result | | runtime | (observed) | (estim.) | RateForPredi | PerPredictor | redictor | |====================================================================================================================| | 21 | Accept | 0.13946 | 0.26793 | 0.13791 | 0.13791 | 0.36721 | 9 | 3 | | 22 | Accept | 0.16719 | 1.1276 | 0.13791 | 0.13791 | 0.25385 | 5 | 23 | | 23 | Accept | 0.17017 | 1.35 | 0.13791 | 0.13791 | 0.23809 | 9 | 26 | | 24 | Accept | 0.15519 | 0.46246 | 0.13791 | 0.13791 | 0.34831 | 9 | 7 | | 25 | Accept | 0.15312 | 0.26445 | 0.13791 | 0.13791 | 0.33416 | 10 | 3 | | 26 | Accept | 0.15852 | 0.31045 | 0.13791 | 0.13791 | 0.6142 | 9 | 4 | | 27 | Accept | 0.16691 | 0.50559 | 0.13791 | 0.13791 | 0.31446 | 5 | 7 | | 28 | Accept | 0.14384 | 0.35136 | 0.13791 | 0.13791 | 0.40215 | 9 | 4 | | 29 | Accept | 0.14773 | 0.33296 | 0.13791 | 0.13791 | 0.34255 | 9 | 4 | | 30 | Accept | 0.17604 | 0.85847 | 0.13791 | 0.13791 | 0.36565 | 6 | 15 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 97.6656 seconds
Total objective function evaluation time: 74.4022
Best observed feasible point:
initialLearnRateForPredictors maxNumSplitsPerPredictor numTreesPerPredictor
_____________________________ ________________________ ____________________
0.33179 9 4
Observed objective function value = 0.13791
Estimated objective function value = 0.13791
Function evaluation time = 0.32248
Best estimated feasible point (according to models):
initialLearnRateForPredictors maxNumSplitsPerPredictor numTreesPerPredictor
_____________________________ ________________________ ____________________
0.33179 9 4
Estimated objective function value = 0.13791
Estimated function evaluation time = 0.33084
Получите лучшую точку от results1.
zbest1 = bestPoint(results1)
zbest1=1×3 table
initialLearnRateForPredictors maxNumSplitsPerPredictor numTreesPerPredictor
_____________________________ ________________________ ____________________
0.33179 9 4
Обучите оптимизированную GAM с помощью zbest1 значения. Рекомендуемая практика состоит в том, чтобы задать имена классов.
Mdl1 = fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'ClassNames',categorical({'<=50K','>50K'}), ... 'InitialLearnRateForPredictors',zbest1.initialLearnRateForPredictors, ... 'MaxNumSplitsPerPredictor',zbest1.maxNumSplitsPerPredictor, ... 'NumTreesPerPredictor',zbest1.numTreesPerPredictor)
Mdl1 =
ClassificationGAM
PredictorNames: {'age' 'workClass' 'education' 'education_num' 'marital_status' 'occupation' 'relationship' 'race' 'sex' 'capital_gain' 'capital_loss' 'hours_per_week' 'native_country'}
ResponseName: 'salary'
CategoricalPredictors: [2 3 5 6 7 8 9 13]
ClassNames: [<=50K >50K]
ScoreTransform: 'logit'
Intercept: -1.7383
NumObservations: 500
Properties, Methods
Mdl1 является ClassificationGAM объект модели. Отображение модели показывает частичный список свойств модели. Чтобы просмотреть полный список свойств модели, дважды кликните имя переменной Mdl1 в Рабочей области. Откроется редактор Переменных для Mdl1. Также можно отобразить свойства в Командном окне с помощью записи через точку. Для примера отобразите ReasonForTermination свойство.
Mdl1.ReasonForTermination
ans = struct with fields:
PredictorTrees: 'Terminated after training the requested number of trees.'
InteractionTrees: ''
The PredictorTrees поле значения свойства указывает, что Mdl1 включает указанное количество деревьев. NumTreesPerPredictor от fitcgam задает максимальное количество деревьев на предиктор, и функция может остановиться перед обучением требуемого количества деревьев. Можно использовать ReasonForTermination свойство, чтобы определить, содержит ли обученная модель заданное количество деревьев.
Если вы задаете, чтобы включить условия взаимодействия, так что fitcgam обучает для них деревья, затем InteractionTrees поле содержит непустое значение.
Найдите параметры для условий взаимодействия двухмерной GAM при помощи bayesopt функция.
Подготовка optimizableVariable объекты для аргументов имя-значение для условий взаимодействия: InitialLearnRateForInteractions, MaxNumSplitsPerInteraction, NumTreesPerInteraction, и InitialLearnRateForInteractions.
initialLearnRateForInteractions = optimizableVariable('initialLearnRateForInteractions',[1e-3,1],'Type','real'); maxNumSplitsPerInteraction = optimizableVariable('maxNumSplitsPerInteraction',[1,10],'Type','integer'); numTreesPerInteraction = optimizableVariable('numTreesPerInteraction',[1,500],'Type','integer'); numInteractions = optimizableVariable('numInteractions',[1,28],'Type','integer');
Создайте целевую функцию для оптимизации. Используйте оптимальные значения параметров в zbest1 так, что программное обеспечение находит оптимальные значения параметров для членов взаимодействия на основе zbest1 значения.
minfun2 = @(z)kfoldLoss(fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'CrossVal','on', ... 'InitialLearnRateForPredictors',zbest1.initialLearnRateForPredictors, ... 'MaxNumSplitsPerPredictor',zbest1.maxNumSplitsPerPredictor, ... 'NumTreesPerPredictor',zbest1.numTreesPerPredictor, ... 'InitialLearnRateForInteractions',z.initialLearnRateForInteractions, ... 'MaxNumSplitsPerInteraction',z.maxNumSplitsPerInteraction, ... 'NumTreesPerInteraction',z.numTreesPerInteraction, ... 'Interactions',z.numInteractions));
Поиск оптимальных параметров с помощью bayesopt. Процесс оптимизации обучает несколько моделей и отображает предупреждающие сообщения, если модели не включают условия взаимодействия. Отключите все предупреждения перед вызовом bayesopt и восстановите состояние предупреждения после запуска bayesopt. Можно оставить состояние предупреждения без изменений для просмотра предупреждающих сообщений.
orig_state = warning('query'); warning('off') results2 = bayesopt(minfun2, ... [initialLearnRateForInteractions,maxNumSplitsPerInteraction,numTreesPerInteraction,numInteractions], ... 'IsObjectiveDeterministic',true, ... 'AcquisitionFunctionName','expected-improvement-plus');
|===================================================================================================================================| | Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | initialLearn-| maxNumSplits-| numTreesPerI-| numInteracti-| | | result | | runtime | (observed) | (estim.) | RateForInter | PerInteracti | nteraction | ons | |===================================================================================================================================| | 1 | Best | 0.19671 | 10.999 | 0.19671 | 0.19671 | 0.96444 | 8 | 109 | 22 | | 2 | Best | 0.189 | 30.57 | 0.189 | 0.189 | 0.98548 | 6 | 457 | 17 | | 3 | Best | 0.16538 | 18.643 | 0.16538 | 0.16538 | 0.28678 | 4 | 383 | 13 | | 4 | Best | 0.15243 | 0.4285 | 0.15243 | 0.15243 | 0.28044 | 1 | 45 | 3 | | 5 | Accept | 0.16065 | 0.69005 | 0.15243 | 0.15243 | 0.20151 | 7 | 60 | 1 | | 6 | Best | 0.14831 | 0.36629 | 0.14831 | 0.14831 | 0.032423 | 1 | 151 | 1 | | 7 | Accept | 0.14887 | 0.36443 | 0.14831 | 0.14831 | 0.021093 | 1 | 15 | 1 | | 8 | Accept | 0.15039 | 0.42139 | 0.14831 | 0.14831 | 0.012128 | 2 | 482 | 1 | | 9 | Best | 0.14787 | 0.42482 | 0.14787 | 0.14787 | 0.10119 | 1 | 121 | 6 | | 10 | Best | 0.13902 | 0.38822 | 0.13902 | 0.13902 | 0.1233 | 1 | 281 | 3 | | 11 | Accept | 0.14721 | 0.39532 | 0.13902 | 0.13902 | 0.065618 | 1 | 291 | 3 | | 12 | Accept | 0.14586 | 0.39205 | 0.13902 | 0.13902 | 0.18711 | 1 | 117 | 1 | | 13 | Accept | 0.15073 | 0.383 | 0.13902 | 0.13902 | 0.15072 | 1 | 15 | 3 | | 14 | Accept | 0.14966 | 0.42744 | 0.13902 | 0.13902 | 0.17155 | 1 | 497 | 4 | | 15 | Best | 0.13716 | 0.37599 | 0.13716 | 0.13716 | 0.12601 | 1 | 281 | 1 | | 16 | Accept | 0.15094 | 0.38197 | 0.13716 | 0.13716 | 0.13962 | 2 | 284 | 1 | | 17 | Accept | 0.13972 | 4.5994 | 0.13716 | 0.13716 | 0.0028545 | 5 | 481 | 2 | | 18 | Accept | 0.14788 | 31.639 | 0.13716 | 0.13716 | 0.0024433 | 6 | 489 | 15 | | 19 | Accept | 0.14565 | 1.276 | 0.13716 | 0.13716 | 0.013118 | 5 | 257 | 1 | | 20 | Accept | 0.16502 | 28.315 | 0.13716 | 0.13716 | 0.0063353 | 4 | 457 | 16 | |===================================================================================================================================| | Iter | Eval | Objective | Objective | BestSoFar | BestSoFar | initialLearn-| maxNumSplits-| numTreesPerI-| numInteracti-| | | result | | runtime | (observed) | (estim.) | RateForInter | PerInteracti | nteraction | ons | |===================================================================================================================================| | 21 | Accept | 0.15693 | 4.9653 | 0.13716 | 0.13716 | 0.016486 | 6 | 466 | 2 | | 22 | Accept | 0.16312 | 29.942 | 0.13716 | 0.13716 | 0.019904 | 5 | 488 | 15 | | 23 | Accept | 0.15719 | 4.7423 | 0.13716 | 0.13716 | 0.020155 | 4 | 456 | 3 | | 24 | Best | 0.129 | 6.4419 | 0.129 | 0.129 | 0.090858 | 5 | 478 | 3 | | 25 | Accept | 0.15118 | 6.6757 | 0.129 | 0.129 | 0.15943 | 5 | 494 | 3 | | 26 | Accept | 0.15343 | 2.2035 | 0.129 | 0.129 | 0.070349 | 5 | 489 | 1 | | 27 | Best | 0.12879 | 6.8017 | 0.12879 | 0.12879 | 0.091985 | 5 | 387 | 4 | | 28 | Accept | 0.19093 | 5.9262 | 0.12879 | 0.12879 | 0.067405 | 5 | 331 | 4 | | 29 | Accept | 0.16767 | 6.3779 | 0.12879 | 0.12879 | 0.31419 | 5 | 472 | 3 | | 30 | Accept | 0.17636 | 11.026 | 0.12879 | 0.12879 | 0.054697 | 5 | 383 | 7 |

__________________________________________________________
Optimization completed.
MaxObjectiveEvaluations of 30 reached.
Total function evaluations: 30
Total elapsed time: 239.1035 seconds
Total objective function evaluation time: 216.5833
Best observed feasible point:
initialLearnRateForInteractions maxNumSplitsPerInteraction numTreesPerInteraction numInteractions
_______________________________ __________________________ ______________________ _______________
0.091985 5 387 4
Observed objective function value = 0.12879
Estimated objective function value = 0.12879
Function evaluation time = 6.8017
Best estimated feasible point (according to models):
initialLearnRateForInteractions maxNumSplitsPerInteraction numTreesPerInteraction numInteractions
_______________________________ __________________________ ______________________ _______________
0.091985 5 387 4
Estimated objective function value = 0.12879
Estimated function evaluation time = 6.7245
warning(orig_state)
Получите лучшую точку от results2.
zbest2 = bestPoint(results2)
zbest2=1×4 table
initialLearnRateForInteractions maxNumSplitsPerInteraction numTreesPerInteraction numInteractions
_______________________________ __________________________ ______________________ _______________
0.091985 5 387 4
Обучите оптимизированную GAM с помощью zbest1 и zbest2 значения.
Mdl = fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'ClassNames',categorical({'<=50K','>50K'}), ... 'InitialLearnRateForPredictors',zbest1.initialLearnRateForPredictors, ... 'MaxNumSplitsPerPredictor',zbest1.maxNumSplitsPerPredictor, ... 'NumTreesPerPredictor',zbest1.numTreesPerPredictor, ... 'InitialLearnRateForInteractions',zbest2.initialLearnRateForInteractions, ... 'MaxNumSplitsPerInteraction',zbest2.maxNumSplitsPerInteraction, ... 'NumTreesPerInteraction',zbest2.numTreesPerInteraction, ... 'Interactions',zbest2.numInteractions)
Mdl =
ClassificationGAM
PredictorNames: {'age' 'workClass' 'education' 'education_num' 'marital_status' 'occupation' 'relationship' 'race' 'sex' 'capital_gain' 'capital_loss' 'hours_per_week' 'native_country'}
ResponseName: 'salary'
CategoricalPredictors: [2 3 5 6 7 8 9 13]
ClassNames: [<=50K >50K]
ScoreTransform: 'logit'
Intercept: -1.7755
Interactions: [4×2 double]
NumObservations: 500
Properties, Methods
Кроме того, можно добавить условия взаимодействия к одномерной GAM с помощью addInteractions функция.
Mdl2 = addInteractions(Mdl1,zbest2.numInteractions, ... 'InitialLearnRateForInteractions',zbest2.initialLearnRateForInteractions, ... 'MaxNumSplitsPerInteraction',zbest2.maxNumSplitsPerInteraction, ... 'NumTreesPerInteraction',zbest2.numTreesPerInteraction);
Второй входной параметр задает максимальное количество членов взаимодействия, и NumTreesPerInteraction аргумент name-value задает максимальное количество деревьев на срок взаимодействия. The addInteractions функция может включать меньше условий взаимодействия и остановку перед обучением требуемого количества деревьев. Можно использовать Interactions и ReasonForTermination свойства для проверки фактического количества членов взаимодействия и количества деревьев в обученной модели.
Отобразите условия взаимодействия в Mdl.
Mdl.Interactions
ans = 4×2
7 10
4 7
7 9
5 10
Каждая строка Interactions представляет один термин взаимодействия и содержит индексы столбцов переменных предиктора для термина взаимодействия. Можно использовать Interactions свойство для проверки членов в модели взаимодействия и порядка, в котором fitcgam добавляет их в модель.
Отобразите условия взаимодействия в Mdl использование имен предикторов.
Mdl.PredictorNames(Mdl.Interactions)
ans = 4×2 cell
{'relationship' } {'capital_gain'}
{'education_num' } {'relationship'}
{'relationship' } {'sex' }
{'marital_status'} {'capital_gain'}
Отобразите причину прекращения, чтобы определить, содержит ли модель заданное количество деревьев для каждого линейного термина и каждого термина взаимодействия.
Mdl.ReasonForTermination
ans = struct with fields:
PredictorTrees: 'Terminated after training the requested number of trees.'
InteractionTrees: 'Terminated after training the requested number of trees.'
Оцените эффективность обученной модели с помощью тестовой выборки adulttest и функции объекта predict, loss, edge, и margin. Можно использовать полную или компактную модель с этими функциями.
Если вы хотите оценить эффективность обучающих данных набора, используйте функции объекта реституции: resubPredict, resubLoss, resubMargin, и resubEdge. Чтобы использовать эти функции, вы должны использовать полную модель, которая содержит обучающие данные.
Создайте компактную модель, чтобы уменьшить размер обученной модели.
CMdl = compact(Mdl); whos('Mdl','CMdl')
Name Size Bytes Class Attributes CMdl 1x1 3272176 classreg.learning.classif.CompactClassificationGAM Mdl 1x1 3389515 ClassificationGAM
Спрогнозируйте метки и счета для тестовых данных набора (adulttest) и вычислите статистику модели (потеря, маржа и ребро) с помощью тестовых данных набора.
[labels,scores] = predict(CMdl,adulttest); L = loss(CMdl,adulttest,'Weights',adulttest.fnlwgt); M = margin(CMdl,adulttest); E = edge(CMdl,adulttest,'Weights',adulttest.fnlwgt);
Прогнозируйте метки и счета и вычисляйте статистику, не включая условия взаимодействия в обученную модель.
[labels_nointeraction,scores_nointeraction] = predict(CMdl,adulttest,'IncludeInteractions',false); L_nointeractions = loss(CMdl,adulttest,'Weights',adulttest.fnlwgt,'IncludeInteractions',false); M_nointeractions = margin(CMdl,adulttest,'IncludeInteractions',false); E_nointeractions = edge(CMdl,adulttest,'Weights',adulttest.fnlwgt,'IncludeInteractions',false);
Сравните результаты, полученные путем включения как линейных, так и условий взаимодействия с результатами, полученными путем включения только линейных терминов.
Составьте таблицу, содержащую наблюдаемые метки, предсказанные метки и счета. Отображение первых восьми строк таблицы.
t = table(adulttest.salary,labels,scores,labels_nointeraction,scores_nointeraction, ... 'VariableNames',{'True Labels','Predicted Labels','Scores' ... 'Predicted Labels without interactions','Scores without interactions'}); head(t)
ans=8×5 table
True Labels Predicted Labels Scores Predicted Labels without interactions Scores without interactions
___________ ________________ _____________________ _____________________________________ ___________________________
<=50K <=50K 0.97921 0.020787 <=50K 0.98005 0.019951
<=50K <=50K 1 8.258e-17 <=50K 0.9713 0.028696
<=50K <=50K 1 1.8297e-19 <=50K 0.99449 0.0055054
<=50K <=50K 0.87422 0.12578 <=50K 0.87729 0.12271
<=50K <=50K 1 3.5643e-07 <=50K 0.99882 0.0011769
<=50K <=50K 0.60371 0.39629 <=50K 0.77861 0.22139
<=50K >50K 0.49917 0.50083 >50K 0.46877 0.53123
>50K >50K 0.3109 0.6891 <=50K 0.53571 0.46429
Создайте график неточностей из истинных меток adulttest.salary и предсказанные метки.
tiledlayout(1,2); nexttile confusionchart(adulttest.salary,labels) title('Linear and Interaction Terms') nexttile confusionchart(adulttest.salary,labels_nointeraction) title('Linear Terms Only')

Отобразите вычисленные значения потерь и ребер.
table([L; E], [L_nointeractions; E_nointeractions], ... 'VariableNames',{'Linear and Interaction Terms','Only Linear Terms'}, ... 'RowNames',{'Loss','Edge'})
ans=2×2 table
Linear and Interaction Terms Only Linear Terms
____________________________ _________________
Loss 0.14868 0.13852
Edge 0.63926 0.58405
Модель достигает меньших потерь, когда включены только линейные условия, но достигает более высокого значения ребра, когда включены как линейные, так и условия взаимодействия.
Отображение распределений полей с помощью прямоугольных графиков.
figure boxplot([M M_nointeractions],'Labels',{'Linear and Interaction Terms','Linear Terms Only'}) title('Box Plots of Test Sample Margins')

Интерпретируйте предсказание для первого тестового наблюдения с помощью plotLocalEffects функция. Кроме того, создайте графики частичной зависимости для некоторых важных членов в модели с помощью plotPartialDependence функция.
Классифицируйте первое наблюдение тестовых данных и постройте график локальных эффектов терминов в CMdl на предсказании. Чтобы отобразить существующее подчеркивание в любом имени предиктора, измените TickLabelInterpreter значение осей для 'none'.
label = predict(CMdl,adulttest(1,:))
label = categorical
<=50K
f1 = figure;
plotLocalEffects(CMdl,adulttest(1,:))
f1.CurrentAxes.TickLabelInterpreter = 'none';
The predict функция классифицирует первые adulttest(1,:) наблюдения как '<=50K'. The plotLocalEffects функция создает горизонтальный столбчатый график, которая показывает локальные эффекты 10 наиболее важных членов на предсказание. Каждое значение локального эффекта показывает вклад каждого члена в классификационную оценку для '<=50K', который является логитом апостериорной вероятности того, что классификация '<=50K' для наблюдения.
Создайте график частичной зависимости для термина age. Задайте как обучающие, так и тестовые данные, чтобы вычислить значения частичной зависимости с помощью обоих наборов.
figure
plotPartialDependence(CMdl,'age',label,[adultdata; adulttest])
Построенная линия представляет усредненные частичные отношения между предиктором age и счет класса <=50K в обученной модели. The x-sis minor ticks представляют уникальные значения в предикторе age.
Создайте графики частичной зависимости для терминов education_num и relationship.
f2 = figure; plotPartialDependence(CMdl,["education_num","relationship"],label,[adultdata; adulttest]) f2.CurrentAxes.TickLabelInterpreter = 'none';

График показывает частичную зависимость от education_num, который имеет разный тренд в зависимости от relationship значение.
bayesopt | ClassificationGAM | CompactClassificationGAM | fitcgam | optimizableVariable | plotLocalEffects | plotPartialDependence