Main Content

fitPosterior

サポート ベクター マシン (SVM) 分類器の事後確率の当てはめ

説明

ScoreSVMModel = fitPosterior(SVMModel) は、2 クラス学習で使用するスコアから事後確率への最適な変換関数が格納された、学習済みのサポート ベクター マシン (SVM) 分類器 ScoreSVMModel を返します。詳細は、アルゴリズムを参照してください。

[ScoreSVMModel,ScoreTransform] = fitPosterior(SVMModel) は、スコアから事後確率への最適な変換関数のパラメーターをさらに返します。

[ScoreSVMModel,ScoreTransform] = fitPosterior(SVMModel,Name,Value) は、1 つ以上の名前と値のペアの引数によって指定された追加オプションを使用します。たとえば、分割数やホールドアウト標本比率を指定できます。

すべて折りたたむ

ionosphere データ セットを読み込みます。このデータ セットには、レーダー反射についての 34 個の予測子と、不良 ('b') または良好 ('g') という 351 個の二項反応が含まれています。

load ionosphere

サポート ベクター マシン (SVM) 分類器に学習させます。データを標準化し、'g' が陽性クラスであることを指定します。

SVMModel = fitcsvm(X,Y,'ClassNames',{'b','g'},'Standardize',true);

SVMModelClassificationSVM 分類器です。

スコアから事後確率への最適な変換関数パラメーターを近似します。

rng(1); % For reproducibility
ScoreSVMModel = fitPosterior(SVMModel)
ScoreSVMModel = 
  ClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'b'  'g'}
           ScoreTransform: '@(S)sigmoid(S,-9.482430e-01,-1.217774e-01)'
          NumObservations: 351
                    Alpha: [90x1 double]
                     Bias: -0.1342
         KernelParameters: [1x1 struct]
                       Mu: [0.8917 0 0.6413 0.0444 0.6011 0.1159 0.5501 0.1194 0.5118 0.1813 0.4762 0.1550 0.4008 0.0934 0.3442 0.0711 0.3819 -0.0036 0.3594 -0.0240 0.3367 0.0083 0.3625 -0.0574 0.3961 -0.0712 0.5416 -0.0695 0.3784 ... ] (1x34 double)
                    Sigma: [0.3112 0 0.4977 0.4414 0.5199 0.4608 0.4927 0.5207 0.5071 0.4839 0.5635 0.4948 0.6222 0.4949 0.6528 0.4584 0.6180 0.4968 0.6263 0.5191 0.6098 0.5182 0.6038 0.5275 0.5785 0.5085 0.5162 0.5500 0.5759 0.5080 ... ] (1x34 double)
           BoxConstraints: [351x1 double]
          ConvergenceInfo: [1x1 struct]
          IsSupportVector: [351x1 logical]
                   Solver: 'SMO'


クラスは不可分であるため、スコア変換関数 (ScoreSVMModel.ScoreTransform) はシグモイド関数です。

学習データのスコアと陽性のクラスの事後確率を推定します。最初の 10 件の観測の結果を表示します。

[label,scores] = resubPredict(SVMModel);
[~,postProbs] = resubPredict(ScoreSVMModel);
table(Y(1:10),label(1:10),scores(1:10,2),postProbs(1:10,2),'VariableNames',...
    {'TrueLabel','PredictedLabel','Score','PosteriorProbability'})
ans=10×4 table
    TrueLabel    PredictedLabel     Score     PosteriorProbability
    _________    ______________    _______    ____________________

      {'g'}          {'g'}          1.4862           0.82216      
      {'b'}          {'b'}         -1.0003           0.30433      
      {'g'}          {'g'}          1.8685           0.86917      
      {'b'}          {'b'}         -2.6457          0.084171      
      {'g'}          {'g'}          1.2807           0.79186      
      {'b'}          {'b'}         -1.4616           0.22025      
      {'g'}          {'g'}          2.1674           0.89816      
      {'b'}          {'b'}         -5.7085           0.00501      
      {'g'}          {'g'}          2.4798           0.92224      
      {'b'}          {'b'}         -2.7812          0.074781      

1 対他 (OVA) 分類のプロセスを通してマルチクラス SVM 分類器に学習をさせてから、各クラスについて確率の等高線をプロットします。OVA を直接実装するには、fitcecocを参照してください。

フィッシャーのアヤメのデータ セットを読み込みます。花弁の長さと幅を予測子データとして使用します。

