Main Content

fitSVMPosterior

説明

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

スコアから事後確率への変換関数は、SVM 分類器 SVMModel を使用して近似されます。また、保存されている予測子データ (SVMModel.X) とクラス ラベル (SVMModel.Y) を使用して交差検証が実行されます。この変換関数は、観測値が陽性のクラス (SVMModel.Classnames(2)) に分類される事後確率を計算します。

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

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

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

  • SVMModelClassificationSVM 分類器である場合、最適な変換関数は 10 分割交差検証を使用して推定されます ([1]を参照してください)。それ以外の場合、SVMModelClassificationPartitionedModel 分類器でなければなりません。SVMModel は交差検証の方法を指定します。

  • 最適な変換関数が ScoreSVMModel.ScoreTransform に格納されます。

ScoreSVMModel = fitSVMPosterior(SVMModel,Tbl,ResponseVarName) は、学習済みのコンパクトな SVM 分類器 SVMModel から、変換関数が含まれている学習済みのサポート ベクター分類器を返します。スコア変換関数は、table Tbl 内の予測子データとクラス ラベル Tbl.ResponseVarName を使用して推定されます。

ScoreSVMModel = fitSVMPosterior(SVMModel,Tbl,Y) は、学習済みのコンパクトな SVM 分類器 SVMModel から、変換関数が含まれている学習済みのサポート ベクター分類器を返します。スコア変換関数は、table Tbl 内の予測子データとクラス ラベル Y を使用して推定されます。

ScoreSVMModel = fitSVMPosterior(SVMModel,X,Y) は、学習済みのコンパクトな SVM 分類器 SVMModel から、変換関数が含まれている学習済みのサポート ベクター分類器を返します。予測子データ X とクラス ラベル Y を使用してスコア変換関数が推定されます。

SVMModelClassificationSVM 分類器である場合、ScoreSVMModel = fitSVMPosterior(___,Name,Value) は 1 つ以上の Name,Value ペアの引数で指定された追加オプションを使用します。たとえば、k 分割交差検証で使用する分割の数を指定できます。

さらに、[ScoreSVMModel,ScoreTransform] = fitSVMPosterior(___) は、上記の構文の入力引数のいずれかを使用して、変換関数のパラメーター (ScoreTransform) を返します。

すべて折りたたむ

フィッシャーのアヤメのデータ セットを読み込みます。花弁の長さと幅を使用して分類器に学習させ、データから virginica 種を削除します。

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

gscatter(X(:,1),X(:,2),y);
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 分類器に学習させます。10 分割交差検証 (既定) を使用して分類器を交差検証します。

rng(1);
CVSVMModel = fitcsvm(X,y,'CrossVal','on');

CVSVMModel は学習させた ClassificationPartitionedModel SVM 分類器です。

スコアを事後確率に変換するステップ関数を推定します。

[ScoreCVSVMModel,ScoreParameters] = fitSVMPosterior(CVSVMModel);
Warning: Classes are perfectly separated. The optimal score-to-posterior transformation is a step function.

fitSVMPosterior は次のことを行います。

  • CVSVMModel に格納されたデータを使用して変換関数を近似します。

  • クラスが可分な場合に警告を表示します。

  • ステップ関数を ScoreCSVMModel.ScoreTransform に格納します。

スコア関数の種類とそのパラメーター値を表示します。

ScoreParameters
ScoreParameters = struct with fields:
                        Type: 'step'
                  LowerBound: -0.8431
                  UpperBound: 0.6897
    PositiveClassProbability: 0.5000

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

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

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

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

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

クラスは可分なので、ステップ関数はスコアを 0 または 1 に変換します。これは、観測値が versicolor 種のアヤメである事後確率です。

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

load ionosphere

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

SVM 分類器を学習させます。10 分割交差検証を使用して交差検証します (既定の設定)。予測子を標準化してクラスの順序を指定することをお勧めします。

rng(1) % For reproducibility
CVSVMModel = fitcsvm(X,Y,'ClassNames',{'b','g'},'Standardize',true,...
    'CrossVal','on');
ScoreTransform = CVSVMModel.ScoreTransform
ScoreTransform = 
'none'

CVSVMModel は学習させた ClassificationPartitionedModel SVM 分類器です。陽性のクラスは 'g' です。ScoreTransform プロパティは none

観測スコアを、'g' として分類される観測の事後確率にマッピングするために最適なスコア関数を推定します。

[ScoreCVSVMModel,ScoreParameters] = fitSVMPosterior(CVSVMModel);
ScoreTransform = ScoreCVSVMModel.ScoreTransform
ScoreTransform = 
'@(S)sigmoid(S,-9.481799e-01,-1.218494e-01)'
ScoreParameters
ScoreParameters = struct with fields:
         Type: 'sigmoid'
        Slope: -0.9482
    Intercept: -0.1218

