Main Content

LocalOutlierFactor

異常検出用の局所外れ値因子モデル

R2022b 以降

    説明

    局所外れ値因子モデル オブジェクト LocalOutlierFactor を異常検出に使用します。

    • 外れ値検出 (学習データ中の異常を検出) — 関数 lof を使用して、学習データ中の異常を検出します。関数 lof は、LocalOutlierFactor オブジェクトを作成し、学習データの異常インジケーターおよびスコア (局所外れ値因子の値) を返します。

    • 新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を lof に渡して LocalOutlierFactor オブジェクトを作成し、このオブジェクトおよび新規データをオブジェクト関数 isanomaly に渡して新規のデータの異常を検出します。関数 isanomaly は、新規データの異常インジケーターおよびスコアを返します。

    作成

    関数 lof を使用して LocalOutlierFactor オブジェクトを作成します。

    プロパティ

    すべて展開する

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

    局所外れ値因子モデルの学習に使用された予測子。数値行列または table として指定します。X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

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

    Kd 木の各葉ノードにおけるデータ点の最大数。正の整数を指定します。

    このプロパティは、SearchMethod'kdtree' の場合に有効です。SearchMethod'exhaustive' の場合、BucketSize の値は空 ([]) になります。

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

    カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。CategoricalPredictors には、対応する予測子がカテゴリカルであることを示すインデックス値が格納されます。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。

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

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

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

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

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

    距離計量。文字ベクトルを指定します。

    • すべての予測子変数が連続 (数値) 変数である場合、Distance の値は次の距離計量のいずれかになります。

      説明
      'euclidean'

      ユークリッド距離

      "fasteuclidean"

      データ点における要素の数が 10 個を超える場合に通常は時間の短縮になるアルゴリズムを使用したユークリッド距離。アルゴリズムを参照してください。"fasteuclidean""exhaustive" SearchMethod にのみ適用されます。

      'mahalanobis'

      マハラノビス距離 — この距離には、DistParameter プロパティに格納された共分散行列が使用されます。

      'minkowski'

      ミンコフスキー距離 — この距離には、DistParameter プロパティに格納された指数値が使用されます。

      'chebychev'

      チェビシェフ距離 (最大座標差)

      'cityblock'

      市街地距離

      'correlation'

      1 から、観測値間の標本相関を減算 (値の系列として処理)

      'cosine'

      1 から、ベクトルとして扱われる観測間の夾角の余弦を減算

      'spearman'

      1 から観測値間の標本スピアマン順位相関係数を減算 (値の系列として処理)

    • すべての予測子変数がカテゴリカル変数である場合、Distance の値は次の距離計量のいずれかになります。

      説明
      'hamming'

      ハミング距離 (異なる座標の比率)

      'jaccard'

      1 からジャカード係数 (異なる非ゼロ座標の比率) を減算

    さまざまな距離計量の詳細については、距離計量を参照してください。

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

    マハラノビス距離またはミンコフスキー距離の距離計量のパラメーター値。正のスカラーを指定します。その他の距離の場合、DistParameter の値は空 ([]) になります。これは、指定された距離計量の式にパラメーターがないことを示します。

    • Distance'mahalanobis' である場合、DistParameter はマハラノビス距離の式における共分散行列です。このプロパティは、lof の名前と値の引数 Cov によって設定されます。

    • Distance'minkowski' である場合、DistParameter はミンコフスキー距離の式における指数です。このプロパティは、lof の名前と値の引数 Exponent によって設定されます。

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

    k 番目に小さい距離値の近傍をすべて LocalOutlierFactor に含めるかどうかを示す同順位使用フラグ。logical 0 (false) または 1 (true) を指定します。IncludeTiestrue である場合、すべての近傍が LocalOutlierFactor に含まれます。それ以外の場合、LocalOutlierFactor には正確に k 個の近傍が含まれます。

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

    局所外れ値因子の値の計算に使用する X 内の最近傍の個数。正の整数値を指定します。

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

    予測子変数の名前。文字ベクトルの cell 配列を指定します。PredictorNames の要素の順序は、予測子名が学習データに現れる順序に対応します。

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

    学習データに含まれている異常の識別に使用される異常スコアのしきい値。非負のスカラーとして指定します。

    しきい値を超える異常スコアをもつ観測値が異常であると識別されます。

    • 関数 lof は、指定した比率 (ContaminationFraction プロパティ) の学習観測値が異常として検出されるように、しきい値を決定します。

    • オブジェクト関数 isanomaly は、ScoreThreshold プロパティの値を名前と値の引数 ScoreThreshold の既定値として使用します。

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

    最近傍探索法。'kdtree' または 'exhaustive' を指定します。

    • 'kdtree' — この方法では、Kd 木アルゴリズムを使用して最近傍を探索します。このオプションは、距離計量 (Distance) が次のいずれかである場合に有効です。

      • 'euclidean' — ユークリッド距離

      • 'cityblock' — 市街地距離

      • 'minkowski' — ミンコフスキー距離

      • 'chebychev' — チェビシェフ距離

    • 'exhaustive' — この方法では、網羅的探索アルゴリズムを使用して最近傍を探索します。

      • 関数 lof を使用して X の局所外れ値因子の値を計算する場合、この関数は、X 内のすべての点から X 内の各点までの距離の値を計算することにより、最近傍を探索します。

      • 関数 isanomaly を使用して新しいデータ Xnew の局所外れ値因子の値を計算する場合、この関数は、X 内のすべての点から Xnew 内の各点までの距離の値を計算することにより、最近傍を探索します。

    オブジェクト関数

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

    すべて折りたたむ

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

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

    load NYCHousing2015

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

    summary(NYCHousing2015)
    Variables:
    
        BOROUGH: 91446x1 double
    
            Values:
    
                Min          1    
                Median       3    
                Max          5    
    
        NEIGHBORHOOD: 91446x1 cell array of character vectors
    
        BUILDINGCLASSCATEGORY: 91446x1 cell array of character vectors
    
        RESIDENTIALUNITS: 91446x1 double
    
            Values:
    
                Min            0  
                Median         1  
                Max         8759  
    
        COMMERCIALUNITS: 91446x1 double
    
            Values:
    
                Min           0   
                Median        0   
                Max         612   
    
        LANDSQUAREFEET: 91446x1 double
    
            Values:
    
                Min                0
                Median          1700
                Max       2.9306e+07
    
        GROSSSQUAREFEET: 91446x1 double
    
            Values:
    
                Min                0
                Median          1056
                Max       8.9422e+06
    
        YEARBUILT: 91446x1 double
    
            Values:
    
                Min            0  
                Median      1939  
                Max         2016  
    
        SALEPRICE: 91446x1 double
    
            Values:
    
                Min                0
                Median    3.3333e+05
                Max       4.1111e+09
    
        SALEDATE: 91446x1 datetime
    
            Values:
    
                Min       01-Jan-2015
                Median    09-Jul-2015
                Max       31-Dec-2015
    

    NYCHousing2015 から非数値変数を削除します。変数 BOROUGH のデータ型は double ですが、これは不動産の所在地の区を示すカテゴリカル変数です。変数 BOROUGH も削除します。

    NYCHousing2015 = NYCHousing2015(:,vartype("numeric"));
    NYCHousing2015.BOROUGH = [];

    NYCHousing2015 用に局所外れ値因子モデルに学習させます。学習観測値に含まれている異常の比率を 0.01 と指定します。

    [Mdl,tf,scores] = lof(NYCHousing2015,ContaminationFraction=0.01);

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

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

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

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

    異なる汚染の比率 (たとえば 0.05) で異常を識別する場合は、新しい局所外れ値因子モデルに学習させることができます。

     [newMdl,newtf,scores] = lof(NYCHousing2015,ContaminationFraction=0.05);
    

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

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

    newContaminationFraction = 0.05;

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

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

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

    newtf = scores > newScoreThreshold;

    関数 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 を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。

    詳細

    すべて展開する

    ヒント

    参照

    [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 で導入

    すべて展開する