В этом примере показано, как обучить Обобщенную аддитивную модель (GAM) Бинарной Классификации оптимальными параметрами и как оценить прогнозирующую эффективность обученной модели. Пример сначала находит оптимальные значения параметров для одномерного GAM (параметры для линейных членов) и затем находит значения для двумерного GAM (параметры в течение многих периодов взаимодействия). Кроме того, пример объясняет, как интерпретировать обученную модель путем исследования локальных эффектов терминов на определенном предсказании и путем вычисления частичной зависимости предсказаний на предикторах.
Загрузите 1 994 данных о переписи, хранимых в census1994.mat
. Набор данных состоит из демографических данных Бюро переписи США, чтобы предсказать, передает ли индивидуум 50 000$ в год. Задача классификации состоит в том, чтобы подобрать модель, которая предсказывает категорию зарплаты людей, учитывая их возраст, рабочий класс, образовательный уровень, семейное положение, гонку, и так далее.
load census1994
census1994
содержит обучающий набор данных adultdata
и тестовые данные устанавливают adulttest
. Уменьшать время выполнения для этого примера, поддемонстрационных 500 учебных наблюдений и 500 тестовых наблюдений при помощи datasample
функция.
rng(1) % For reproducibility NumSamples = 5e2; adultdata = datasample(adultdata,NumSamples,'Replace',false); adulttest = datasample(adulttest,NumSamples,'Replace',false);
Обучите GAM гиперпараметрами, которые минимизируют потерю перекрестной проверки при помощи аргумента значения имени OptimizeHyperparameters.
Можно задать OptimizeHyperparameters
как 'auto'
или 'all'
найти оптимальные гиперзначения параметров и для одномерных и для двумерных параметров. В качестве альтернативы можно найти оптимальные значения для одномерных параметров с помощью 'auto-univariate'
или 'all-univariate'
опция, и затем находит оптимальные значения для двумерных параметров с помощью 'auto-bivariate'
или 'all-bivariate'
опция. Этот пример использует 'auto-univariate'
и 'auto-bivariate'
.
Обучите одномерный GAM. Задайте OptimizeHyperparameters
как 'auto-univariate'
так, чтобы fitcgam
находит оптимальные значения InitialLearnRateForPredictors
и NumTreesPerPredictor
аргументы name-value. Для воспроизводимости используйте 'expected-improvement-plus'
функция захвата. Задайте ShowPlots
как false
и Verbose
как 0, чтобы отключить график и индикаторы сообщения, соответственно.
Mdl_univariate = fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'OptimizeHyperparameters','auto-univariate', ... 'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName','expected-improvement-plus', ... 'ShowPlots',false,'Verbose',0))
Mdl_univariate = 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.3118 NumObservations: 500 HyperparameterOptimizationResults: [1×1 BayesianOptimization] Properties, Methods
fitcgam
возвращает ClassificationGAM
объект модели, который использует лучшую предполагаемую допустимую точку. Лучшая предполагаемая допустимая точка указывает на набор гиперпараметров, который минимизирует верхнюю доверительную границу значения целевой функции на основе базовой модели целевой функции Байесового процесса оптимизации. Можно получить лучшую точку из HyperparameterOptimizationResults
свойство или при помощи bestPoint
функция.
x = Mdl_univariate.HyperparameterOptimizationResults.XAtMinEstimatedObjective
x=1×2 table
InitialLearnRateForPredictors NumTreesPerPredictor
_____________________________ ____________________
0.02257 118
bestPoint(Mdl_univariate.HyperparameterOptimizationResults)
ans=1×2 table
InitialLearnRateForPredictors NumTreesPerPredictor
_____________________________ ____________________
0.02257 118
Для получения дополнительной информации о процессе оптимизации смотрите, Оптимизируют GAM Используя OptimizeHyperparameters.
Обучите двумерный GAM. Задайте OptimizeHyperparameters
как 'auto-bivariate'
так, чтобы fitcgam
находит оптимальные значения Interactions
, InitialLearnRateForInteractions
, и NumTreesPerInteraction
аргументы name-value. Используйте одномерные значения параметров в x
так, чтобы программное обеспечение нашло оптимальные значения параметров в течение многих периодов взаимодействия на основе x значений.
Mdl = fitcgam(adultdata,'salary','Weights','fnlwgt', ... 'InitialLearnRateForPredictors',x.InitialLearnRateForPredictors, ... 'NumTreesPerPredictor',x.NumTreesPerPredictor, ... 'OptimizeHyperparameters','auto-bivariate', ... 'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName','expected-improvement-plus', ... 'ShowPlots',false,'Verbose',0))
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.4587 Interactions: [6×2 double] NumObservations: 500 HyperparameterOptimizationResults: [1×1 BayesianOptimization] Properties, Methods
Отобразите оптимальные двумерные гиперпараметры.
Mdl.HyperparameterOptimizationResults.XAtMinEstimatedObjective
ans=1×3 table
Interactions InitialLearnRateForInteractions NumTreesPerInteraction
____________ _______________________________ ______________________
6 0.0061954 422
Отображение модели Mdl
показывает частичный список свойств модели. Чтобы просмотреть полный список свойств модели, дважды кликните имя переменной Mdl
в Рабочей области. Редактор Переменных открывается для Mdl
. В качестве альтернативы можно отобразить свойства в Командном окне при помощи записи через точку. Например, отобразите ReasonForTermination
свойство.
Mdl.ReasonForTermination
ans = struct with fields:
PredictorTrees: 'Terminated after training the requested number of trees.'
InteractionTrees: 'Terminated after training the requested number of trees.'
Можно использовать ReasonForTermination
свойство определить, содержит ли обученная модель конкретное количество деревьев для каждого линейного члена и каждый период взаимодействия.
Отобразите периоды взаимодействия в Mdl
.
Mdl.Interactions
ans = 6×2
5 12
1 6
6 12
1 12
7 9
2 6
Каждая строка Interactions
представляет один период взаимодействия и содержит индексы столбца переменных предикторов в течение периода взаимодействия. Можно использовать Interactions
свойство проверять периоды взаимодействия в модель и порядок, в который fitcgam
добавляет их в модель.
Отобразите периоды взаимодействия в Mdl
использование имен предиктора.
Mdl.PredictorNames(Mdl.Interactions)
ans = 6×2 cell
{'marital_status'} {'hours_per_week'}
{'age' } {'occupation' }
{'occupation' } {'hours_per_week'}
{'age' } {'hours_per_week'}
{'relationship' } {'sex' }
{'workClass' } {'occupation' }
Оцените эффективность обученной модели при помощи тестовой выборки adulttest
и объект функционирует predict
, loss
, edge
, и margin
. Можно использовать полную или компактную модель с этими функциями.
Если вы хотите оценить эффективность обучающего набора данных, используйте функции объекта перезамены: resubPredict
, resubLoss
, resubMargin
, и resubEdge
. Чтобы использовать эти функции, необходимо использовать полную модель, которая содержит обучающие данные.
Создайте компактную модель, чтобы уменьшать размер обученной модели.
CMdl = compact(Mdl); whos('Mdl','CMdl')
Name Size Bytes Class Attributes CMdl 1x1 5126918 classreg.learning.classif.CompactClassificationGAM Mdl 1x1 5272831 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);
Сравните результаты, полученные включением и линейные члены и периоды взаимодействия к результатам, полученным включением только линейных членов.
Создайте график беспорядка от истины, маркирует 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.1748 0.17872
Edge 0.57902 0.54756
Модель достигает меньшего значения потерь и более высокого значения ребра, когда и линейные члены и периоды взаимодействия включены.
Отобразите распределения полей с помощью диаграмм.
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,score] = predict(CMdl,adulttest(1,:))
label = categorical
<=50K
score = 1×2
0.9895 0.0105
f1 = figure;
plotLocalEffects(CMdl,adulttest(1,:))
f1.CurrentAxes.TickLabelInterpreter = 'none';
predict
функция классифицирует первое наблюдение adulttest(1,:)
как '<=50K'
. plotLocalEffects
функция создает горизонтальный столбчатый график, который показывает локальные эффекты 10 самых важных терминов на предсказании. Каждое локальное значение эффекта показывает вклад каждого термина к классификационной оценке для '<=50K'
, который является логитом апостериорной вероятности, что классификацией является '<=50K'
для наблюдения.
Создайте частичный график зависимости для термина age
. Задайте и обучение и наборы тестовых данных, чтобы вычислить частичные значения зависимости с помощью обоих наборов.
figure
plotPartialDependence(CMdl,'age',label,[adultdata; adulttest])
Построенная линия представляет усредненные частичные отношения между предиктором age
и счет класса <=50K
в обученной модели. x
- ось незначительные метки деления представляет уникальные значения в предикторе age
.
Создайте частичные графики зависимости для терминов education_num
и relationship
.
f2 = figure; plotPartialDependence(CMdl,["education_num","relationship"],label,[adultdata; adulttest]) f2.CurrentAxes.TickLabelInterpreter = 'none'; view([55 40])
График показывает частичную зависимость значения баллов для класса <=50
на education_num
и relationship
.
fitcgam
| ClassificationGAM
| CompactClassificationGAM
| plotLocalEffects
| plotPartialDependence
| bayesopt
| optimizableVariable