ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

fitcsvm

二項サポート ベクター マシン分類器の学習

構文

  • SVMModel = fitcsvm(X,Y)
  • SVMModel = fitcsvm(X,Y,Name,Value)

説明

SVMModel = fitcsvm(X,Y)サポート ベクター マシン分類器 SVMModel を返します。この分類器には、予測子 X およびクラス ラベル Y により、1 クラスまたは 2 クラス分類の学習が行われています。

SVMModel = fitcsvm(X,Y,Name,Value) では、1 つ以上の Name,Value の引数ペアで指定された追加オプションを使用して、サポート ベクター マシン分類器が返されます。

たとえば、交差検定の種類、誤分類のコスト、スコア変換関数の種類を指定できます。

すべて折りたたむ

サポート ベクター マシン分類器の学習

フィッシャーのアヤメのデータセットを読み込みます。がく片の長さと幅および観測済みのすべての setosa を削除します。

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

処理済みのデータセットを使用して SVM 分類器に学習させます。

SVMModel = fitcsvm(X,y)
SVMModel = 

  ClassificationSVM
      PredictorNames: {'x1'  'x2'}
        ResponseName: 'Y'
          ClassNames: {'versicolor'  'virginica'}
      ScoreTransform: 'none'
     NumObservations: 100
               Alpha: [24x1 double]
                Bias: -14.4149
    KernelParameters: [1x1 struct]
      BoxConstraints: [100x1 double]
     ConvergenceInfo: [1x1 struct]
     IsSupportVector: [100x1 logical]
              Solver: 'SMO'


コマンド ウィンドウに、SVMModel は学習済みの ClassificationSVM 分類器およびプロパティ リストであることが示されます。SVMModel のプロパティを表示します。これにより、たとえばドット表記を使用してクラスの順序を確認できます。

classOrder = SVMModel.ClassNames
classOrder = 

    'versicolor'
    'virginica'

最初のクラス ('versicolor') は陰性のクラスで、2 番目のクラス ('virginica') は陽性のクラスです。'ClassNames' 名前と値のペアの引数を使用すると、学習中にクラスの順序を変更できます。

データの散布図をプロットし、サポート ベクトルを円で囲みます。

sv = SVMModel.SupportVectors;
figure
gscatter(X(:,1),X(:,2),y)
hold on
plot(sv(:,1),sv(:,2),'ko','MarkerSize',10)
legend('versicolor','virginica','Support Vector')
hold off

サポート ベクトルは、推定されたクラス境界の上または外側で発生する観測値です。

'BoxConstraint' 名前と値のペアの引数を使用して学習中にボックス制約を設定すると、境界 (とサポート ベクトルの数) を調整できます。

SVM 分類器の学習と交差検定

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

load ionosphere
rng(1); % For reproducibility

放射基底関数を使用して SVM 分類器に学習させます。本ソフトウェアを使用してカーネル関数のスケール値を検出します。予測子の標準化をお勧めします。

SVMModel = fitcsvm(X,Y,'Standardize',true,'KernelFunction','RBF',...
    'KernelScale','auto');

SVMModel は学習させた ClassificationSVM 分類器です。

SVM 分類器の交差検定を実行します。既定では、10 分割交差検定が使用されます。

CVSVMModel = crossval(SVMModel);

CVSVMModelClassificationPartitionedModel 交差検定分類器です。

標本外誤判別率を推定します。

classLoss = kfoldLoss(CVSVMModel)
classLoss =

    0.0484

一般化率は約 5% です。

SVM および 1 クラス学習を使用した外れ値の検出

フィッシャーのアヤメのデータセットを読み込みます。花弁の長さと幅を削除します。すべてのアヤメを同じクラスとして扱います。

load fisheriris
X = meas(:,1:2);
y = ones(size(X,1),1);

処理済みのデータセットを使用して SVM 分類器に学習させます。観測値のうち 5% が外れ値であるとします。予測子の標準化をお勧めします。

rng(1);
SVMModel = fitcsvm(X,y,'KernelScale','auto','Standardize',true,...
    'OutlierFraction',0.05);

SVMModel は学習させた ClassificationSVM 分類器です。既定では、1 クラス学習にはガウス カーネルが使用されます。

観測値と判定境界をプロットします。サポート ベクトルと外れ値の可能性がある値にフラグを設定します。

svInd = SVMModel.IsSupportVector;
h = 0.02; % Mesh grid step size
[X1,X2] = meshgrid(min(X(:,1)):h:max(X(:,1)),...
    min(X(:,2)):h:max(X(:,2)));
[~,score] = predict(SVMModel,[X1(:),X2(:)]);
scoreGrid = reshape(score,size(X1,1),size(X2,2));

figure
plot(X(:,1),X(:,2),'k.')
hold on
plot(X(svInd,1),X(svInd,2),'ro','MarkerSize',10)
contour(X1,X2,scoreGrid)
colorbar;
title('{\bf Iris Outlier Detection via One-Class SVM}')
xlabel('Sepal Length (cm)')
ylabel('Sepal Width (cm)')
legend('Observation','Support Vector')
hold off

