Main Content

バイナリ分類用の一般化加法モデルの学習

この例では、最適なパラメーターでバイナリ分類用の一般化加法モデル (GAM)に学習させる方法と、学習済みモデルの予測性能を評価する方法を示します。この例では、最初に一変量の GAM に最適なパラメーター値 (線形項のパラメーター) を特定し、次に二変量の GAM の値 (交互作用項のパラメーター) を特定します。また、この例では、特定の予測に対する項の局所的効果を調べて、予測子に対する予測の部分依存を計算することで、学習済みモデルを解釈する方法についても説明します。

標本データの読み込み

census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータセットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。この分類タスクでは、年齢、労働階級、教育レベル、婚姻区分、人種などが与えられた人の給与カテゴリを予測するモデルを近似します。

load census1994

census1994 には学習データセット adultdata および検定データセット adulttest が含まれています。この例では、実行時間を短縮するために、関数datasampleを使用して 500 の学習観測値と 500 の検定観測値をサブサンプリングします。

rng(1) % For reproducibility
NumSamples = 5e2;
adultdata = datasample(adultdata,NumSamples,'Replace',false);
adulttest = datasample(adulttest,NumSamples,'Replace',false);

最適なハイパーパラメーターでの GAM の学習

名前と値の引数 OptimizeHyperparameters を使用して、交差検証損失を最小化するハイパーパラメーターで GAM に学習させます。

OptimizeHyperparameters'auto' または 'all' として指定し、一変量パラメーターおよび二変量パラメーター両方に最適なハイパーパラメーター値を計算できます。あるいは、'auto-univariate' または 'all-univariate' オプションを使用して一変量パラメーターに最適な値を求めてから、'auto-bivariate' または 'all-bivariate' オプションを使用して二変量パラメーターに最適な値を求めることもできます。この例では、'auto-univariate' および 'auto-bivariate' を使用します。

一変量の GAM に学習させます。名前と値の引数 InitialLearnRateForPredictors および NumTreesPerPredictor の最適な値を fitcgam で求めるため、OptimizeHyperparameters として 'auto-univariate' を指定します。再現性を得るために、'expected-improvement-plus' の獲得関数を使用します。ShowPlotsfalse として、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         

最適化プロセスの詳細については、OptimizeHyperparameters を使用した GAM の最適化を参照してください。

二変量の GAM に学習させます。名前と値の引数 InteractionsInitialLearnRateForInteractions および NumTreesPerInteraction の最適な値を fitcgam で求めるため、OptimizeHyperparameters として 'auto-bivariate' を指定します。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 の各行は 1 つの交互作用項を表し、交互作用項の予測子変数の列インデックスを格納します。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 とオブジェクト関数 predictlossedge および margin を使用して、学習済みモデルの性能を評価します。これらの関数をもつ完全またはコンパクトなモデルを使用できます。

  • predict— 観測値の分類

  • loss— 分類損失の計算 (既定では 10 進数の誤分類率)

  • margin— 分類マージンの計算

  • edge— 分類エッジ (分類マージンの平均) の計算

学習データ セットの性能を評価するには、再代入オブジェクト関数resubPredictresubLossresubMarginおよび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 に部分従属していることが示されています。

参考

| | | | | |

関連するトピック