Обучите обобщенную аддитивную модель бинарной классификации

В этом примере показано, как обучить Обобщенную аддитивную модель (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 оптимальными гиперпараметрами

Обучите 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. Можно использовать полную или компактную модель с этими функциями.

  • predict — Классифицируйте наблюдения

  • loss — Вычислите потерю классификации (misclassification уровень в десятичном числе, по умолчанию)

  • margin — Вычислите поля классификации

  • edge — Вычислите ребро классификации (среднее значение полей классификации)

Если вы хотите оценить эффективность обучающего набора данных, используйте функции объекта перезамены: 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.

Смотрите также

| | | | | |

Похожие темы