Main Content

predict

サポート ベクター マシン (SVM) 分類器を使用して観測値を分類

説明

label = predict(SVMModel,X) は、学習済みのサポート ベクター マシン (SVM) 分類モデル SVMModel に基づいて、テーブルまたは行列 X 内の予測子データに対する予測クラス ラベルのベクトルを返します。学習済みの SVM モデルは、完全でもコンパクトでもかまいません。

[label,score] = predict(SVMModel,X) は、ラベルが特定のクラスから派生する尤度を示すスコアの行列 (score) も返します。SVM の場合、尤度の尺度は分類スコアまたはクラス事後確率です。X 内の各観測値について、予測クラス ラベルは、すべてのクラスの中で最大のスコアに対応します。

すべて折りたたむ

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

load ionosphere
rng(1); % For reproducibility

SVM 分類器を学習させます。テスト用に 15% のホールドアウト標本を指定し、データを標準化して、'g' が陽性クラスであることを指定します。

CVSVMModel = fitcsvm(X,Y,'Holdout',0.15,'ClassNames',{'b','g'},...
    'Standardize',true);
CompactSVMModel = CVSVMModel.Trained{1}; % Extract trained, compact classifier
testInds = test(CVSVMModel.Partition);   % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);

CVSVMModelClassificationPartitionedModel 分類器です。この分類器には Trained プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた CompactClassificationSVM 分類器が格納されています。

検定標本観測値にラベルを設定します。検定標本にある最初の 10 件の観測値の結果を表示します。

[label,score] = predict(CompactSVMModel,XTest);
table(YTest(1:10),label(1:10),score(1:10,2),'VariableNames',...
    {'TrueLabel','PredictedLabel','Score'})
ans=10×3 table
    TrueLabel    PredictedLabel     Score  
    _________    ______________    ________

      {'b'}          {'b'}          -1.7175
      {'g'}          {'g'}           2.0003
      {'b'}          {'b'}          -9.6836
      {'g'}          {'g'}           2.5616
      {'b'}          {'b'}           -1.548
      {'g'}          {'g'}           2.0983
      {'b'}          {'b'}          -2.7016
      {'b'}          {'b'}         -0.66331
      {'g'}          {'g'}           1.6047
      {'g'}          {'g'}            1.773

SVM 分類器を使用して、新しい観測値にラベルを付けます。

電離層データ セットを読み込みます。SVM 分類器に学習をさせた後で最後の 10 個の観測値が使用可能になったと仮定します。

load ionosphere
rng(1); % For reproducibility
n = size(X,1);       % Training sample size 
isInds = 1:(n-10);   % In-sample indices 
oosInds = (n-9):n;   % Out-of-sample indices

SVM 分類器を学習させます。データを標準化し、'g' が陽性クラスであることを指定します。学習させた SVM 分類器のサイズを減らし、メモリの消費量を抑えます。

SVMModel = fitcsvm(X(isInds,:),Y(isInds),'Standardize',true,...
    'ClassNames',{'b','g'});
CompactSVMModel = compact(SVMModel);
whos('SVMModel','CompactSVMModel')
  Name                 Size             Bytes  Class                                                 Attributes

  CompactSVMModel      1x1              30651  classreg.learning.classif.CompactClassificationSVM              
  SVMModel             1x1             137751  ClassificationSVM                                               

CompactClassificationSVM 分類器 (CompactSVMModel) では ClassificationSVM 分類器 (SVMModel) よりも省スペースになりますが、これは SVMModel がデータを格納しているためです。

スコアから事後確率への最適な変換関数を推定します。

CompactSVMModel = fitPosterior(CompactSVMModel,...
    X(isInds,:),Y(isInds))
CompactSVMModel = 
  CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'b'  'g'}
           ScoreTransform: '@(S)sigmoid(S,-1.968336e+00,3.121821e-01)'
                    Alpha: [88x1 double]
                     Bias: -0.2142
         KernelParameters: [1x1 struct]
                       Mu: [0.8886 0 0.6365 0.0457 0.5933 0.1200 0.5414 0.1217 0.5020 0.1872 0.4659 0.1596 0.3889 0.0970 0.3308 0.0723 0.3685 -0.0039 0.3453 -0.0256 0.3231 0.0097 0.3490 -0.0596 0.3839 -0.0731 0.5343 -0.0718 0.3659 ... ] (1x34 double)
                    Sigma: [0.3151 0 0.5032 0.4476 0.5251 0.4668 0.4966 0.5275 0.5107 0.4896 0.5681 0.5011 0.6267 0.5009 0.6569 0.4639 0.6214 0.5035 0.6296 0.5265 0.6128 0.5250 0.6067 0.5349 0.5817 0.5157 0.5212 0.5577 0.5787 0.5151 ... ] (1x34 double)
           SupportVectors: [88x34 double]
      SupportVectorLabels: [88x1 double]


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