外れ値と他のデータとの境界は、等高線値が 0 である場所で発生します。

交差検定データで負のスコアをもつ観測値のごく一部が、約 5% であることを確認します。

CVSVMModel = crossval(SVMModel);
[~,scorePred] = kfoldPredict(CVSVMModel);
outlierRate = mean(scorePred<0)
outlierRate =

    0.0467

二項 SVM を使用した複数クラス境界の検出

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

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 (cm)');
ylabel('Petal Width (cm)');
legend('Location','Northwest');
lims = get(gca,{'XLim','YLim'}); % Extract the _x_ and _y_ axis limits

3 つのクラスがあり、そのうち 1 つは他のクラスから線形分離可能です。

各クラスに対して、以下を実行します。

  1. 観測値がクラスのメンバーであるかどうかを示す論理ベクトル (indx) を作成します。

  2. 予測子データと indx を使用して SVM 分類器に学習させます。

  3. 分類器をセル配列のセルに保存します。

% It is good practice to define the class order and standardize the
% predictors.
SVMModels = cell(3,1);
classes = unique(Y);
rng(1); % For reproducibility

for j = 1:numel(classes);
    indx = strcmp(Y,classes(j)); % Create binary classes for each classifier
    SVMModels{j} = fitcsvm(X,indx,'ClassNames',[false true],'Standardize',true,...
        'KernelFunction','rbf','BoxConstraint',1);
end

SVMModels は 3 行 1 列のセル配列です。ここで、各セルには ClassificationSVM 分類器が格納されています。各セルで、陽性のクラスはそれぞれ setosa、versicolor、virginica です。

プロット内で細かいグリッドを定義し、座標を学習データの分布からの新しい観測値として扱います。各分類器を使用して、この新しい測定値のスコアを推定します。

d = 0.02;
[x1Grid,x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)),...
    min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];
N = size(xGrid,1);
Scores = zeros(N,numel(classes));

for j = 1:numel(classes);
    [~,score] = predict(SVMModels{j},xGrid);
    Scores(:,j) = score(:,2); % Second column contains positive-class scores
end

Scores の各行には 3 つのスコアが格納されています。スコアが最大の要素のインデックスは、新しいクラスの観測値の所属先となる可能性が最も高いと思われるクラスのインデックスです。

新しいそれぞれの観測値を、当該の観測値に最大スコアを設定する分類器に関連付けます。

[~,maxScore] = max(Scores,[],2);

プロットの各領域の色は、対応する新しい観測値が属するクラスに基づいています。

figure
h(1:3) = gscatter(xGrid(:,1),xGrid(:,2),maxScore,...
    [0.1 0.5 0.5; 0.5 0.1 0.5; 0.5 0.5 0.1]);
hold on
h(4:6) = gscatter(X(:,1),X(:,2),Y);
title('{\bf Iris Classification Regions}');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
legend(h,{'setosa region','versicolor region','virginica region',...
    'observed setosa','observed versicolor','observed virginica'},...
    'Location','Northwest');
axis tight
hold off

関連する例

入力引数

すべて折りたたむ

X — 予測子データ数値の行列

SVM 分類器に学習させる予測子データ。数値の行列として指定します。

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

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

次の操作をお勧めします。

  • KFold 名前と値のペアの引数による交差検定。この交差検定の結果により、SVM 分類器の一般化の精度がわかります。

  • Standardize 名前と値のペアの引数による予測子変数の標準化。

予測子の名前を X に表示される順序で指定するには、PredictorNames 名前と値のペアの引数を使用します。

データ型: double | single

Y — クラス ラベルカテゴリカル配列 | 文字配列 | 論理ベクトル | 数値のベクトル | 文字列のセル配列

SVM 分類器に学習させるクラス ラベル。カテゴリカル配列または文字配列、論理ベクトルまたは数値ベクトル、または文字列のセル配列として指定します。

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

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

ClassNames 名前と値のペアの引数を使用してクラスの順序を指定することをお勧めします。

応答変数名を指定するには、ResponseName 名前と値のペアの引数を使用します。

名前/値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: 'KFold',10,'Cost',[0 2;1 0],'ScoreTransform','sign' は、10 分割交差検定を実行し、偽陰性と比較して偽陽性に 2 倍のペナルティを適用し、関数 sign を使用してスコアを変換するよう指定します。

'Alpha' — アルファ係数の初期推定値非負の実数値のベクトル。

アルファ係数の初期推定値。'Alpha' と非負の実数値のベクトルで構成されるコンマ区切りのペアとして指定します。Alpha の長さは X の行数と等価でなければなりません。

  • Alpha の各要素は X の観測値に対応します。

  • AlphaNaN を格納できません。

  • Alpha と交差検定の名前と値のペアの引数 ('CrossVal''CVPartition''Holdout''KFold' または 'Leaveout') のいずれかを指定すると、エラーが返されます。

