Main Content

isanomaly

1 クラス サポート ベクター マシン (SVM) を使用したデータ中の異常の検出

R2022b 以降

    説明

    tf = isanomaly(Mdl,Tbl) は、OneClassSVM オブジェクト Mdl を使用して table Tbl 内の異常を検出し、Tbl の対応する行で異常が検出された場合に要素が true になる logical 配列 tf を返します。関数 ocsvm に table を渡して Mdl を作成した場合、この構文を使用する必要があります。

    tf = isanomaly(Mdl,X) は、行列 X 内の異常を検出します。関数 ocsvm に行列を渡して Mdl を作成した場合、この構文を使用する必要があります。

    tf = isanomaly(___,ScoreThreshold=scoreThreshold) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、異常スコアのしきい値を指定します。isanomaly は、スコアが scoreThreshold を超える観測値を異常として識別します。

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

    すべて折りたたむ

    関数 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 =
    
      0x1 empty double column vector
    

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

    isanomaly の名前と値の引数 ScoreThreshold を使用して、異常スコアのしきい値を指定します。

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

    load census1994

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

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

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

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

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

    スコア値のヒストグラムをプロットします。既定のスコアのしきい値の位置に垂直線を作成します。

    h = histogram(scores,NumBins=50,Normalization="probability");
    h.Parent.YScale = 'log';
    xline(Mdl.ScoreThreshold,"r-",join(["Threshold" Mdl.ScoreThreshold]))

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

    学習済みの 1 クラス SVM モデルを使用して、テスト データ内の異常を見つけます。モデルの学習時に取得された既定のしきい値とは異なるしきい値を使用します。

    まず、関数isoutlierを使用してスコアのしきい値を調べます。

    [~,~,U] = isoutlier(scores)
    U = -0.5342
    

    名前と値の引数 ScoreThreshold の値を U として指定します。Mdl に学習させるときに StandardizeDatatrue に指定したため、関数 isanomaly は、Mdl.Mu および Mdl.Sigma に保存されている平均と標準偏差をそれぞれ使用して新しい入力データを標準化します。

    [tf_test,scores_test] = isanomaly(Mdl,adulttest,ScoreThreshold=U);
    h = histogram(scores_test,NumBins=50,Normalization="probability");
    h.Parent.YScale = 'log';
    xline(U,"r-",join(["Threshold" U]))

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

    入力引数

    すべて折りたたむ

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

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

    table を使用して Mdl に学習させた場合、X ではなく Tbl を使用して予測子データを提供する必要があります。Tbl 内のすべての予測子変数は、変数名およびデータ型が学習データと同じでなければなりません。ただし、Tbl の列の順序が学習データの列の順序に対応する必要はありません。

    データ型: table

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

    行列を使用して Mdl に学習させた場合、Tbl ではなく X を使用して予測子データを提供する必要があります。X の列を構成する変数の順序は、学習データと同じでなければなりません。

    データ型: single | double

    異常スコアのしきい値。範囲 (–Inf,Inf) の数値スカラーとして指定します。isanomaly は、スコアがこのしきい値を超える観測値を異常として識別します。

    既定値は、MdlScoreThreshold プロパティ値です。

    例: ScoreThreshold=0.5

    データ型: single | double

    出力引数

    すべて折りたたむ

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

    isanomaly は、scores がしきい値 (scoreThreshold の値) を超える観測値を異常として識別します。

    異常スコア。範囲 (–Inf,Inf) の値の数値列ベクトルとして返されます。scores の長さは Tbl または X と同じで、scores の各要素に Tbl または X の対応する行の観測値に対する異常スコアが格納されます。振幅が大きな負のスコア値は正常な観測値を示し、大きい正の値は異常を示します。

    拡張機能

    バージョン履歴

    R2022b で導入

    すべて展開する