バイナリ分類用の一般化加法モデルの学習
この例では、最適なパラメーターでバイナリ分類用の一般化加法モデル (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'
の獲得関数を使用します。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
最適化プロセスの詳細については、OptimizeHyperparameters を使用した GAM の最適化を参照してください。
二変量の GAM に学習させます。名前と値の引数 Interactions
、InitialLearnRateForInteractions
および 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
とオブジェクト関数 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