ScoreTransform は最適なスコア変換関数です。ScoreParameters にはスコア変換関数、勾配の推定値、切片の推定値が格納されています。

ScoreCVSVMModelkfoldPredict に渡すと、テスト標本の事後確率を推定することができます。

SVM アルゴリズムのテスト セットの陽性クラス事後確率を推定します。

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

load ionosphere

SVM 分類器を学習させます。20% のホールドアウト標本を指定します。予測子を標準化してクラスの順序を指定することをお勧めします。

rng(1) % For reproducibility
CVSVMModel = fitcsvm(X,Y,'Holdout',0.2,'Standardize',true,...
    'ClassNames',{'b','g'});

CVSVMModel は学習させた ClassificationPartitionedModel 交差検証分類器です。

観測スコアを、'g' として分類される観測の事後確率にマッピングするために最適なスコア関数を推定します。

ScoreCVSVMModel = fitSVMPosterior(CVSVMModel);

ScoreSVMModel は学習させた ClassificationPartitionedModel 交差検証分類器で、学習データから推定された最適スコア変換関数が含まれます。

標本外の陽性クラス事後確率を推定します。最初の 10 件の標本外観測の結果を表示します。

[~,OOSPostProbs] = kfoldPredict(ScoreCVSVMModel);
indx = ~isnan(OOSPostProbs(:,2));
hoObs = find(indx); % Holdout observation numbers
OOSPostProbs = [hoObs, OOSPostProbs(indx,2)];
table(OOSPostProbs(1:10,1),OOSPostProbs(1:10,2),...
    'VariableNames',{'ObservationIndex','PosteriorProbability'})
ans=10×2 table
    ObservationIndex    PosteriorProbability
    ________________    ____________________

            6                   0.17379     
            7                   0.89639     
            8                 0.0076634     
            9                   0.91603     
           16                   0.02672     
           22                4.6091e-06     
           23                    0.9024     
           24                2.4127e-06     
           38                0.00042696     
           41                   0.86429     

入力引数

すべて折りたたむ

学習させた SVM 分類器。ClassificationSVMCompactClassificationSVM または ClassificationPartitionedModel 分類器として指定します。

SVMModelClassificationSVM 分類器の場合、オプションの名前と値のペアの引数を設定できます。

SVMModelCompactClassificationSVM 分類器である場合、予測子データ X とクラス ラベル Y を入力しなければなりません。

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

SVMModel を学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName または Y を指定する必要はありません。

テーブルに格納されている標本データを使用して SVMModel に学習をさせた場合、fitSVMPosterior の入力データもテーブルに含まれていなければなりません。

SVMModel に学習をさせるときに fitcsvm'Standardize',true を設定した場合、対応する SVMModel.Mu 内の平均および SVMModel.Sigma 内の標準偏差を使用して、予測子データの列が標準化されます。

データ型: table

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

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

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

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

データ型: double | single

応答変数の名前。Tbl 内の変数の名前で指定します。SVMModel を学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が Tbl.Response として格納されている場合、ResponseVarName として 'Response' を指定します。それ以外の場合、Tbl の列は Tbl.Response を含めてすべて予測子として扱われます。

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

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

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

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

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

名前と値の引数

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

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

例: 'KFold',8SVMModelClassificationSVM 分類器である場合に 8 分割交差検証を実行します。

変換関数の計算に使用する交差検証分割。'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 分類器。ClassificationSVMCompactClassificationSVM または ClassificationPartitionedModel 分類器として返されます。

ScoreSVMModel 分類器の種類は SVMModel 分類器の種類と同じです。

事後確率を推定するには、ScoreSVMModel と予測子データを predict に渡します。fitcsvm'Standardize',true に設定して SVMModel を学習させた場合、predict により X の列が SVMModel.Mu の対応する平均値と SVMModel.Sigma の標準偏差を使用して標準化されます。

スコアから事後確率への最適な変換関数のパラメーター。構造体配列として指定します。Type フィールドの値によって、次のようになります。

  • sigmoid の場合、ScoreTransform には次の 3 つのフィールドがあります。

  • step の場合、ScoreTransform には次の 3 つのフィールドがあります。

    • PositiveClassProbability: ステップ関数の π の値。π は次の内容を表します。

      • 観測値が陽性のクラスにある確率。

      • スコアが (LowerBound,UpperBound) の範囲にある事後確率。

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

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

  • 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™ が必要です。詳細については、コード生成の紹介を参照してください。

アルゴリズム

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

  • 警告が表示されます。

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

参照

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

バージョン履歴

R2014a で導入