load fisheriris
X = meas(:,3:4);
Y = species;

データの散布図を調べます。

figure
gscatter(X(:,1),X(:,2),Y);
title('{\bf Scatter Diagram of Iris Measurements}');
xlabel('Petal length');
ylabel('Petal width');
legend('Location','Northwest'); 
axis tight

Figure contains an axes object. The axes object with title blank Scatter blank Diagram blank of blank Iris blank Measurements, xlabel Petal length, ylabel Petal width contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

それぞれの種類アヤメを他から分離する 3 つのバイナリ SVM 分類器に学習をさせます。放射基底関数がそれぞれに対する適切なカーネルであると仮定し、アルゴリズムがカーネル スケールを選択できるようにします。クラスの順序を定義します。

classNames = {'setosa'; 'virginica'; 'versicolor'};
numClasses = size(classNames,1);
inds = cell(3,1); % Preallocation
SVMModel = cell(3,1);

rng(1); % For reproducibility
for j = 1:numClasses
    inds{j} = strcmp(Y,classNames{j});  % OVA classification
    SVMModel{j} = fitcsvm(X,inds{j},'ClassNames',[false true],...
        'Standardize',true,'KernelFunction','rbf','KernelScale','auto');
end

fitcsvm はヒューリスティック手法を使用し、副標本抽出によってカーネル スケールの値を計算します。

各分類器のスコアから事後確率への最適な変換関数パラメーターを近似します。

for j = 1:numClasses
    SVMModel{j} = fitPosterior(SVMModel{j});
end
Warning: Classes are perfectly separated. The optimal score-to-posterior transformation is a step function.

事後確率等高線をプロットするためのグリッドを定義します。各分類器のグリッド上での事後確率を推定します。

d = 0.02;
[x1Grid,x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)),...
    min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];

posterior = cell(3,1); 
for j = 1:numClasses
    [~,posterior{j}] = predict(SVMModel{j},xGrid);
end

SVM 分類器ごとに、データの散布図の下に事後確率等高線をプロットします。

figure
h = zeros(numClasses + 1,1); % Preallocation for graphics handles
for j = 1:numClasses
subplot(2,2,j)
contourf(x1Grid,x2Grid,reshape(posterior{j}(:,2),size(x1Grid,1),size(x1Grid,2)));
hold on
h(1:numClasses) = gscatter(X(:,1),X(:,2),Y);
title(sprintf('Posteriors for %s Class',classNames{j}));
xlabel('Petal length');
ylabel('Petal width');
legend off
axis tight
hold off
end
h(numClasses + 1) = colorbar('Location','EastOutside',...
    'Position',[[0.8,0.1,0.05,0.4]]);
set(get(h(numClasses + 1),'YLabel'),'String','Posterior','FontSize',16);
legend(h(1:numClasses),'Location',[0.6,0.2,0.1,0.1]);

Figure contains 3 axes objects. Axes object 1 with title Posteriors for setosa Class, xlabel Petal length, ylabel Petal width contains 4 objects of type contour, line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica. Axes object 2 with title Posteriors for virginica Class, xlabel Petal length, ylabel Petal width contains 4 objects of type contour, line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica. Axes object 3 with title Posteriors for versicolor Class, xlabel Petal length, ylabel Petal width contains 4 objects of type contour, line. One or more of the lines displays its values using only markers These objects represent setosa, versicolor, virginica.

SVM 分類器に学習をさせた後で、スコアから事後確率への変換関数を推定します。推定時に交差検証を使用してバイアスを減らし、10 分割交差検証とホールドアウト交差検証の実行時間を比較します。

ionosphere データ セットを読み込みます。

load ionosphere

SVM 分類器を学習させます。データを標準化し、'g' が陽性クラスであることを指定します。

SVMModel = fitcsvm(X,Y,'ClassNames',{'b','g'},'Standardize',true);

SVMModelClassificationSVM 分類器です。

スコアから事後確率への最適な変換関数パラメーターを近似します。10 分割交差検証 (既定) の場合と 10% のホールドアウトテスト標本を使用した場合の実行時間を比較します。

rng(1); % For reproducibility
tic;    % Start the stopwatch
SVMModel_10FCV = fitPosterior(SVMModel);
toc     % Stop the stopwatch and display the run time
Elapsed time is 2.436649 seconds.
tic;
SVMModel_HO = fitPosterior(SVMModel,'Holdout',0.10);
toc
Elapsed time is 0.519671 seconds.