既定値は以下のとおりです。

  • 1 クラス学習の場合: 0.5*ones(size(X,1),1)

  • 2 クラス学習の場合: zeros(size(X,1),1)

例: 'Alpha',0.1*ones(size(X,1),1)

データ型: double | single

'BoxConstraint' — ボックス制約1 (既定値) | 正のスカラー

ボックス制約'BoxConstraint' と正のスカラーで構成されるコンマ区切りペアとして指定します。

1 クラス学習の場合、ボックス制約は必ず 1 に設定されます。

例: 'BoxConstraint',100

データ型: double | single

'CacheSize' — キャッシュ サイズ1000 (既定値) | 'maximal' | 正のスカラー

キャッシュ サイズ。'CacheSize''maximal' または正のスカラーで構成されるコンマ区切りのペアとして指定します。

CacheSize'maximal' の場合、n 行 n 列のグラム行列を格納できるだけのディスク領域が確保されます。

CacheSize が正のスカラーの場合、分類器の学習のためディスク領域のうち CacheSize メガバイトが確保されます。

例: 'CacheSize','maximal'

データ型: double | char | single

'ClassNames' — クラス名カテゴリカル配列 | 文字配列 | 論理ベクトル | 数値のベクトル | 文字列のセル配列

クラス名。'ClassNames' と、カテゴリカルまたは文字配列、論理または数値ベクトル、文字列のセル配列のいずれかで構成されるコンマ区切りのペアとして指定します。ClassNamesY のデータ型を使用して設定しなければなりません。

既定値は、Y の各クラス名です。

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

ClassNames を使用してクラスを並べ替えたり、学習するクラスのサブセットを選択します。

例: 'ClassNames',logical([0,1])

'Cost' — 誤判別のコスト正方行列 | 構造体配列

誤判別のコスト。'Cost' と正方行列または構造体から構成されるコンマ区切りペアとして指定します。指定する項目によって、内容は次のように変わります。

  • 正方行列 Cost の場合、Cost(i,j) は、真のクラスが i である場合に、1 つのポイントをクラス j に分類するためのコストです。

  • 構造体 S の場合、次の 2 つのフィールドが必要となります。

    • S.ClassNames: Y と同じデータ型のクラス名を表す変数を含む。

    • S.ClassificationCosts。行と列の順序が S.ClassNames と同じコスト行列。

2 クラス学習の場合、コスト行列を指定すると、そのコスト行列で指定されているペナルティが組み込まれ、事前確率が更新されます。その後、コスト行列は既定の状態にリセットされます。詳細は、アルゴリズムを参照してください。

既定値は以下のとおりです。

  • 1 クラス学習では、Cost = 0 です。

  • 2 クラス学習では、i ~= j の場合は Cost(i,j) = 1i = j の場合は Cost(i,j) = 0 です。

例: 'Cost',[0,1;2,0]

データ型: double | single | struct

'CrossVal' — 交差検定分類器を学習させるためのフラグ'off' (既定値) | 'on'

交差検定決定木を学習させるためのフラグ。'Crossval' と文字列で構成されるコンマ区切りのペアとして指定します。

'on' を指定すると、10 の分割を使用して交差検定分類器の学習が実行されます。

'KFold''Holdout''Leaveout' または 'CVPartition' 名前と値のペアの引数のいずれかを使用してこの交差検定の設定をオーバーライドできます。

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

または、後で SVMModelcrossval に渡し、交差検定を実行します。

例: 'Crossval','on'

データ型: char

'CVPartition' — 交差検定分割[] (既定値) | cvpartition 分割オブジェクト

交差検定分割。'CVPartition'cvpartition により作成された cvpartition 分割オブジェクトで構成されるコンマ区切りのペアとして指定します。分割オブジェクトは交差検定のタイプおよび学習と検証セットのインデックス付けを指定します。

CVPartition を指定する場合、次のいずれも指定できません。HoldoutKFold または Leaveout

'DeltaGradientTolerance' — 勾配差分の許容誤差非負のスカラー

SMO (逐次最小最適化) または ISDA (反復単一データ アルゴリズム) により取得された上位の違反値と下位の違反値の間に存在する、勾配差分の許容誤差。'DeltaGradientTolerance' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。

DeltaGradientTolerance0 の場合、最適化収束を確認するために、勾配差分の許容誤差を使用しません。

既定値は以下のとおりです。

  • ソルバーが SMO の場合 (たとえば、'Solver','SMO' を設定した場合など) は 1e-3

  • ソルバーが ISDA の場合 (たとえば、'Solver','ISDA' を設定した場合など) は 0

例: 'DeltaGapTolerance',1e-2

データ型: double | single

'GapTolerance' — 実行可能性の差異の許容誤差0 (既定値) | 非負のスカラー

SMO または ISDA により取得された実行可能性の差異の許容誤差。'GapTolerance' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。

GapTolerance0 の場合、最適化収束の確認には、実行可能性の差異の許容誤差を使用しません。

例: 'GapTolerance',1e-2

