Main Content

isanomaly

局所外れ値因子を使用したデータ中の異常の検出

R2022b 以降

    説明

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

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

    tf = isanomaly(___,Name=Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、scoreThreshold=0.5 にすると、スコアが 0.5 を超える観測値が isanomaly で異常として識別されます。

    [tf,scores] = isanomaly(___) は、Tbl または X の各観測値についての異常スコア (局所外れ値因子の値) も返します。1 未満かそれに近いスコア値は正常な観測値を示し、1 より大きい値は異常の可能性を示します。

    すべて折りたたむ

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

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

    load census1994

    census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。LocalOutlierFactor オブジェクトに学習させるには、予測子データはすべて連続、またはすべて categorical のいずれかでなければなりません。adultdata および adulttest から非数値変数を削除します。

    adultdata = adultdata(:,vartype("numeric"));
    adulttest = adulttest(:,vartype("numeric"));

    adultdata 用に局所外れ値因子モデルに学習させます。adultdata には外れ値が含まれていないと仮定します。

    [Mdl,tf,s] = lof(adultdata);

    MdlLocalOutlierFactor オブジェクトです。lof は、学習データ adultdata の異常インジケーター tf および異常スコア s も返します。名前と値の引数 ContaminationFraction を 0 を超える値として指定していない場合、lof はすべての学習観測値を正常な観測値として扱います。つまり tf の値はすべて logical 0 (false) となります。この関数によりスコアのしきい値が最大のスコア値に設定されます。しきい値を表示します。

    Mdl.ScoreThreshold
    ans = 28.6719
    

    学習済みの局所外れ値因子モデルを使用して、adulttest 内の異常を見つけます。

    [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 が含まれています。

    adultdata および adulttest から非数値変数を削除します。

    adultdata = adultdata(:,vartype("numeric"));
    adulttest = adulttest(:,vartype("numeric"));

    adultdata 用に局所外れ値因子モデルに学習させます。

    [Mdl,tf,scores] = lof(adultdata);

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

    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.

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

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

    [~,~,U] = isoutlier(scores)
    U = 1.1567
    

    名前と値の引数 ScoreThreshold の値を U として指定します。

    [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.

    外れ値が含まれている標本データ セットを生成します。関数 isanomaly を使用して標本データの周りの点の異常スコアを計算し、異常スコアの等高線図を作成します。次に、適合率-再現率曲線をプロットして、学習済みの局所外れ値モデルの性能をチェックします。

    ガウス型コピュラを使用して、二変量分布からランダムなデータ点を生成します。

    rng("default")
    rho = [1,0.05;0.05,1];
    n = 1000;
    u = copularnd("Gaussian",rho,n);

    無作為に選択された 5% の観測値にノイズを追加して、それらの観測値を外れ値にします。

    noise = randperm(n,0.05*n);
    true_tf = false(n,1);
    true_tf(noise) = true;
    u(true_tf,1) = u(true_tf,1)*5;

    関数 lof を使用して局所外れ値因子モデルに学習させます。学習観測値に含まれている異常の比率を 0.05 に設定します。パフォーマンス向上のために、SearchMethodNumNeighborsDistance などの名前と値の引数を指定して、局所外れ値因子アルゴリズムのオプションを変更することもできます。ここでは、使用する最近傍の個数を 40 と指定します。

    [LOFObj,tf,scores] = lof(u,ContaminationFraction=0.05,NumNeighbors=40);

    学習済みの局所外れ値因子モデルと関数 isanomaly を使用して、学習観測値の周りの 2 次元グリッド座標の異常スコアを計算します。

    l1 = linspace(min(u(:,1),[],1),max(u(:,1),[],1));
    l2 = linspace(min(u(:,2),[],1),max(u(:,2),[],1));
    [X1,X2] = meshgrid(l1,l2);
    [~,scores_grid] = isanomaly(LOFObj,[X1(:),X2(:)]);
    scores_grid = reshape(scores_grid,size(X1,1),size(X2,2));

    学習観測値の散布図と異常スコアの等高線図を作成します。真の外れ値と lof で検出された外れ値にフラグを付けます。

    idx = setdiff(1:1000,noise);
    scatter(u(idx,1),u(idx,2),[],[0.5 0.5 0.5],".")
    hold on
    scatter(u(noise,1),u(noise,2),"ro","filled")
    scatter(u(tf,1),u(tf,2),60,"kx",LineWidth=1)
    contour(X1,X2,scores_grid,"ShowText","on")
    legend(["Normal Points" "Outliers" "Detected Outliers"],Location="best")
    colorbar
    hold off

    Figure contains an axes object. The axes object contains 4 objects of type scatter, contour. These objects represent Normal Points, Outliers, Detected Outliers.

    適合率-再現率曲線をプロットし、曲線の下の領域 (AUC) の値を計算して、学習済みの局所外れ値因子モデルの性能をチェックします。rocmetricsオブジェクトを作成します。rocmetrics では、既定では偽陽性率と真陽性率 (つまり再現率) が計算されます。名前と値の引数 AdditionalMetrics を指定して、適合率の値 (つまり陽性の予測値) を追加で計算します。

    rocObj = rocmetrics(true_tf,scores,true,AdditionalMetrics="PositivePredictiveValue");

    rocmetrics の関数 plot を使用して曲線をプロットします。"y" 軸のメトリクスを適合率 (つまり陽性の予測値)、"x" 軸のメトリクスを再現率 (つまり真陽性率) として指定します。LOFObj.ScoreThreshold に対応するモデル操作点に塗りつぶされた円を表示します。関数 trapz の台形法を使用して適合率-再現率曲線の下の領域を計算し、その値を凡例に表示します。

    r = plot(rocObj,YAxisMetric="PositivePredictiveValue",XAxisMetric="TruePositiveRate");
    hold on
    idx = find(rocObj.Metrics.Threshold>=LOFObj.ScoreThreshold,1,'last');
    scatter(rocObj.Metrics.TruePositiveRate(idx), ...
        rocObj.Metrics.PositivePredictiveValue(idx), ...
        [],r.Color,"filled")
    xyData = rmmissing([r.XData r.YData]);
    auc = trapz(xyData(:,1),xyData(:,2));
    legend(join([r.DisplayName " (AUC = " string(auc) ")"],""),"true Model Operating Point")
    xlabel("Recall")
    ylabel("Precision")
    title("Precision-Recall Curve")
    hold off

    Figure contains an axes object. The axes object with title Precision-Recall Curve, xlabel Recall, ylabel Precision contains 2 objects of type roccurve, scatter. These objects represent true (AUC = 0.74752), true Model Operating Point.

    入力引数

    すべて折りたたむ

    学習済みの局所外れ値因子モデル。LocalOutlierFactor オブジェクトとして指定します。

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

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

    データ型: table

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

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

    データ型: single | double

    名前と値の引数

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

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

    例: CacheSize=5000,ScoreThreshold=0.3 は、5000 メガバイトのサイズのグラム行列を使用し、スコアが 0.3 を超える観測値を異常として識別します。

    メガバイト単位のグラム行列のサイズ。正のスカラーまたは "maximal" として指定します。グラム行列の定義については、アルゴリズムを参照してください。関数 isanomaly では、関数 lof の名前と値の引数 Distance"fasteuclidean" の場合にグラム行列を使用できます。

    CacheSize"maximal" の場合、isanomalyMTMX 列のサイズの中間行列全体に十分なメモリを割り当てようと試みます。ここで、MTLOFObj の学習データの行数、MX は入力データ X または Tbl の行数です。CacheSize は、中間行列全体に対して十分な大きさである必要はありませんが、少なくとも MX 行 1 列のベクトルを保持する十分な大きさでなければなりません。そうでない場合、isanomaly"euclidean" 距離を使用します。

    Distance"fasteuclidean" の場合、CacheSize の値が大きすぎるか "maximal" であると、利用可能なメモリを超えるグラム行列の割り当てが isanomaly で試行されることがあります。この場合、MATLAB® はエラーを生成します。

    例: CacheSize="maximal"

    データ型: double | char | string

    異常スコアのしきい値。非負のスカラーとして指定します。isanomaly は、スコアがこのしきい値を超える観測値を異常として識別します。

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

    例: ScoreThreshold=0.5

    データ型: single | double

    出力引数

    すべて折りたたむ

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

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

    異常スコア (局所外れ値因子の値)。非負の値の数値列ベクトルとして返されます。scores の長さは Tbl または X と同じで、scores の各要素に Tbl または X の対応する行の観測値に対する異常スコアが格納されます。1 未満かそれに近いスコア値は正常な観測値を示し、1 より大きい値は異常の可能性を示します。

    詳細

    すべて折りたたむ

    局所外れ値因子

    局所外れ値因子 (LOF) アルゴリズムでは、周囲の近傍に対する観測値の相対的な密度に基づいて異常を検出します。

    このアルゴリズムでは、観測値の k 最近傍を探索し、観測値とその近傍の局所到達可能性密度を計算します。局所外れ値因子は、観測値とその近傍の平均密度比です。つまり、観測値 p の局所外れ値因子は次のようになります。

    LOFk(p)=1|Nk(p)|oNk(p)lrdk(o)lrdk(p),

    ここで

    • lrdk(·) は、観測値の局所到達可能性密度です。

    • Nk(p) は、観測値 p の k 最近傍を表します。名前と値の引数 IncludeTiestrue に指定して k 番目に小さい距離値の近傍をすべて含めるか、false に指定して正確に k 個の近傍を含めることができます。効率性能を高めるため、lofIncludeTies の既定値は false です。[1]のアルゴリズムではすべての近傍が使用されることに注意してください。

    • |Nk(p)|Nk(p) 内の観測値数です。

    正常な観測値の場合、局所外れ値因子の値は 1 未満かそれに近い値で、観測値の局所到達可能性密度がその近傍より高いか同等であることを示します。局所外れ値因子の値が 1 より大きい場合は、異常の可能性を示します。局所外れ値因子の値のしきい値は、lofContaminationFraction 引数と isanomalyScoreThreshold 引数で制御します。

    このアルゴリズムでは、到達可能性距離に基づいて密度を測定します。観測値 o に対する観測値 p の到達可能性距離は次のように定義されます。

    d˜k(p,o)=max(dk(o),d(p,o)),

    ここで

    • dk(o) は、観測値 o からその近傍までの距離の中で k 番目に短い距離です。

    • d(p,o) は、観測値 p と観測値 o の間の距離です。

    このアルゴリズムでは、到達可能性距離を使用して、観測値 o に近い観測値の d(p,o) の統計変動を低減します。

    観測値 p の局所到達可能性密度は、観測値 p からその近傍までの平均到達可能性距離の逆数です。

    lrdk(p)=1/oNk(p)d˜k(p,o)|Nk(p)|.

    重複の数が近傍の数 (k) より大きい場合、密度値は無限大になる可能性があります。そのため、学習データに重複が含まれている場合、関数 lof と関数 isanomaly では加重局所外れ値因子 (WLOF) アルゴリズムが使用されます。このアルゴリズムでは、加重局所到達可能性密度 (wlrd) を使用して加重局所外れ値因子を計算します。

    WLOFk(p)=1oNk(p)w(o)oNk(p)wlrdk(o)wlrdk(p),

    ここで

    wlrdk(p)=1/oNk(p)w(o)d˜k(p,o)oNk(p)w(o),

    w(o) は、学習データに含まれている観測値 o の重複の数です。重みの値を計算した後、このアルゴリズムでは重複の各セットが 1 つの観測値として扱われます。

    アルゴリズム

    • Tbl または X の各観測値について局所外れ値因子の値 (scores) を計算するために、isanomaly は、LocalOutlierFactor オブジェクトの X プロパティに格納されている学習観測値の中から k 最近傍を探索します。

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

      • isanomaly は、欠損値のある観測値は使用しません。

      • isanomaly は、欠損値のある観測値に異常スコア NaN および異常インジケーター false (logical 0) を割り当てます。

    参照

    [1] Breunig, Markus M., et al. “LOF: Identifying Density-Based Local Outliers.” Proceedings of the 2000 ACM SIGMOD International Conference on Management of Data, 2000, pp. 93–104.

    バージョン履歴

    R2022b で導入

    すべて展開する