標本外ラベルの陽性クラス事後確率を予測します。真のラベルを使用できるので、予測されたラベルと比較します。

[labels,PostProbs] = predict(CompactSVMModel,X(oosInds,:));
table(Y(oosInds),labels,PostProbs(:,2),'VariableNames',...
    {'TrueLabels','PredictedLabels','PosClassPosterior'})
ans=10×3 table
    TrueLabels    PredictedLabels    PosClassPosterior
    __________    _______________    _________________

      {'g'}            {'g'}              0.98419     
      {'g'}            {'g'}              0.95545     
      {'g'}            {'g'}              0.67792     
      {'g'}            {'g'}              0.94448     
      {'g'}            {'g'}              0.98745     
      {'g'}            {'g'}              0.92481     
      {'g'}            {'g'}              0.97111     
      {'g'}            {'g'}              0.96986     
      {'g'}            {'g'}              0.97803     
      {'g'}            {'g'}              0.94361     

PostProbs は 10 行 2 列の行列です。1 番目の列は陰性のクラスの事後確率で、2 番目の列は新しい観測値に対応する陽性のクラスの事後確率です。

入力引数

すべて折りたたむ

SVM 分類モデル。fitcsvm が返す ClassificationSVM モデル オブジェクトまたは compact が返す CompactClassificationSVM モデル オブジェクトを指定します。

分類対象の予測子データ。数値行列またはテーブルを指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

  • 数値行列の場合

    • X の列に含まれている変数の順序は、SVMModel に学習させた予測子変数の順序と同じでなければなりません。

    • テーブル (たとえば Tbl) を使用して SVMModel に学習をさせた場合、Tbl に含まれている予測子変数がすべて数値変数であれば、X を数値行列にすることができます。学習時に Tbl 内の数値予測子をカテゴリカルとして扱うには、fitcsvm の名前と値のペアの引数 CategoricalPredictors を使用してカテゴリカル予測子を指定します。Tbl に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X が数値行列である場合、predict でエラーがスローされます。

  • テーブルの場合

    • predict は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。

    • テーブル (たとえば Tbl) を使用して SVMModel に学習をさせた場合、X 内のすべての予測子変数は変数名およびデータ型が、(SVMModel.PredictorNamesに格納されている) SVMModel に学習させた変数と同じでなければなりません。ただし、X の列の順序が Tbl の列の順序に対応する必要はありません。また、TblX に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

    • 数値行列を使用して SVMModel に学習をさせた場合、SVMModel.PredictorNames 内の予測子名と X 内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定する方法については、fitcsvm の名前と値のペアの引数 PredictorNames を参照してください。X 内の予測子変数はすべて数値ベクトルでなければなりません。X に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

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

データ型: table | double | single

出力引数

すべて折りたたむ

予測クラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として返されます。

label は、SVMModel に学習させた観測済みクラス ラベル (Y) と同じデータ型になり、X の行数と同じ長さになります。(string 配列は文字ベクトルの cell 配列として扱われます)。

関数 predict は、スコアが最高になるクラスに観測値を分類します。観測値のスコアが NaN の場合、関数はこの観測値を、学習ラベルの最大比率を占める多数クラスに分類します。

1 クラス学習の場合は、学習データに含まれるクラスが 1 つであり、label の各値が同じになります。異常を特定するには score を使用します。

予測クラススコアまたは事後確率。数値列ベクトルまたは数値行列として返されます。

  • 1 クラス学習の場合、score は観測値 (X) と同じ行数の列ベクトルです。score の要素は、対応する観測値の異常スコアです。負のスコア値は、対応する観測値が外れ値であることを示します。1 クラス学習の事後確率を得ることはできません。

  • 2 クラス学習の場合、scoreX と同じ行数をもつ 2 列の行列になります。

    • fitPosterior または fitSVMPosterior を使用してスコアから事後確率への最適な変換関数を当てはめた場合、score にはクラスの事後確率が格納されます。つまり、SVMModel.ScoreTransform の値が none ではない場合、score の 1 列目と 2 列目にはそれぞれ、対応する観測値の陰性クラス (SVMModel.ClassNames{1}) の事後確率と陽性クラス (SVMModel.ClassNames{2}) の事後確率が格納されます。

    • それ以外の場合、1 列目には対応する観測値の陰性クラスのスコアが、2 列目には陽性クラスのスコアが格納されます。

SVMModel.KernelParameters.Function'linear' である場合、観測値 x の分類スコアは次のようになります。

f(x)=(x/s)β+b.

SVMModel では、β、b および s がそれぞれ BetaBias および KernelParameters.Scale プロパティに格納されます。