データ型: double | single

'Holdout' — ホールドアウト検定のデータの小数部(0,1) の範囲のスカラー値

ホールドアウト検定のデータの小数部。'Holdout' と、(0,1) の範囲内のスカラー値で構成されるコンマ区切りのペアとして指定します。'Holdout',p を指定すると、次が実行されます。

  1. p*100% のデータを検証データとして無作為に予約し、残りのデータを使用してモデルを学習させる

  2. コンパクトな学習させたモデルを CVMdl.Trained に保存する

Holdout を指定する場合、次のいずれも指定できません。CVPartitionKFold または Leaveout

例: 'Holdout',0.1

データ型: double | single

'IterationLimit' — 数値最適化反復の最大回数1e6 (既定値) | 正の整数

数値最適化反復の最大回数。'IterationLimit' と正の整数値で構成されるコンマ区切りのペアとして指定します。

最適化ルーチンの収束が正常に行われたかにかかわらず、学習させた分類器が返されます。

例: 'IterationLimit',1e8

データ型: double | single

'KernelFunction' — カーネル関数文字列

グラム行列の計算に使用するカーネル関数。'KernelFunction' と文字列で構成されるコンマ区切りのペアとして指定します。

次の表は、カーネル関数の設定に使用できるオプションの一覧です。

説明
'gaussian' または 'rbf'ガウスまたは放射基底関数 (RBF) カーネル (1 クラス学習の場合の既定値)

G(x1,x2)=exp(x1x22)

'linear'線形カーネル (2 クラス学習の場合の既定値)

G(x1,x2)=x1x2

'polynomial'多項式カーネル。'PolynomialOrder',polyOrder を使用して多項式カーネルの順序 (polyOrder) を指定します。

G(x1,x2)=(1+x1x2)p

独自のカーネル関数を設定することもできます。たとえば、'KernelFunction','kernel' を設定すると kernel が設定されます。この kernel は次の形式でなければなりません。

function G = kernel(U,V)
ここで、

  • U は、m 行 p 列の行列です。

  • V は、n 行 p 列の行列です。

  • G は、m 行 n 列で構成される、UV の行のグラム行列です。

kernel.m は、MATLAB® パス上になければなりません。

カーネル関数には一般的な名前を使用しないようにしてください。たとえば、シグモイド カーネル関数には 'sigmoid' ではなく 'mysigmoid' などの名前を使用します。

例: 'KernelFunction','gaussian'

データ型: char

'KernelOffset' — カーネル オフセット パラメーター非負のスカラー

カーネル オフセット パラメーター。'KernelOffset' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。

KernelOffsetグラム行列の各要素に追加されます。

既定値は以下のとおりです。

  • ソルバーが SMO の場合 (たとえば、'Solver','SMO' を設定した場合など) は 0

  • ソルバーが ISDA の場合 (たとえば、'Solver','ISDA' を設定した場合など) は 0.1

例: 'KernelOffset',0

データ型: double | single

'KernelScale' — カーネル スケール パラメーター1 (既定値) | 'auto' | 正のスカラー

カーネル スケール パラメーター。'KernelScale' と、'auto' または正のスカラーで構成される、コンマ区切りのペアとして指定します。

  • KernelFunction'gaussian' ('rbf')、'linear''polymonial' のいずれかである場合、予測子行列 X のすべての要素が KernelScale の値で除算されます。その後、適切なカーネル ノルムが適用され、グラム行列が計算されます。

  • 'auto' を指定すると、ヒューリスティックな手順によりスケール値が選択されます。ヒューリスティックな手順ではサブサンプルを使用します。そのため、結果を再現するには、分類器の学習の前に rng を使用して乱数シードを設定します。

  • KernelScale を指定し、さらに独自のカーネル関数を設定すると (たとえば、'KernelFunction','kernel' を使用して kernel を設定すると)、エラーが表示されます。kernel の内部でスケーリングを適用しなければなりません。

例: 'KernelScale',''auto'

データ型: double | single | char

'KFold' — 分割の数10 (既定値) | 正の整数値

交差検定分類器で使用する分割の数。'KFold' と正の整数値で構成されるコンマ区切りのペアとして指定します。

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

例: 'KFold',8

データ型: single | double

'KKTTolerance' — カルーシュ・キューン・タッカー相補性条件の違反許容誤差非負のスカラー

KKT (カルーシュ・キューン・タッカー) 相補性条件の違反許容誤差。'KKTTolerance' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。

KKTTolerance0 の場合、最適化収束の確認に実行可能性の KKT 相補性条件の違反許容誤差は使用されません。

既定値は以下のとおりです。

  • ソルバーが SMO の場合 (たとえば、'Solver','SMO' を設定した場合など) は 0

  • ソルバーが ISDA の場合 (たとえば、'Solver','ISDA' を設定した場合など) は 1e-3

例: 'KKTTolerance',1e-2

データ型: double | single

'Leaveout' — Leave-one-out 法の交差検定のフラグ'off' (既定値) | 'on'

