Main Content

fitPosterior

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

説明

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

ScoreSVMModel = fitPosterior(SVMModel,X,Y) は、2 クラス学習の場合に、スコアから事後確率への最適な変換関数が格納されている学習済み SVM 分類器 ScoreSVMModel を返します。行列を使用して SVMModel に学習をさせた場合、fitPosterior の入力として行列を使用しなければなりません。

[ScoreSVMModel,ScoreTransform] = fitPosterior(___) は、前の構文における入力引数の組み合わせのすべてについて、スコアから事後確率への最適な変換関数のパラメーター (ScoreTransform) をさらに返します。

すべて折りたたむ

ionosphere データ セットを読み込みます。データから無作為に 20 件の観測値を確保し、このセットを新しいデータとして使用します。

load ionosphere
n = size(X,1);
rng(1);  % For reproducibility

indx = ~ismember([1:n],randsample(n,20)); % Indices for the training data

このデータ セットのクラスは不可分です。

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

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

SVMModelClassificationSVM 分類器です。

この新しいデータ セットを使用して、スコアから事後確率への最適な変換関数を推定します。この関数は、g として分類されている観測値の事後確率にスコアをマッピングします。効率を向上させるため、コンパクトなバージョンの SVMModel を作成し、このバージョンと新しいデータを fitPosterior に渡します。

CompactSVMModel = compact(SVMModel);
[ScoreCSVMModel,ScoreParameters] = fitPosterior(CompactSVMModel,...
    X(~indx,:),Y(~indx));

ScoreTransform = ScoreCSVMModel.ScoreTransform
ScoreTransform = 
'@(S)sigmoid(S,-1.098977e+00,4.520421e-01)'
ScoreParameters
ScoreParameters = struct with fields:
         Type: 'sigmoid'
        Slope: -1.0990
    Intercept: 0.4520

ScoreTransform は最適なスコア変換関数です。ScoreParameters は構造体配列であり、スコア変換関数名 (Type)、シグモイド勾配 (Slope)、シグモイド切片の推定値 (Intercept) を格納する 3 つのフィールドがあります。

また、SVMModel と新しいデータを fitSVMPosterior に渡すこともできますが、効率は低下します。

この新しいデータの観測値のクラスが g である事後確率を推定します。

[labels,postProbs] = predict(ScoreCSVMModel,X(~indx,:));
table(Y(~indx),labels,postProbs(:,2),...
    'VariableNames',{'TrueLabel','PredictedLabel','PosteriorProbability'})
ans=20×3 table
    TrueLabel    PredictedLabel    PosteriorProbability
    _________    ______________    ____________________

      {'g'}          {'g'}                  0.7844     
      {'b'}          {'b'}                0.024584     
      {'g'}          {'g'}                 0.82403     
      {'b'}          {'b'}                0.006164     
      {'b'}          {'b'}              3.6084e-06     
      {'b'}          {'b'}                 0.15687     
      {'b'}          {'g'}                 0.96219     
      {'b'}          {'b'}              6.1329e-09     
      {'b'}          {'b'}               0.0019641     
      {'g'}          {'g'}                  0.7251     
      {'g'}          {'g'}                 0.70263     
      {'b'}          {'b'}                0.075302     
      {'g'}          {'g'}                 0.90691     
      {'g'}          {'g'}                 0.82844     
      {'b'}          {'b'}                0.051178     
      {'g'}          {'g'}                 0.95332     
      ⋮

フィッシャーのアヤメのデータ セットを読み込みます。予測子データとして花弁の長さと幅を使用し、データから virginica 種を削除します。データから無作為に 10 件の観測値を確保し、このセットを新しいデータとして使用します。

load fisheriris
classKeep = ~strcmp(species,'virginica');
X = meas(classKeep,3:4);
Y = species(classKeep);

rng(1);  % For reproducibility 
indx1 = 1:numel(species);
indx2 = indx1(classKeep);
indx = ~ismember(indx2,randsample(indx2,10)); % Indices for the training data

gscatter(X(indx,1),X(indx,2),Y(indx));
title('Scatter Diagram of Iris Measurements')
xlabel('Petal length')
ylabel('Petal width')
legend('Setosa','Versicolor')

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

クラスは完全に可分です。そのため、スコアから事後確率への変換関数はステップ関数です。

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

SVMModel = fitcsvm(X(indx,:),Y(indx),...
    'ClassNames',{'setosa','versicolor'},'Standardize',true);

SVMModelClassificationSVM 分類器です。