データ セットが比較的小さいため実行時間はどちらも短くなりますが、SVMModel_HOSVMModel_10FCV よりはるかに速くスコア変換関数を当てはめます。(既定の 10 分割交差検証ではなく) ホールドアウト交差検証を指定すると、大規模なデータ セットの場合の実行時間を短くすることができます。

入力引数

すべて折りたたむ

完全な学習済み SVM 分類器。fitcsvm で学習をさせた ClassificationSVM モデルを指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: fitPosterior(SVMModel,'KFold',5) は、5 つの分割を交差検証済みモデルで使用します。

変換関数の計算に使用する交差検証分割。'CVPartition' と、cvpartition によって作成された cvpartition 分割オブジェクトから構成されるコンマ区切りのペアとして指定します。交差検証済みモデルの作成には、次の 4 つのオプションの 1 つだけを使用できます。'KFold''Holdout''Leaveout' または 'CVPartition' のいずれかです。

fitcsvm の名前と値のペアの引数 crossval は、cvpartition を使用してデータをサブセットに分割します。

例: cvp = cvpartition(500,'KFold',5) を使用して、500 個の観測値に対する 5 分割交差検証について無作為な分割を作成するとします。この場合、'CVPartition',cvp を使用して交差検証済みモデルを指定できます。

変換関数の計算に使用するホールドアウト検証用データの比率。'Holdout' と (0,1) の範囲内にあるスカラー値から構成されるコンマ区切りのペアとして指定します。ホールドアウト検証では、指定された比率のデータをテストし、残りのデータを学習に使用します。

交差検証済みモデルの作成には、次の 4 つのオプションの 1 つだけを使用できます。'KFold''Holdout''Leaveout' または 'CVPartition' のいずれかです。

例: 'Holdout',0.1

データ型: double | single

変換関数を計算するときに使用する分割数。'KFold' と 1 より大きい正の整数値から構成されるコンマ区切りのペアとして指定します。

交差検証済みモデルの作成には、次の 4 つのオプションの 1 つだけを使用できます。'KFold''Holdout''Leaveout' または 'CVPartition' のいずれかです。

例: 'KFold',8

データ型: single | double

変換関数の計算に Leave-one-out 交差検証を使用するかどうかを示す Leave-one-out 交差検証フラグ。'Leaveout''on' または 'off' から構成されるコンマ区切りのペアとして指定します。'Leaveout','on' を指定することにより Leave-one-out 法の交差検証を使用します。

交差検証済みモデルの作成には、次の 4 つのオプションの 1 つだけを使用できます。'KFold''Holdout''Leaveout' または 'CVPartition' のいずれかです。

例: 'Leaveout','on'

出力引数

すべて折りたたむ

学習済みの SVM 分類器。ClassificationSVM 分類器として返されます。学習済みの分類器には、推定された、スコアから事後確率への変換関数が格納されます。

学習セット観測の事後確率を推定するには、ScoreSVMModelresubPredict に渡します。

新しい観測値について事後確率を推定するには、新しい観測値と ScoreSVMModelpredict に渡します。

スコアから事後確率への最適な変換関数のパラメーター。構造体配列として返します。

  • ScoreTransformType フィールドの値が sigmoid である場合、ScoreTransform には次のフィールドも含まれます。

  • ScoreTransformType フィールドの値が step である場合、ScoreTransform には次のフィールドも含まれます。

    • PositiveClassProbability:ステップ関数の π の値。この値は、スコアが区間 (LowerBound,UpperBound) 内にある場合に観測値が陽性クラスに属する確率または観測値が陽性クラスに属する事後確率を表します。

    • LowerBound:ステップ関数の maxyn=1sn の値。この値はスコア範囲の下限を表します。この範囲内のスコアをもつ観測値には、陽性クラスである事後確率 PositiveClassProbability が割り当てられます。スコアが LowerBound より小さい観測値は、陽性クラスである事後確率が 0 になります。

    • UpperBound:ステップ関数の minyn=+1sn の値。この値はスコア範囲の上限を表します。この範囲内のスコアをもつ観測値には、陽性クラスである事後確率 PositiveClassProbability が割り当てられます。スコアが UpperBound より大きい観測値は、陽性クラスである事後確率が 1 になります。

  • ScoreTransformType フィールドの値が constant である場合、ScoreTransform.PredictedClass にはクラス予測の名前が格納されます。

    この結果は、SVMModel.ClassNames と同じです。観測値が ScoreTransform.PredictedClass にある事後確率は必ず 1 となります。