Leave-one-out 法の交差検定のフラグ。'Leaveout''on' または 'off' で構成されるコンマ区切りのペアとして指定します。'on' を指定する場合、leave-one-out 法の交差検定が実行されます。

'Leaveout' を使用する場合は、'CVPartition''Holdout' または 'KFold' 名前と値のペアの引数のいずれも使用できません。

例: 'Leaveout','on'

データ型: char

'Nu' — 1 クラス学習の ν パラメーター0.5 (既定値) | 正のスカラー

1 クラス学習の ν パラメーター。'Nu' と正のスカラーで構成されるコンマ区切りのペアとして指定します。Nu0 より大きく、1 以下でなければなりません。

Nu の設定により、学習例の大部分を陽性のクラスにするか、スコア関数の重みを最小限にするかのバランスを制御します。

例: 'Nu',0.25

データ型: double | single

'NumPrint' — 最適化診断メッセージ出力の反復回数1000 (既定値) | 非負の整数

最適化診断メッセージ出力の反復回数。'NumPrint' と非負の整数で構成されるコンマ区切りのペアとして指定します。

'Verbose',1'NumPrint',numprint を使用すると、numprint 回反復するたびに SMO と ISDA からのすべての最適化診断メッセージがコマンド ウィンドウに表示されます。

例: 'NumPrint',500

データ型: double | single

'OutlierFraction' — 学習データで想定される外れ値の割合0 (既定値) | 非負のスカラー

学習データで想定される外れ値の割合。'OutlierFraction' と非負のスカラーで構成されるコンマ区切りのペアとして指定します。OutlierFraction0 以上 1 未満でなければなりません。

'OutlierFraction',outlierfraction (outlierfraction は 0 より大きい値) を設定すると、次のようになります。

  • 2 クラス学習では "ロバスト学習" が行われます。この方式では、最適化アルゴリズムが収束すると、観測値のうち 100*outlierfraction% が削除されます。削除された観測値は、勾配の大きいものに対応します。

  • 1 クラス学習では、学習セットに負のスコアをもつ観測 outlierfraction など、適切なバイアス項が検出されます。

例: 'OutlierFraction',0.01

データ型: double | single

'PolynomialOrder' — 多項式カーネル関数の順序3 (既定値) | 正の整数

多項式カーネル関数の順序。'PolynomialOrder' と正の整数値で構成されるコンマ区切りのペアとして指定します。

'PolynomialOrder' が設定されていて、KernelFunction'polynomial' でない場合、エラーが表示されます。

例: 'PolynomialOrder',2

データ型: double | single

'PredictorNames' — 予測子変数名{'x1','x2',...} (既定値) | 文字列のセル配列

予測子変数名。'PredictorNames' と、予測子変数名を含む文字列のセル配列で構成される、コンマ区切りのペアとして指定されます。予測子変数名は X と同じ順序で配列されます。

例: 'PredictorNames',{'PedalWidth','PedalLength'}

データ型: cell

'Prior' — 事前確率'empirical' (既定値) | 'uniform' | 数値ベクトル | 構造体

各クラスの事前確率。'Prior' と文字列、数値ベクトル、構造体のいずれかで構成されるコンマ区切りのペアとして指定します。

次の表は、事前確率の設定に使用できるオプションの一覧です。

説明
'empirical'クラスの事前確率は、Y のクラスの相対的頻度です。
'uniform'クラスの事前確率はいずれも 1/K (K はクラス数) となります。
数値ベクトル各要素はクラスの事前確率です。SVMModel.ClassNames に従って要素を並べ替えるか、ClassNames 名前と値のペアの引数を使用して順序を指定します。要素は合計が 1 になるように正規化されます。
構造体

構造体 S には 2 つのフィールドがあります。

  • S.ClassNames: Y と同じ型の変数のクラス名が格納されます。

  • S.ClassProbs: 対応する事前確率のベクトルが格納されます。要素は合計が 1 になるように正規化されます。

2 クラス学習の場合、コスト行列を指定すると、そのコスト行列で指定されているペナルティが組み込まれ、事前確率が更新されます。詳細は、アルゴリズムを参照してください。

例: struct('ClassNames',{{'setosa','versicolor'}},'ClassProbs',[1,2])

データ型: char | double | single | struct

'ResponseName' — 応答変数名'Y' (既定値) | 文字列

応答変数名。'ResponseName' と、応答変数 Y の名前が格納された文字列で構成される、コンマ区切りのペアとして指定します。

例: 'ResponseName','IrisType'

データ型: char

'ScoreTransform' — スコア変換関数'none' (既定値) | 'doublelogit' | 'invlogit' | 'ismax' | 'logit' | 'sign' | 'symmetric' | 'symmetriclogit' | 'symmetricismax' | 関数ハンドル