この新しいデータ セットを使用して、スコアから事後確率への最適な変換関数を推定します。この関数は、versicolor として分類されている観測値の事後確率にスコアをマッピングします。効率を向上させるため、コンパクトなバージョンの SVMModel を作成し、このバージョンと新しいデータを fitPosterior に渡します。

CompactSVMModel = compact(SVMModel);
[ScoreCSVMModel,ScoreParameters] = fitPosterior(CompactSVMModel,...
    X(~indx,:),Y(~indx));
Warning: Classes are perfectly separated. The optimal score-to-posterior transformation is a step function.
ScoreTransform = ScoreCSVMModel.ScoreTransform
ScoreTransform = 
'@(S)step(S,-1.338450e+00,2.012495e+00,5.333333e-01)'

fitPosterior はクラスが可分であれば警告を表示し、ステップ関数を ScoreSVMModel.ScoreTransform に格納します。

スコア関数の種類とその推定値を表示します。

ScoreParameters
ScoreParameters = struct with fields:
                        Type: 'step'
                  LowerBound: -1.3385
                  UpperBound: 2.0125
    PositiveClassProbability: 0.5333

ScoreParameters は構造体配列であり、次の 4 つのフィールドがあります。

  • スコア変換関数の種類 (Type)

  • 陰性クラスの境界に対応するスコア (LowerBound)

  • 陽性クラスの境界に対応するスコア (UpperBound)

  • 陽性クラスの確率 (PositiveClassProbability)

また、SVMModel と新しいデータを fitSVMPosterior に渡すこともできますが、効率は低下します。

この新しいデータの観測値が示すアヤメの種類が versicolor である事後確率を推定します。

[labels,postProbs] = predict(ScoreCSVMModel,X(~indx,:));
table(Y(~indx),labels,postProbs(:,2),...
    'VariableNames',{'TrueLabel','PredictedLabel','PosteriorProbability'})
ans=10×3 table
      TrueLabel       PredictedLabel    PosteriorProbability
    ______________    ______________    ____________________

    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'setosa'    }    {'setosa'    }             0          
    {'versicolor'}    {'versicolor'}             1          
    {'versicolor'}    {'versicolor'}             1          

クラスが可分なので、ステップ関数により陽性クラスのスコアが次の値に変換されます。

  • 0 (スコアが ScoreParameters.LowerBound より小さい場合)

  • 1 (スコアが ScoreParameters.UpperBound より大きい場合)

  • ScoreParameters.PositiveClassProbability (スコアが [ScoreParameters.LowerBound, ScoreParameters.LowerBound] の範囲内にある場合)

入力引数

すべて折りたたむ

コンパクトな学習済み SVM 分類器。compact によって返される CompactClassificationSVM モデルを指定します。

標本データ。テーブルとして指定します。TBL の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。TBL には、SVMModel を学習させるために使用したすべての予測子が含まれていなければなりません。オプションとして、応答変数用の追加列を TBL に含めることができます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

SVMModel を学習させるために使用した応答変数が TBL に含まれている場合、Y を指定する必要はありません。TBL に応答変数が含まれていない場合、Y の長さは TBL の行数と等しくなければなりません。

table 型の標本データを使用して SVMModel を学習させた場合、fitPosterior の入力データをテーブルとして指定しなければなりません。

SVMModel に学習をさせるときに fitcsvm'Standardize',true を設定した場合、標準化されたデータを使用して変換関数のパラメーター推定値が当てはめられます。

データ型: table

スコアから事後確率への変換関数の推定に使用する予測子データ。行列として指定します。

X の各行は 1 件の観測 (インスタンスや例とも呼ばれます) に対応し、各列は 1 個の変数 (特徴とも呼ばれます) に対応します。

Y の長さと X の行数は等しくなければなりません。

SVMModel に学習をさせるときに fitcsvm'Standardize',true を設定した場合、標準化されたデータを使用して変換関数のパラメーター推定値が当てはめられます。

データ型: double | single

スコアから事後確率に変換する関数の推定に使用するクラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。

Y が文字配列の場合、各要素は 1 つのクラス ラベルに対応しなければなりません。

Y の長さと X の行数は等しくなければなりません。

データ型: categorical | char | string | logical | single | double | cell

出力引数

すべて折りたたむ

推定されるスコアから事後確率への変換関数を含む、学習させたコンパクトな SVM 分類器。CompactClassificationSVM 分類器として返されます。

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

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

  • 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 で導入