分類スコアを手動で推定するには、はじめに、学習時に適用したすべての変換を予測子データに適用しなければなりません。具体的には、fitcsvm を使用するときに 'Standardize',true を指定した場合は、平均 SVMModel.Mu と標準偏差 SVMModel.Sigma を使用して予測子データを手動で標準化してから、結果を SVMModel.KernelParameters.Scale 内のカーネル スケールで除算しなければなりません。

resubPredictpredict など、すべての SVM 関数で、必要な変換の適用は推定の前に行われます。

SVMModel.KernelParameters.Function'linear' ではない場合、Beta は空 ([]) になります。

詳細

すべて折りたたむ

分類スコア

観測値 x を分類するための SVM の "分類スコア" は、x から判定境界 (範囲は -∞ ~ +∞) までの符号付き距離です。クラスの正のスコアは、x がそのクラスにあると予測されることを示します。負のスコアはそうではないことを示します。

陽性クラス分類スコア f(x) は、学習済み SVM 分類関数です。f(x) は x に対する数値的な予測応答でもあり、x を陽性クラスとして予測するスコアでもあります。

f(x)=j=1nαjyjG(xj,x)+b,

ここで、(α1,...,αn,b) は推定された SVM パラメーター、G(xj,x) は予測子空間における x とサポート ベクターの間のドット積です。合計には学習セットの観測値が含まれます。x に対する負のクラス分類スコア、つまり x を陰性クラスとして予測するスコアは、–f(x) です。

G(xj,x) = xj′x (線形カーネル) の場合、スコア関数は次のように縮小されます。

f(x)=(x/s)β+b.

s はカーネル スケール、β は近似線形係数のベクトルです。

詳細は、サポート ベクター マシンについてを参照してください。

事後確率

"事後確率" はデータが与えられる場合に、観測値が特定のクラスに属している確率です。

SVM の場合、事後確率は、観測値 j がクラス k = {-1,1} に含まれるスコアの関数 P(s) です。

  • 可分クラスの場合、事後確率は次のステップ関数になります。

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

    ここで

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

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

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

  • 不可分クラスの場合、事後確率は次のシグモイド関数になります。

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

    ここで、パラメーター A は勾配パラメーター、B は切片パラメーターです。

事前確率

クラスの "事前確率" は、母集団内でそのクラスの観測値が出現すると考えられる相対頻度です。

ヒント

  • 分類に線形 SVM モデルを使用しており、多数のサポート ベクターがモデルに含まれている場合、予測方式に predict を使用すると低速になる可能性があります。線形 SVM モデルに基づく観測値の分類を効率的に行うには、discardSupportVectors を使用してサポート ベクターをモデル オブジェクトから削除します。

アルゴリズム

  • 既定では、モデルのカーネル関数に関係なく、MATLAB® はスコア関数の双対表現を使用して学習済みの SVM モデルに基づく観測値の分類を行います。具体的には、次のようになります。

    f^(x)=j=1nα^jyjG(x,xj)+b^.

    この予測方式では、学習済みのサポート ベクターと α 係数が必要です (SVM モデルの SupportVectors および Alpha プロパティを参照)。

  • 既定では、Platt の方法 [1] を使用して最適な事後確率が計算されます。

    1. 10 分割交差検証を実行します。

    2. 交差検証で返されたスコアにシグモイド関数のパラメーターを当てはめます。

    3. 当てはめたシグモイド関数に交差検証スコアを入力することにより、事後確率を推定します。

  • ソフトウェアは学習時に、事前確率を SVM 目的関数に組み込みます。

  • SVM の場合、predictresubPredict は、スコアが最大になる (事後確率が最大になる) クラスに観測値を分類します。分類器の学習の前に、平均コスト補正の適用により誤分類コストが考慮されます。つまり、クラスの事前確率のベクトル P、誤分類コスト行列 C、および観測値の重みのベクトル w に対して、次の条件を満たすように新しい観測値の重みのベクトル (W) が定義されます。

    Wj=wjPjk=1KCjk.

代替機能

Simulink ブロック

Simulink® に SVM 分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationSVM Predict ブロックを使用するか、MATLAB Function ブロックを関数 predict と共に使用します。例については、ClassificationSVM Predict ブロックの使用によるクラス ラベルの予測MATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。

使用するアプローチを判断する際は、以下を考慮してください。

  • Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。

  • MATLAB Function ブロックを関数 predict と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。

  • MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。

参照

[1] Platt, J. “Probabilistic outputs for support vector machines and comparisons to regularized likelihood methods.” Advances in Large Margin Classifiers. MIT Press, 1999, pages 61–74.

拡張機能

バージョン履歴

R2014a で導入