スコア変換関数。'ScoreTransform' と文字列または関数ハンドルで構成されるコンマ区切りペアとして指定します。

  • 値が文字列の場合、この文字列が組み込み関数に対応していなければなりません。次の表は、使用可能な組み込み関数の一覧です。

    文字列
    'doublelogit'1/(1 + e–2x)
    'invlogit'log(x / (1–x))
    'ismax'最大のスコアをもつクラスのスコアを 1 に設定し、それ以外のクラスのスコアを 0 に設定します。
    'logit'1/(1 + e–x)
    'none'x (変換なし)
    'sign'x < 0 のとき –1
    x = 0 のとき 0
    x > 0 のとき 1
    'symmetric'2x – 1
    'symmetriclogit'2/(1 + e–x) – 1
    'symmetricismax'最大のスコアをもつクラスのスコアを 1 に設定し、それ以外のクラスのスコアを -1 に設定します。

  • MATLAB 関数やユーザー定義関数の場合は、関数ハンドルを入力します。

    SVMModel.ScoreTransform = @function;

    function は行列 (元のスコア) を受け入れ、同じサイズの行列 (変換されたスコア) を返さなければなりません。

例: 'ScoreTransform','sign'

データ型: char | function_handle

'ShrinkagePeriod' — アクティブ セットから非アクティブ セットへの観測値の移動の反復回数0 (既定値) | 非負の整数

アクティブ セットから非アクティブ セットへの観測値が移動する反復回数。'ShrinkagePeriod' と非負の整数で構成されるコンマ区切りのペアとして指定します。

'ShrinkagePeriod',0 を設定すると、アクティブ セットは縮小されません。

例: 'ShrinkagePeriod',1000

データ型: double | single

'Solver' — 最適化ルーチン'ISDA' | 'L1QP' | 'SMO'

最適化ルーチン。文字列として指定します。

次の表は、最適化ルーチンに使用できるオプションの一覧です。

説明
'ISDA'反復単一データ アルゴリズム
'L1QP'quadprog を使用して二次計画法による L1 ソフト マージン最小化を実装します。このオプションには Optimization Toolbox™ ライセンスが必要です。
'SMO'逐次最小最適化

既定値は以下のとおりです。

  • 'OutlierFraction' を 2 クラス学習用の正の値に指定した場合は 'ISDA'

  • それ以外の場合は 'SMO'

例: 'Solver','ISDA'

データ型: char

'Standardize' — 予測子を標準化するためのフラグfalse (既定値) | true

予測子を標準化するためのフラグ。'Standardize' と、true (1) または false (0) のいずれかで構成される、コンマ区切りのペアとして指定します。

'Standardize',true を設定すると、予測子データ (X) の各列のセンタリングとスケーリングを、それぞれ列の平均値と標準偏差を使用して行います。予測子データの標準化をお勧めします。

例: 'Standardize',true

データ型: logical

'Verbose' — 詳細レベル0 (既定値) | 1 | 2

詳細レベル。'Verbose' と、012 のいずれかで構成される、コンマ区切りのペアとして指定します。Verbose により、コマンド ウィンドウに表示されて構造体として SVMModel.ConvergenceInfo.History に保存される最適化情報の量が制御されます。

次の表は、使用できる詳細レベル オプションの一覧です。

説明
0収束情報の表示や保存は行われません。
1診断メッセージが表示され、numprint 回の反復ごとに収束条件が保存されます。ここで、numprint は名前と値のペアの引数 'NumPrint' の値です。
2診断メッセージが表示され、1 回の反復ごとに収束条件が保存されます。

例: 'Verbose',1

データ型: double | single

'Weights' — 観測値の重みones(size(X,1),1) (既定値) | 数値ベクトル

観測値の重み。'Weights' と数値ベクトルで構成されるコンマ区切りのペアとして指定します。

Weights のサイズは X の行数と等しくなければなりません。X の各行の観測値では、Weights の対応する重みを使用して重み付けがされます。

合計が各クラスの事前確率の値と等しくなるように Weights が正規化されます。

データ型: double | single

出力引数

すべて折りたたむ

SVMModel — 学習させた SVM 分類器ClassificationSVM 分類器 | ClassificationPartitionedModel 交差検定分類器

学習させた分類器。ClassificationSVM 分類器または ClassificationPartitionedModel 交差検定分類器として返します。

以下の各名前と値のペアの引数のいずれかを設定する場合、SVMModelClassificationPartitionedModel 交差検定分類器となります。KFoldHoldoutLeaveoutCrossVal または CVPartition。それ以外の場合、SVMModelClassificationSVM 分類器です。

SVMModel のプロパティを参照するには、ドット表記を使用します。たとえば、コマンド ウィンドウに SVMModel.Alpha と入力すると、学習させたラグランジュ乗数が表示されます。

制限

  • 1 クラスまたは 2 クラス学習アプリケーション用に SVM 分類器の学習が実行されます。

詳細

すべて折りたたむ

ボックス制約

マージンに違反している観測に課せられる最大ペナルティを制御し、過剰適合防止 (正則化) を促進するためのパラメーター。

