メインコンテンツ

lof

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

R2022b 以降

    説明

    関数 lof は、外れ値の検出と新規性の検出のための局所外れ値因子モデルの作成に使用します。

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

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

    LOFObj = lof(Tbl) は、table Tbl の予測子データに対する LocalOutlierFactor オブジェクトを返します。

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

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

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

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

    すべて折りたたむ

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

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

    load NYCHousing2015

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

    summary(NYCHousing2015)
    NYCHousing2015: 91446×10 table
    
    Variables:
    
        BOROUGH: double
        NEIGHBORHOOD: cell array of character vectors
        BUILDINGCLASSCATEGORY: cell array of character vectors
        RESIDENTIALUNITS: double
        COMMERCIALUNITS: double
        LANDSQUAREFEET: double
        GROSSSQUAREFEET: double
        YEARBUILT: double
        SALEPRICE: double
        SALEDATE: datetime
    
    Statistics for applicable variables:
    
                                 NumMissing          Min              Median               Max               Mean               Std      
    
        BOROUGH                      0                     1                  3                  5             2.8431            1.3343  
        NEIGHBORHOOD                 0                                                                                                   
        BUILDINGCLASSCATEGORY        0                                                                                                   
        RESIDENTIALUNITS             0                     0                  1               8759             2.1789           32.2738  
        COMMERCIALUNITS              0                     0                  0                612             0.2201            3.2991  
        LANDSQUAREFEET               0                     0               1700           29305534         2.8752e+03        1.0118e+05  
        GROSSSQUAREFEET              0                     0               1056            8942176         4.6598e+03        4.3098e+04  
        YEARBUILT                    0                     0               1939               2016         1.7951e+03          526.9998  
        SALEPRICE                    0                     0             333333         4.1111e+09         1.2364e+06        2.0130e+07  
        SALEDATE                     0           01-Jan-2015        09-Jul-2015        31-Dec-2015        07-Jul-2015        2470:47:17  
    

    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 =
    
      0×1 empty double column vector
    

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

    入力引数

    すべて折りたたむ

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

    予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。Tbl を指定した場合、関数 lof は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。Tbl に連続値と categorical 値の両方が含まれている場合、Tbl のすべての予測子を categorical として特定するには、CategoricalPredictors"all" として指定する必要があります。

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

    データ型: table

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

    予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。X を指定した場合、関数 lof はすべての予測子が連続的であると見なします。X のすべての予測子を categorical として特定するには、CategoricalPredictors"all" として指定します。

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

    データ型: single | double

    名前と値の引数

    すべて折りたたむ

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

    例: SearchMethod=exhaustive,Distance=minkowski は、ミンコフスキー距離を指定して網羅的探索アルゴリズムを使用します。

    Kd 木の葉ノードにおけるデータ点の最大数。正の整数値として指定します。この引数は、SearchMethod"kdtree" である場合のみ有効です。

    例: BucketSize=40

    データ型: single | double

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

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

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

    例: CacheSize="maximal"

    データ型: double | char | string

    カテゴリカル予測子フラグ。次のいずれかを指定します。

    • "all" — すべての予測子がカテゴリカルです。既定では、lof は名前と値の引数 Distance にハミング距離 ("hamming") を使用します。

    • [] — カテゴリカル予測子はありません。つまり、すべての予測子が連続的 (数値) です。この場合、Distance の既定値は "euclidean" です。

    lof の予測子データは、すべて連続、またはすべて categorical のいずれかでなければなりません。

    • 予測子データが table (Tbl) 内にある場合、lof は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。Tbl に連続値と categorical 値の両方が含まれている場合、Tbl のすべての予測子を categorical として特定するには、CategoricalPredictors"all" として指定する必要があります。

    • 予測子データが行列 (X) である場合、lof はすべての予測子が連続的であると見なします。X のすべての予測子を categorical として特定するには、CategoricalPredictors"all" として指定します。

    lof は、正の整数値を各カテゴリに割り当てることにより、カテゴリカル変数を数値変数として符号化します。カテゴリカル予測子を使用する場合、必ず適切な距離計量 (Distance) を使用するようにしてください。

    例: CategoricalPredictors="all"

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

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

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

    例: ContaminationFraction=0.1

    データ型: single | double

    共分散行列。関数によるマハラノビス距離の計算時の共分散行列を表すスカラー値の正定値行列として指定します。この引数は、Distance"mahalanobis" である場合のみ有効です。

    既定値は、関数によって重複する値および欠損値を含む行が除外された後の予測子データ (Tbl または X) から計算された共分散行列です。

    データ型: single | double

    距離計量。文字ベクトルまたは string スカラーを指定します。

    • すべての予測子変数が連続 (数値) 変数である場合、次の距離計量のうちの 1 つを指定できます。

      説明
      "euclidean"

      ユークリッド距離

      "fasteuclidean"

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

      "mahalanobis"

      マハラノビス距離 — 名前と値の引数 Cov を使用して、マハラノビス距離の共分散行列を指定できます。

      "minkowski"

      ミンコフスキー距離 — 名前と値の引数 Exponent を使用して、ミンコフスキー距離の指数を指定できます。

      "chebychev"

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

      "cityblock"

      市街地距離

      "correlation"

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

      "cosine"

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

      "spearman"

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

      メモ

      これらの距離計量のうちの 1 つをカテゴリカル予測子に対して指定している場合、ソフトウェアは、各カテゴリカル予測子を距離計算用の数値変数として扱います。各カテゴリは正の整数で表されます。Distance の値は学習済みモデルの CategoricalPredictors プロパティに影響しません。

    • すべての予測子変数がカテゴリカル変数である場合、次の距離計量のうちの 1 つを指定できます。

      説明
      "hamming"

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

      "jaccard"

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

      メモ

      これらの距離計量のうちの 1 つを連続 (数値) 予測子に対して指定している場合、ソフトウェアは、各連続予測子を距離計算用のカテゴリカル変数として扱います。このオプションでは CategoricalPredictors の値は変更されません。

    すべての予測子変数が連続変数であれば、既定値は "euclidean" です。すべての予測子変数がカテゴリカル変数であれば、既定値は "hamming" です。

    Kd 木アルゴリズム (SearchMethod="kdtree") を使用する場合、Distance"euclidean""cityblock""minkowski" または "chebychev" にする必要があります。

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

    例: Distance="jaccard"

    データ型: char | string

    ミンコフスキー距離指数。正のスカラー値として指定します。この引数は、Distance"minkowski" である場合のみ有効です。

    例: Exponent=3

    データ型: single | double

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

    例: IncludeTies=true

    データ型: logical

    局所外れ値因子の値を計算するために探索する予測子データ (Tbl または X) 内の最近傍の個数。正の整数値を指定します。

    既定値は min(20,n-1) です。n は予測子データに含まれている一意の行の数です。

    例: NumNeighbors=3

    データ型: single | double

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

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

    • Tbl を指定した場合、PredictorNames を使用して使用する予測子変数を指定できます。つまり、lof は、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

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

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

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

      • "cityblock" — 市街地距離

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

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

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

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

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

    予測子データの列数が 10 以下で、データがスパースではなく、距離計量 (Distance) が Kd 木アルゴリズムに対して有効である場合、既定値は "kdtree" です。それ以外の場合、既定値は "exhaustive" です。

    出力引数

    すべて折りたたむ

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

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

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

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

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

    詳細

    すべて折りたたむ

    アルゴリズム

    すべて折りたたむ

    参照

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

    [2] Albanie, Samuel. Euclidean Distance Matrix Trick. June, 2019. Available at https://samuelalbanie.com/files/Euclidean_distance_trick.pdf.

    バージョン履歴

    R2022b で導入

    すべて展開する