メインコンテンツ

ocsvm

異常検出用の 1 クラス サポート ベクター マシン (SVM) モデルの当てはめ

R2022b 以降

説明

関数 ocsvm は、外れ値の検出と新規性の検出のための 1 クラス サポート ベクター マシン (SVM) モデルの当てはめに使用します。

  • 外れ値検出 (学習データ中の異常を検出) — ocsvm の出力引数 tf を使用して、学習データ中の異常を検出します。

  • 新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を ocsvm に渡して OneClassSVM オブジェクトを作成します。そのオブジェクトと新規データをオブジェクト関数 isanomaly に渡して、新規のデータの異常を検出します。

Mdl = ocsvm(Tbl) は、table Tbl の予測子データに対する OneClassSVM オブジェクト (1 クラス SVM モデル オブジェクト) を返します。

Mdl = ocsvm(X) は、行列 X の予測子データを使用します。

Mdl = ocsvm(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、ContaminationFraction=0.1 は、学習データの 10% を異常として処理するように関数に指示します。

[Mdl,tf] = ocsvm(___) は、Tbl または X の対応する行で異常が検出された場合に要素が true になる logical 配列 tf も返します。

[Mdl,tf,scores] = ocsvm(___) は、Tbl または X の各観測値についての範囲 (–inf,inf) の異常スコアも返します。振幅が大きな負のスコア値は正常な観測値を示し、大きい正の値は異常を示します。

すべて折りたたむ

関数 ocsvm を使用して、外れ値 (学習データ中の異常) を検出します。

標本データ セット NYCHousing2015 を読み込みます。

load NYCHousing2015

データ セットには、2015 年のニューヨーク市における不動産の売上に関する情報を持つ 10 の変数が含まれます。データ セットの概要を表示します。

summary(NYCHousing2015)
double

        Values:

            Min          1    
            Median       3    
            Max          5    

    NEIGHBORHOOD: 91446×1 cell array of character vectors

    BUILDINGCLASSCATEGORY: 91446×1 cell array of character vectors

    RESIDENTIALUNITS: 91446×1 double

        Values:

            Min            0  
            Median         1  
            Max         8759  

    COMMERCIALUNITS: 91446×1 double

        Values:

            Min           0   
            Median        0   
            Max         612   

    LANDSQUAREFEET: 91446×1 double

        Values:

            Min                0
            Median          1700
            Max       2.9306e+07

    GROSSSQUAREFEET: 91446×1 double

        Values:

            Min                0
            Median          1056
            Max       8.9422e+06

    YEARBUILT: 91446×1 double

        Values:

            Min            0  
            Median      1939  
            Max         2016  

    SALEPRICE: 91446×1 double

        Values:

            Min                0
            Median    3.3333e+05
            Max       4.1111e+09

    SALEDATE: 91446×1 datetime

        Values:

            Min       01-Jan-2015
            Median    09-Jul-2015
            Max       31-Dec-2015

SALEDATE 列は datetime 配列です。ocsvm ではサポートされていません。datetime 値の月番号および日番号用の列を作成し、SALEDATE 列を削除します。

[~,NYCHousing2015.MM,NYCHousing2015.DD] = ymd(NYCHousing2015.SALEDATE);
NYCHousing2015.SALEDATE = [];

NYCHousing2015 用に 1 クラス SVM モデルに学習させます。学習観測値に含まれている異常の比率を 0.1 に指定し、最初の変数 (BOROUGH) をカテゴリカル予測子として指定します。最初の変数は数値配列であるため、この変数をカテゴリカル変数として指定しない限り、ocsvm により連続変数であると仮定されます。また、予測子によってスケールが大きく異なるため、StandardizeDatatrue に指定して入力データを標準化します。ヒューリスティック手法を使用して適切なカーネル スケール パラメーターが選択されるように、KernelScale"auto" に設定します。

rng("default") % For reproducibility 
[Mdl,tf,scores] = ocsvm(NYCHousing2015,ContaminationFraction=0.1, ...
    CategoricalPredictors=1,StandardizeData=true, ...
    KernelScale="auto");

MdlOneClassSVM オブジェクトです。ocsvm は、学習データ NYCHousing2015 の異常インジケーター (tf) および異常スコア (scores) も返します。

スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。

histogram(scores)
xline(Mdl.ScoreThreshold,"r-",["Threshold" Mdl.ScoreThreshold])

Figure contains an axes object. The axes object contains 2 objects of type histogram, constantline.

異なる汚染の比率 (たとえば 0.01) で異常を識別する場合は、新しい 1 クラス SVM モデルに学習させることができます。

rng("default") % For reproducibility 
[newMdl,newtf,scores] = ocsvm(NYCHousing2015, ...
    ContaminationFraction=0.01,CategoricalPredictors=1, ...
    KernelScale="auto");

異なるスコアのしきい値 (たとえば -0.7) で異常を識別する場合は、OneClassSVM オブジェクト、学習データ、および新しいしきい値を関数 isanomaly に渡せます。

[newtf,scores] = isanomaly(Mdl,NYCHousing2015,ScoreThreshold=-0.7);

汚染の比率またはスコアのしきい値を変更すると異常インジケーターのみが変更され、異常スコアは影響を受けないことに注意してください。したがって、ocsvm または isanomaly を使用して異常スコアを再度計算しない場合、既存のスコア値で新しい異常インジケーターを取得できます。

学習データ中の異常の比率を 0.01 に変更します。

newContaminationFraction = 0.01;

関数quantileを使用して、新しいスコアのしきい値を求めます。

newScoreThreshold = quantile(scores,1-newContaminationFraction)
newScoreThreshold = -0.3745

新しい異常インジケーターを取得します。

newtf = scores > newScoreThreshold;

関数 ocsvm を使用して、汚染されていない学習観測値用の OneClassSVM オブジェクトを作成します。次に、オブジェクトおよび新規データをオブジェクト関数 isanomaly に渡して、新規性 (新規データ中の異常) を検出します。

census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。

load census1994

census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。

ocsvm は、欠損値のある観測値は使用しません。データ セットの欠損値を削除すると、メモリ消費が減って学習が高速化します。

adultdata = rmmissing(adultdata);
adulttest = rmmissing(adulttest);

adultdata 用に 1 クラス SVM に学習させます。adultdata には外れ値が含まれていないと仮定します。StandardizeDatatrue に指定して入力データを標準化し、KernelScale"auto" に設定して、関数でヒューリスティック手法を使用して適切なカーネル スケール パラメーターを選択できるようにします。

rng("default") % For reproducibility
[Mdl,~,s] = ocsvm(adultdata,StandardizeData=true,KernelScale="auto");

Mdl は、OneClassSVM オブジェクトです。名前と値の引数 ContaminationFraction を 0 を超える値として指定していない場合、ocsvm はすべての学習観測値を正常な観測値として扱います。この関数によりスコアのしきい値が最大のスコア値に設定されます。しきい値を表示します。

Mdl.ScoreThreshold
ans = 
0.0322

学習済みの 1 クラス SVM モデルを使用して、adulttest 内の異常を見つけます。モデルに学習させるときに StandardizeData=true を指定したため、関数 isanomaly は、Mu プロパティと Sigma プロパティに格納されている学習データの予測子の平均と標準偏差をそれぞれ使用して入力データを標準化します。

[tf_test,s_test] = isanomaly(Mdl,adulttest);

関数 isanomaly は、adulttest の異常インジケーター tf_test およびスコア s_test を返します。既定では、isanomaly はしきい値 (Mdl.ScoreThreshold) を超えるスコアをもつ観測値を異常として識別します。

異常スコア s および s_test のヒストグラムを作成します。異常スコアのしきい値に垂直線を作成します。

h1 = histogram(s,NumBins=50,Normalization="probability");
hold on
h2 = histogram(s_test,h1.BinEdges,Normalization="probability");
xline(Mdl.ScoreThreshold,"r-",join(["Threshold" Mdl.ScoreThreshold]))
h1.Parent.YScale = 'log';
h2.Parent.YScale = 'log';
legend("Training Data","Test Data",Location="north")
hold off

Figure contains an axes object. The axes object contains 3 objects of type histogram, constantline. These objects represent Training Data, Test Data.

テスト データ中にある異常の観測値のインデックスを表示します。

find(tf_test)
ans =

  0×1 empty double column vector

テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly は既定のしきい値でテスト データ中にある異常を検出しません。名前と値のペア ScoreThreshold を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。

入力引数

すべて折りたたむ

予測子データ。table として指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

Tbl 内の変数のサブセットを使用するには、名前と値の引数 PredictorNames を使用して変数を指定します。

データ型: table

予測子データ。数値行列として指定します。X の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。

名前と値の引数 PredictorNames を使用して X 内の予測子変数に名前を割り当てることができます。

データ型: single | double

名前と値の引数

すべて展開する

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

例: NumExpansionDimensions=2^15,KernelScale="auto" は、ヒューリスティック手法により選択されたカーネル スケール パラメーターによる特徴量拡張を使用して、予測子データを 2^15 次元空間にマッピングします。

異常検出オプション

すべて展開する

学習データに含まれている異常の比率。範囲 [0,1] の数値スカラーとして指定します。

  • ContaminationFraction の値が 0 (既定) の場合、ocsvm はすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (MdlScoreThreshold プロパティの値) を scores の最大値に設定します。

  • ContaminationFraction の値が範囲 (0,1] にある場合、ocsvm は指定された比率の学習観測値が異常として検出されるようにしきい値を決定します。

例: ContaminationFraction=0.1

データ型: single | double

カーネル分類のオプション

すべて展開する

割り当てられたメモリの最大容量 (メガバイト)。正のスカラーとして指定します。

変換後の予測子データを保持するために ocsvm で必要となるメモリが BlockSize の値より多い場合、ブロック単位方式が使用されます。ブロック単位方式の詳細については、アルゴリズムを参照してください。

例: BlockSize=1e4

データ型: single | double

カーネル スケール パラメーター。"auto" または正のスカラーとして指定します。カーネル スケール パラメーターを使用して、ランダムな特徴量拡張用のランダムな基底が取得されます。詳細については、ランダムな特徴量拡張を参照してください。

"auto" を指定した場合、ヒューリスティック手法を使用して適切なカーネル スケール パラメーターが選択されます。このヒューリスティック手法では副標本抽出を使用するので、呼び出すたびに推定値が変化する可能性があります。このため、結果を再現するには、学習の前に rng を使用して乱数シードを設定します。

例: KernelScale="auto"

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

正則化項の強度。"auto" または非負のスカラーを指定します。

"auto" を指定した場合、ヒューリスティック手法を使用して適切な正則化パラメーターが選択されます。

例: Lambda=0.01

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

拡張空間の次元数。"auto" または正の整数を指定します。

"auto" を指定した場合、ヒューリスティック手法を使用して適切な次元数が選択されます。

例: NumExpansionDimensions=2^15

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

データ変換の再現性を得るための乱数ストリーム。乱数ストリーム オブジェクトとして指定します。詳細については、ランダムな特徴量拡張を参照してください。

予測子データを高次元空間に変換するために ocsvm で使用されるランダムな基底関数を再現するには、RandomStream を使用します。詳細は、RandStream を使用したグローバル ストリームの管理乱数ストリームの作成と管理 を参照してください。

例: RandomStream=RandStream("mlfg6331_64")

その他の分類オプション

すべて展開する

カテゴリカル予測子のリスト。次の表のいずれかの値として指定します。

説明
正の整数のベクトル

ベクトルの各エントリは、対応する予測子がカテゴリカルであることを示すインデックス値です。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。

ocsvm が入力変数のサブセットを予測子として使用する場合、関数はサブセットのみを使用して予測子にインデックスを作成します。関数で使用されない変数は、CategoricalPredictors 値でカウントされません。

logical ベクトル

true というエントリは、対応する予測子がカテゴリカルであることを意味します。ベクトルの長さは p です。

文字行列行列の各行は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
文字ベクトルの cell 配列または string 配列配列の各要素は予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。
"all"すべての予測子がカテゴリカルです。

既定では、予測子データが table (Tbl) 内にある場合、ocsvm は、その変数が logical ベクトル、categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。予測子データが行列 (X) である場合、ocsvm はすべての予測子が連続的であると見なします。他の予測子をカテゴリカル予測子として指定するには、名前と値の引数 CategoricalPredictors を使用してそれらを指定します。

特定されたカテゴリカル予測子に対して、ocsvm はカテゴリカル変数に順序が設定されていないか順序が設定されているかに応じて、2 つの異なる方式を使用してダミー変数を作成します。順序付けのないカテゴリカル変数の場合、ocsvm は、そのカテゴリカル変数の各レベルについて 1 つずつダミー変数を作成します。順序付けされたカテゴリカル変数の場合、ocsvm は、カテゴリの数よりも 1 つ少ないダミー変数を作成します。詳細については、ダミー変数の自動作成を参照してください。

例: CategoricalPredictors="all"

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

この プロパティ は読み取り専用です。

予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames の機能は、予測子データの提供方法によって決まります。

  • Tbl を指定した場合、PredictorNames を使用して使用する予測子変数を指定できます。つまり、ocsvm は、PredictorNames の予測子変数のみを使用します。

    • PredictorNamesTbl.Properties.VariableNames のサブセットである必要があります。

    • 既定では、Tbl のすべての予測子変数の名前が PredictorNames に格納されます。

  • X を指定した場合、PredictorNames を使用して X 内の予測子変数に名前を割り当てることができます。

    • PredictorNames 内の名前の順序は、X の列の順序に一致しなければなりません。つまり、PredictorNames{1}X(:,1) の名前、PredictorNames{2}X(:,2) の名前であり、他も同様です。また、size(X,2)numel(PredictorNames) は等しくなければなりません。

    • 既定では PredictorNames{"x1","x2",...} です。

データ型: string | cell

予測子データを標準化するためのフラグ。数値または logical の 1 (true) または 0 (false) として指定します。

StandardizeData=true を設定すると、関数 ocsvm は、各予測子変数 (X または Tbl) を対応する列の平均および標準偏差によってセンタリングおよびスケーリングします。この関数では、カテゴリカル予測子について生成されたダミー変数の列に格納されているデータは標準化されません。

例: StandardizeData=true

データ型: logical

詳細レベル。0 または 1 として指定します。Verbose は、コマンド ラインにおける診断情報の表示を制御します。

説明
0ocsvm は診断情報を表示しません。
1ocsvm は、目的関数の値、勾配の大きさ、および他の診断情報を表示します。

例: Verbose=1

データ型: single | double

収束オプション

すべて展開する

線形係数およびバイアス項 (切片) の相対許容誤差。非負のスカラーとして指定します。

Bt=[βtbt] であるとします。これは、最適化反復 t における係数およびバイアス項のベクトルです。BtBt1Bt2<BetaTolerance で最適化が終了します。

GradientTolerance も指定した場合、いずれかの終了条件が満たされると最適化が終了します。

例: BetaTolerance=1e–6

データ型: single | double

勾配の絶対許容誤差。非負のスカラーとして指定します。

最適化反復 t における係数およびバイアス項に関する目的関数の勾配ベクトルを t とします。t=max|t|<GradientTolerance で最適化が終了します。

BetaTolerance も指定した場合、いずれかの終了条件が満たされると最適化が終了します。

例: GradientTolerance=1e–5

データ型: single | double

最適化反復の最大回数。正の整数を指定します。

名前と値の引数 BlockSize で指定されたメモリに変換後のデータが収まる場合、既定値は 1000 です。それ以外の場合、既定値は 100 です。

例: IterationLimit=500

データ型: single | double

出力引数

すべて折りたたむ

学習済みの 1 クラス SVM モデル。OneClassSVM オブジェクトとして返されます。

オブジェクト関数 isanomalyMdl を使用して、新規のデータの異常を見つけることができます。

異常インジケーター。logical 列ベクトルとして返されます。tf の要素は、Tbl または X の対応する行の観測値が異常であれば true、それ以外の場合は false になります。観測値の一部に欠損値がある場合、異常インジケーターは false になります。tfTbl または X と同じ長さになります。

ocsvm は、scores がしきい値 (MdlScoreThreshold プロパティの値) を超える観測値を異常として識別します。関数は、指定された比率 (名前と値の引数 ContaminationFraction) の学習観測値が異常として検出されるようにしきい値を決定します。

異常スコア。–Inf から Inf までの値の数値列ベクトルとして返されます。scores の長さは Tbl または X と同じで、scores の各要素に Tbl または X の対応する行の観測値に対する異常スコアが格納されます。振幅が大きな負のスコア値は正常な観測値を示し、大きい正の値は異常を示します。観測値の一部に欠損値がある場合、異常スコアは NaN になります。

詳細

すべて折りたたむ

ヒント

  • モデルに学習させた後で、新しいデータについて異常を検出する C/C++ コードを生成できます。C/C++ コードの生成には MATLAB® Coder™ が必要です。詳細については、関数 isanomalyコード生成およびコード生成の紹介を参照してください。

アルゴリズム

  • ocsvm は、Tbl に含まれている NaN'' (空の文字ベクトル)、"" (空の string)、<missing><undefined> の値と X に含まれている NaN 値を欠損値と見なします。

  • ocsvm は、一部の値が欠損値である観測値は使用しません。この関数は、それらの観測値に異常スコア NaN および異常インジケーター false (logical 0) を割り当てます。

  • ocsvm は、メモリ制限 Broyden-Fletcher-Goldfarb-Shanno (LBFGS) ソルバーとリッジ (L2) 正則化を使用して、正則化された目的関数を最小化します。変換後の予測子データを保持するために ocsvm で必要となるメモリが BlockSize の値より多い場合、この関数はブロック単位方式を使用します。

    • ocsvm がブロック単位方式を使用する場合、各反復で損失と勾配の計算をデータのさまざまな部分に分散させることにより LBFGS が実装されます。また、ocsvm は、データの一部に対してローカルにモデルを当てはめ、平均化で係数を結合することにより、線形係数およびバイアス項の初期推定値を改善します。Verbose=1 が指定された場合、ocsvm は各データ通過についての診断情報を表示します。

    • ocsvm がブロック単位方式を使用しない場合、初期推定値はゼロになります。Verbose=1 が指定された場合、ocsvm は各反復についての診断情報を表示します。

代替機能

異常検出用の 1 クラス SVM モデルの学習には、関数 fitcsvm も使用できます。

  • 関数 ocsvm は、関数 fitcsvm よりも簡単で推奨される異常検出用のワークフローを提供します。

    • 関数 ocsvm は、OneClassSVM オブジェクト、異常インジケーター、および異常スコアを返します。その出力を使用して学習データの異常を特定できます。新規のデータの異常を見つけるには、OneClassSVM のオブジェクト関数 isanomaly を使用できます。関数 isanomaly は、新規データの異常インジケーターおよびスコアを返します。

    • 関数 fitcsvm は、1 クラスとバイナリの両方の分類をサポートします。クラス ラベル変数に 1 つしかクラスが含まれていない場合 (1 のベクトルの場合など)、fitcsvm は 1 クラス分類用にモデルを学習させ、ClassificationSVM オブジェクトを返します。異常を特定するには、最初に ClassificationSVM のオブジェクト関数 resubPredict または predict を使用して異常スコアを計算してから、負のスコアをもつ観測値を探して異常を特定する必要があります。

    • ocsvm では大きい正の異常スコアが異常を示すのに対し、ClassificationSVMpredict では負のスコアが異常を示すことに注意してください。

  • 関数 ocsvm は SVM の主問題形式に基づいて判定境界を求めるのに対し、関数 fitcsvm は SVM の双対問題形式に基づいて判定境界を求めます。

  • 大規模な (n が大きい) データ セットについては、ocsvm のソルバーの方が fitcsvm のソルバーよりも計算量が少なくなります。fitcsvm のソルバーでは nn 列のグラム行列の計算が必要ですが、ocsvm のソルバーで必要なのは nm 列の行列の形成だけです。ここで、m は拡張空間の次元数であり、ビッグ データにおいては一般に n よりもはるかに小さくなります。

参照

[1] Rahimi, A., and B. Recht. “Random Features for Large-Scale Kernel Machines.” Advances in Neural Information Processing Systems. Vol. 20, 2008, pp. 1177–1184.

[2] Le, Q., T. Sarlós, and A. Smola. “Fastfood — Approximating Kernel Expansions in Loglinear Time.” Proceedings of the 30th International Conference on Machine Learning. Vol. 28, No. 3, 2013, pp. 244–252.

拡張機能

すべて展開する

バージョン履歴

R2022b で導入

すべて展開する