ボックス制約の値を大きくすると、SVM 分類器が割り当てるサポート ベクトルは少なくなります。ただし、ボックス制約の値を大きくすると、学習時間が長くなる場合があります。

グラム行列

n 個のベクトルの組 {x1,..,xn; xj ∊ Rp} のグラム行列とは、n 行 n 列の行列で、要素 (j,k) は G(xj,xk) = <ϕ(xj),ϕ(xk)> (カーネル関数 ϕ を使用して変換された予測子の内積) として定義されます。

非線形 SVM の場合、アルゴリズムにより予測子行列の列を使用してグラム行列が形成されます。双対形式化により、予測子の内積が、形成されるグラム行列の対応する要素に置き換えられます (「カーネル トリック」と呼ばれます)。その後、非線形 SVM は変換された予測子空間で分離超平面を検出します。

カルーシュ・キューン・タッカー相補性条件

KKT 相補性条件は、最適な非線形計画法の解決に必要な最適化制約です。

SVM では、KKT 相補性条件はすべての j = 1,...,n に対して次のようになります。

{αj[yj(wϕ(xj)+b)1+ξj]=0ξj(Cαj)=0

ここで、wj は重み、ϕ はカーネル関数 (「グラム行列」を参照してください)、ξj はスラック変数です。クラスが完全に分離可能な場合、すべての j = 1,...,n に対して ξj = 0 となります。

1 クラス学習

1 クラス学習 (教師なし SVM) は、高次元の予測子空間 (元の予測子空間ではありません) からデータを分離するためのもので、外れ値の検出に使用するアルゴリズムです。

このアルゴリズムは「バイナリ分類の SVM」 のアルゴリズムと類似しています。このアルゴリズムは、双対式

0.5jkαjαkG(xj,xk)

α1,...,αn について最小化することです。ここで、すべての j = 1、...、n について

αj=nν

かつ 0αj1 であることが条件となります。G(xj,xk,) は「グラム行列」の要素 (j,k) です。

ν の値が小さいとサポート ベクトルは少なくなり、そのため判定境界は起伏が少なく柔軟性が低いものとなります。ν の値が大きいとサポート ベクトルは多くなり、そのため判定境界は起伏が多く柔軟性が高いものとなります。ν の最適値は、データの複雑さを取得できるだけの大きさがあり、過学習が発生しない程度に小さい値です。また、0 < ν ≤ 1 です。

詳細は、「[3]」を参照してください。

サポート ベクトル

サポート ベクトルは、α1,...,αn の厳密に正の推定値に対応する観測値です。

特定の学習に対して生成されるサポート ベクトルが少ない SVM 分類器の方が推奨されます。

バイナリ分類のサポート ベクター マシン

SVM バイナリ分類アルゴリズムでは、データを 2 つのクラスに分離する最適超平面が検索されます。クラスが分離可能な場合、最適超平面は周囲の "マージン" (観測値がない領域) を最大化します。これにより、陽性のクラスと陰性のクラスの境界が作成されます。クラスが分離可能でない場合でも目的は同じですが、クラスの境界の誤った側にあるすべての観測のマージンの長さに対し、アルゴリズムによりペナルティが課されます。

線形 SVM スコア関数は次のとおりです。

f(x)=xβ+β0,

ここで、以下のようになります。

  • x は観測値です (X の行に対応します)。

  • ベクトル β には超平面に直交するベクトルを定義する係数 (SVMModel.Beta に対応) が含まれています。分離可能なデータでは、最適なマージンの長さは 2/β. です。

  • β0 はバイアス項です (SVMModel.Bias に対応)。

特定の係数に対する f(x) の根により超平面が定義されます。特定の超平面について、f(z) は点 z から超平面までの距離です。

SVM 分類器はマージンの長さの最大値を検索し、その一方で陽性のクラス (y = 1) の観測値と陰性のクラス (y = –1) の観測値は分離されたままにします。したがって、

  • クラスが分離可能な場合、目的は β を β および β0 に関して最小化することです。ここで、すべての j = 1、...、n に対して yjf(xj) ≥ 1 であることが条件となります。これが分離可能なクラスに対する "主" 形成化となります。

  • クラスが分離可能でない場合、SVM はスラック変数 (ξj) を使用して、クラスのマージン境界を超過する観測値について目的関数を抑制します。クラスのマージン境界を超過しない観測値については ξj = 0 となり、それ以外の場合は ξj ≥ 0 となります。

    目的は 0.5β2+Cξj を β、β0 および ξj に関して最小化することです。ここで、すべての j = 1、...、n と、正のスカラー 「ボックス制約」 C に対して yjf(xj)1ξj および ξj0 であることが条件となります。これが分離可能でないクラスに対する主形成化となります。

SVM ではラグランジュ乗数を使用して目的を最適化します。これにより、n 個の係数 α1、...、αn (SVMModel.Alpha に対応) が導入されます。線形 SVM の双対形式化には、次のようなものがあります。

  • クラスが分離可能な場合、

    0.5j=1nk=1nαjαkyjykxjxkj=1nαj

    を α1、...、αn に関して最小化します。ここで、すべての j = 1、...、n について αjyj=0 かつ αj ≥ 0 であることが条件となり、さらに 「KKT (カルーシュ・キューン・タッカー) 相補性条件」 が適用されます。

  • クラスが分離可能でない場合でも、目的は分離可能なクラスと同じですが、さらにすべての j = 1、...、n について 0αjC であることが条件として追加されます。

この結果生成されるスコア関数は次のようになります。

f(x)=j=1nα^jyjxxj+b^.

主形成化の結果、このスコア関数には β の推定はありません。

場合によっては、クラスを分離する非線形境界が存在します。"非線形 SVM" は変換済み予測子空間で、最適な分離超平面を検索します。

非線形 SVM での双対形式化は、α1、...、αn に関する

0.5j=1nk=1nαjαkyjykG(xj,xk)j=1nαj

です。ここで、すべての j = 1、...、n について αjyj=0 かつ 0αjC であることが条件となり、さらに KKT 相補性条件が適用されます。G(xk,xj) は 「グラム行列」の要素です。この結果生成されるスコア関数は次のようになります。

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

詳細は、「サポート ベクター マシンについて」「[1]」および「[2]」を参照してください。

ヒント

  • 1 クラス学習では、以下のようになります。

    • 名前と値のペアの引数 'Alpha' で既定の設定を使用すると、学習時間が長くなる場合があります。学習時間を短縮するには、主に 0 で構成されているベクトルに Alpha を設定します。

    • 名前と値のペアの引数 Nu0 に近い値に設定すると、サポート ベクトルの数は少なくなり、そのため判定境界は起伏が少なく柔軟性が低いものになります。

  • SVM 分類器では、サポート ベクトルの密度が低い方が望ましい状態です。サポート ベクトルの数を少なくするには、BoxConstraint を大きい値に設定します。この場合、学習時間も長くなります。

  • データセットが大きい場合、キャッシュ サイズを最適化してください。この処理は学習速度に大きく影響します。

  • 設定されたサポート ベクトルの数が学習セットの観測値の数よりはるかに少ない場合、名前と値のペアの引数 'ShrinkagePeriod' を使用してアクティブ セットを縮小し、収束速度を大幅に上げることができます。'ShrinkagePeriod',1000 の使用をお勧めします。

アルゴリズム

  • どのソルバーも L1 ソフト マージン最小化を実行します。

  • fitcsvmsvmtrain は最適化に SMO アルゴリズムを使用します。2 つの関数の間で SMO の実行方式は異なりますが、数値を調べると結果には明確な一致があることがわかります。

  • 1 クラス学習では、次の条件を満たすラグランジュ乗数 (α1,...,αn) が推定されます。

    j=1nαj=nν.

  • 2 クラス学習の場合、コスト行列 C を指定すると、C で指定されているペナルティが組み込まれ、クラスの事前確率 (p) が pc に更新されます。更新後の事前確率ベクトルの公式は次のようになります。

    pc=pCpC.

    その後、コスト行列は既定の設定にリセットされます。

    C=[0110].

  • fitcsvm を使用して SVM 分類器を学習させる際に 'Standardize',true を設定すると、標準化された予測子行列を使用して分類器の学習が行われますが、標準化されていないデータは分類器の X プロパティに保存されます。ただし、データを標準化すると、最適化が終了するまでメモリのデータ サイズは 2 倍になります。

  • 'Standardize',true および 'Cost''Prior' または 'Weights' のいずれかを設定する場合、予測子は対応する加重平均と加重標準偏差を使用して標準化されます。

  • p は学習データで想定される外れ値の割合です。fitcsvm を使用して SVM 分類器を学習させる際に 'OutlierFraction',p を使用すると、次のようになります。

    • 1 クラス学習では、バイアス項の学習により、学習データの観測値のうち 100p% が負のスコアをもつようになります。

    • 2 クラス学習では "ロバスト学習" が行われます。この方式では、最適化アルゴリズムが収束すると、観測値のうち 100p% の削除が試行されます。削除された観測値は、勾配の大きいものに対応します。

参照

[1] Christianini, N., and J. C. Shawe-Taylor. An Introduction to Support Vector Machines and Other Kernel-Based Learning Methods. Cambridge, UK: Cambridge University Press, 2000.

[2] Hastie, T., R. Tibshirani, and J. Friedman. The Elements of Statistical Learning, Second Edition. NY: Springer, 2008.

[3] Scholkopf, B., J. C. Platt, J. C. Shawe-Taylor, A. J. Smola, and R. C. Williamson. “Estimating the Support of a High-Dimensional Distribution.” Neural Comput., Vol. 13, Number 7, 2001, pp. 1443–1471.

[4] Scholkopf, B., and A. Smola. Learning with Kernels: Support Vector Machines, Regularization, Optimization and Beyond, Adaptive Computation and Machine Learning. Cambridge, MA: The MIT Press, 2002.

この情報は役に立ちましたか?