詳細

すべて折りたたむ

シグモイド関数

観測値 j に対応するスコア sj を陽性クラスの事後確率にマッピングするシグモイド関数は、次のようになります。

P(sj)=11+exp(Asj+B).

ScoreTransformType フィールドの値が sigmoid である場合、パラメーター A および B はそれぞれ ScoreTransform のフィールド Scale および Intercept に対応します。

ステップ関数

観測値 j に対応するスコア sj を陽性のクラスの事後確率にマッピングするステップ関数は、次のようになります。

P(sj)={0;s<maxyk=1skπ;maxyk=1sksjminyk=+1sk1;sj>minyk=+1sk,

ここで

  • sj は観測値 j のスコアです。

  • +1 と –1 はそれぞれ陽性と陰性のクラスを表します。

  • π は観測値が陽性のクラスにある事前確率を表しています。

ScoreTransformType フィールドの値が step である場合、数量 maxyk=1sk および minyk=+1sk はそれぞれ ScoreTransform のフィールド LowerBound および UpperBound に対応します。

定数関数

定数関数は標本内のすべてのスコアを事後確率 1 または 0 にマッピングします。

すべての観測値の事後確率が 1 である場合、これらは陽性のクラスから派生したと予想されます。

すべての観測値の事後確率が 0 である場合、これらは陽性のクラスから派生したと予想されません。

ヒント

  • 以下は、陽性クラスの事後確率を予測する方法の 1 つです。

    1. データを fitcsvm に渡し、SVM 分類器を学習させます。この結果、SVMModel などの学習済み SVM 分類器が生成され、データが格納されます。スコア変換関数プロパティ (SVMModel.ScoreTransformation) が none に設定されます。

    2. 学習させた SVM 分類器 SVMModelfitSVMPosterior または fitPosterior に渡します。結果 (たとえば ScoreSVMModel) は SVMModel と同じ学習済み SVM 分類器ですが、最適なスコア変換関数が ScoreSVMModel.ScoreTransformation として設定される点が異なります。

    3. 最適なスコア変換関数が格納されている学習済み SVM 分類器 (ScoreSVMModel) と予測子データ行列を predict に渡します。predict の 2 番目の出力引数の 2 列目には、予測子データ行列の各行に対応する陽性クラスの事後確率が格納されます。

      手順 2 を省略した場合、predict は陽性のクラスの事後確率ではなく、陽性のクラスのスコアを返します。

  • 事後確率を当てはめた後で、新しいデータについてラベルを予測する C/C++ コードを生成できます。C/C++ コードの生成には MATLAB® Coder™ が必要です。詳細については、コード生成の紹介を参照してください。

アルゴリズム

[1]で説明されているように、SVM 分類器 SVMModel を使用し、保存されている予測子データ (SVMModel.X) およびクラス ラベル (SVMModel.Y) によって 10 分割交差検証を実行することにより、スコアから事後確率への適切な変換関数が当てはめられます。この変換関数は、観測値が陽性のクラス (SVMModel.Classnames(2)) に分類される事後確率を計算します。

  • クラスが不可分な場合、変換関数はシグモイド関数です。

  • クラスが完全に可分な場合、変換関数はステップ関数です。

  • 2 クラス学習では、一方のクラスの相対頻度が 0 である場合、変換関数は定数関数になります。関数 fitPosterior は 1 クラス学習に適していません。

  • スコアから事後確率への最適な変換関数が ScoreSVMModel.ScoreTransform に保存されます。

スコアから事後確率への変換関数を再度推定した場合、つまり、ScoreTransform プロパティが none ではない SVM 分類器を fitPosterior または fitSVMPosterior に渡した場合は、以下の処理が実行されます。

  • 警告が表示されます。

  • 新しい変換関数を推定する前に、元の変換関数が 'none' にリセットされます。

代替機能

事後確率関数は、関数 fitSVMPosterior を使用して当てはめることもできます。この関数は fitPosterior に似ていますが、使用できる SVM 分類器の種類が多いので広範囲であるという点が異なります。

参照

[1] Platt, J. “Probabilistic outputs for support vector machines and comparisons to regularized likelihood methods.” Advances in Large Margin Classifiers. Cambridge, MA: The MIT Press, 2000, pp. 61–74.

拡張機能

バージョン履歴

R2014a で導入