Main Content

rrcforest

異常検出用のロバスト ランダム カット フォレスト モデルの当てはめ

R2023a 以降

    説明

    関数 rrcforest は、外れ値の検出と新規性の検出のためのロバスト ランダム カット フォレスト モデルの当てはめに使用します。

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

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

    forest = rrcforest(Tbl) は、table Tbl の予測子データに対する RobustRandomCutForest モデル オブジェクトを返します。

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

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

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

    [forest,tf,scores] = rrcforest(___) は、Tbl または X の各観測値についての範囲 [0,Inf) の異常スコアも返します。小さい正の値は正常な観測値を示し、大きい正の値は異常を示します。

    すべて折りたたむ

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

    標本データ セット 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
    

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

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

    BOROUGHNEIGHBORHOOD、および BUILDINGCLASSCATEGORY にはカテゴリカル予測子が含まれます。カテゴリカル予測子のカテゴリの個数を表示します。

    length(unique(NYCHousing2015.BOROUGH))
    ans = 5
    
    length(unique(NYCHousing2015.NEIGHBORHOOD))
    ans = 254
    
    length(unique(NYCHousing2015.BUILDINGCLASSCATEGORY))
    ans = 48
    

    64 個を超えるカテゴリをもつカテゴリカル変数の場合、関数 rrcforest は近似分割法を使用しますが、これはロバスト ランダム カット フォレスト モデルの精度を低下させる可能性があります。254 個のカテゴリをもつカテゴリカル変数が含まれている NEIGHBORHOOD 列を削除します。

    NYCHousing2015.NEIGHBORHOOD = [];

    ロバスト ランダム カット フォレスト モデルに NYCHousing2015 について学習させます。学習観測値に含まれている異常の比率を 0.1 に指定し、最初の変数 (BOROUGH) をカテゴリカル予測子として指定します。最初の変数は数値配列であるため、この変数をカテゴリカル変数として指定しない限り、rrcforest により連続変数であると仮定されます。

    rng("default") % For reproducibility 
    [Mdl,tf,scores] = rrcforest(NYCHousing2015, ...
        ContaminationFraction=0.1,CategoricalPredictors=1);

    MdlRobustRandomCutForest モデル オブジェクトです。rrcforest は、学習データ 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) で異常を識別する場合は、新しいロバスト ランダム カット フォレスト モデルに学習させることができます。

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

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

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

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

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

    newContaminationFraction = 0.01;

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

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

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

    newtf = scores > newScoreThreshold;

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

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

    load census1994

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

    adultdata には外れ値が含まれていないと仮定します。ロバスト ランダム カット フォレスト モデルに adultdata について学習させます。StandardizeDatatrue と指定して入力データを標準化します。

    rng("default") % For reproducibility
    [Mdl,tf,s] = rrcforest(adultdata,StandardizeData=true);

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

    Mdl.ScoreThreshold
    ans = 86.5315
    

    学習させたロバスト ランダム カット フォレスト モデルを使用して、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 のヒストグラムを作成します。異常スコアのしきい値に垂直線を作成します。

    histogram(s,Normalization="probability")
    hold on
    histogram(s_test,Normalization="probability")
    xline(Mdl.ScoreThreshold,"r-",join(["Threshold" Mdl.ScoreThreshold]))
    legend("Training Data","Test Data",Location="northwest")
    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 = 3541
    

    テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly は既定のしきい値でテスト データ中にある少数の異常を検出します。

    しきい値近くの異常と観測値が見えるようにズームインします。

    xlim([50 92])
    ylim([0 0.001])

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

    名前と値のペア ScoreThreshold を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。

    入力引数

    すべて折りたたむ

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

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

    データ型: table

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

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

    データ型: single | double

    名前と値の引数

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

    例: NumLearners=50,NumObservationsPerLearner=100 は、50 個の木とそれぞれの木の 100 個の観測値を使用してロバスト ランダム カット フォレスト モデルに学習させるように指定します。

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

    説明
    正の整数のベクトル

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

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

    logical ベクトル

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

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

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

    64 個を超えるカテゴリをもつカテゴリカル変数の場合、関数 rrcforest は近似分割法を使用しますが、これはモデルの精度を低下させる可能性があります。

    例: CategoricalPredictors="all"

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

    collusive 変位の計算方法。"maximal" または "average" として指定します。

    関数 rrcforest は、それぞれの木について、モデルの複雑度の最大変化 ("maximal") または平均変化 ("average") を調べ、各観測値の collusive 変位 (異常スコア) を計算します。詳細については、異常スコアを参照してください。

    例: CollusiveDisplacement="average"

    データ型: char | string

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

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

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

    例: ContaminationFraction=0.1

    データ型: single | double

    ロバスト ランダム カット ツリー (ロバスト ランダム カット フォレスト モデルの木) の数。正の整数として指定します。

    例: NumLearners=50

    データ型: single | double

    学習データから非復元抽出する各ロバスト ランダム カット ツリー (ロバスト ランダム カット フォレスト モデルの木) の観測値の数。3 以上の正の整数スカラーとして指定します。

    例: NumObservationsPerLearner=100

    データ型: single | double

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

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

    • Tbl を指定した場合、PredictorNames を使用して使用する予測子変数を指定できます。つまり、rrcforest は、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 を設定すると、関数 rrcforest は、各予測子変数 (X または Tbl) を対応する列の平均および標準偏差によってセンタリングおよびスケーリングします。この関数では、カテゴリカル予測子について生成されたダミー変数の列に格納されているデータは標準化されません。

    例: StandardizeData=true

    データ型: logical

    並列実行のフラグ。数値または logical の 1 (true) または 0 (false) として指定します。UseParallel=true を指定した場合、関数 rrcforestparfor を使用して for ループの反復を実行します。Parallel Computing Toolbox™ がある場合、ループが並列に実行されます。

    例: UseParallel=true

    データ型: logical

    出力引数

    すべて折りたたむ

    学習済みのロバスト ランダム カット フォレスト モデル。RobustRandomCutForest モデル オブジェクトとして返されます。

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

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

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

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

    詳細

    すべて折りたたむ

    ロバスト ランダム カット フォレスト

    ロバスト ランダム カット フォレスト アルゴリズム[1]では、点によって生じるモデルの複雑度の変化に基づいて、その点を正常な点または異常として分類します。孤立森アルゴリズムと同様に、ロバスト ランダム カット フォレスト アルゴリズムでは木のアンサンブルを作成します。2 つのアルゴリズムには、木の分岐変数の選択方法と異常スコアの定義方法に違いがあります。

    関数 rrcforest は、学習観測値のロバスト ランダム カット フォレスト モデル (ロバスト ランダム カット ツリーのアンサンブル) を作成し、外れ値 (学習データ中の異常) を検出します。学習観測値の部分集合について、それぞれの木に次のように学習させます。

    1. rrcforest は、それぞれの木について、学習観測値から標本を非復元抽出します。

    2. rrcforest は、分岐変数を変数の範囲に対する比率に応じて選択し、分岐位置を一様に無作為に選択することで木を成長させます。それぞれの木について、すべての標本が個別の葉ノードに到達するまでこれが繰り返されます。

    分岐変数の選択に範囲情報を使用することで、無関係な変数に対してロバストなアルゴリズムになります。

    異常の記述は簡単ですが、異常によって残りのデータの記述が複雑になります。そのため、モデルに異常を追加すると、森モデルのモデルの複雑度が増します[1]。関数 rrcforest は、モデルの複雑度の変化を基に定義された異常スコアを使用して外れ値を識別します。

    関数 isanomaly は、学習済みのロバスト ランダム カット フォレスト モデルを使用してデータ中の異常を検出します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) では、汚染されていない学習データ (外れ値がないデータ) でロバスト ランダム カット フォレスト モデルに学習させ、このモデルを使用して新規のデータの異常を検出できます。新規のデータの各観測値について、それぞれの木の対応する葉ノードが特定された後、葉ノードによって生じるモデルの複雑度の変化が計算され、異常インジケーターおよび異常スコアが返されます。

    異常スコア

    ロバスト ランダム カット フォレスト アルゴリズムでは、collusive 変位を異常スコアとして使用します。点 x の "collusive 変位" は、森モデルのモデルの複雑度に対する x の寄与を示します。小さい正の異常スコアの値は正常な観測値を示し、大きい正の値は異常を示します。

    [1]で定義されているように、木 T のモデルの複雑度 |M(T)| は、学習データ Z のすべての点についてのパスの長さ (ルート ノードから葉ノードまでの距離) の合計です。

    |M(T)|=yZf(y,Z,T),

    ここで、f(y,Z,T) は木 T における y の深さです。x の変位は、x によって生じるモデルの複雑度の想定される変化を示すものと定義されます。

    Disp(x,Z)=T,yZ{x}P(T)(f(y,Z,T)f(y,Z{x},T)),

    ここで、T'Z – {x} の木です。Disp(x,Z) は、x を含む葉ノードの兄弟ノードに含まれる想定される点の数です。この定義は重複や準重複に対してロバストでなく、外れ値をマスクしてしまう原因になることがあります。外れ値をマスクしないように、ロバスト ランダム カット フォレスト アルゴリズムでは、collusive 変位 CoDisp を使用して集合 C に x と x の colluders を含めます。

    CoDisp(x,Z)=ET[maxxCZ1|C|yZC(f(y,Z,T)f(y,ZC,T))],

    ここで、T"Z – C の木、|C| は C に対する T の部分木の点の数です。

    rrcforest の名前と値の引数 CollusiveDisplacement の既定値は "maximal" です。既定では、[2]で説明されているように、それぞれの木について、x の葉ノードからルート ノードまで移動して比率 Disp(x,C)/|C| が最大になる集合 C が求められます。CollusiveDisplacement="average" を指定すると、それぞれの木について比率の平均が計算され、その平均の値を使用し collusive 変位の値が計算されます。

    アルゴリズム

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

    rrcforest は、欠損値を含む観測値を使用して、それらの観測値が有効な値をもつ変数の分岐を特定します。それらの観測値は、葉ノードではなく枝ノードに配置されることがあります。その場合、rrcforest は、それぞれの木について、枝ノードからルート ノードまで移動して比率 (Disp(x,C)/|C|) を計算します。すべての値が欠損値である観測値はルート ノードに配置されます。そのため、比率および異常スコアは、それぞれの木の学習観測値の数になります。これは、学習済みのロバスト ランダム カット フォレスト モデルで求められる異常スコアの最大値に相当します。それぞれの木の学習観測値の数は、名前と値の引数 NumObservationsPerLearner を使用して指定できます。

    参照

    [1] Guha, Sudipto, N. Mishra, G. Roy, and O. Schrijvers. "Robust Random Cut Forest Based Anomaly Detection on Streams," Proceedings of The 33rd International Conference on Machine Learning 48 (June 2016): 2712–21.

    [2] Bartos, Matthew D., A. Mullapudi, and S. C. Troutman. "rrcf: Implementation of the Robust Random Cut Forest Algorithm for Anomaly Detection on Streams." Journal of Open Source Software 4, no. 35 (2019): 1336.

    拡張機能

    バージョン履歴

    R2023a で導入