rrcforest
構文
説明
関数 rrcforest
は、外れ値の検出と新規性の検出のためのロバスト ランダム カット フォレスト モデルの当てはめに使用します。
外れ値検出 (学習データ中の異常を検出) —
rrcforest
の出力引数tf
を使用して、学習データ中の異常を検出します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を
rrcforest
に渡してRobustRandomCutForest
モデル オブジェクトを作成します。そのオブジェクトと新規データをオブジェクト関数isanomaly
に渡して、新規のデータの異常を検出します。
は、table forest
= rrcforest(Tbl
)Tbl
の予測子データに対する RobustRandomCutForest
モデル オブジェクトを返します。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、学習データの 10% を異常として処理するには forest
= rrcforest(___,Name=Value
)
と指定します。ContaminationFraction
=0.1
例
外れ値の検出
関数 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 = [];
列 BOROUGH
、NEIGHBORHOOD
、および 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);
Mdl
は RobustRandomCutForest
モデル オブジェクトです。rrcforest
は、学習データ NYCHousing2015
の異常インジケーター (tf
) および異常スコア (scores
) も返します。
スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。
histogram(scores) xline(Mdl.ScoreThreshold,"r-",["Threshold" Mdl.ScoreThreshold])
異なる汚染の比率 (たとえば 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
について学習させます。StandardizeData
を true
と指定して入力データを標準化します。
rng("default") % For reproducibility [Mdl,tf,s] = rrcforest(adultdata,StandardizeData=true);
Mdl
は RobustRandomCutForest
モデル オブジェクトです。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
テスト データ中にある異常の観測値のインデックスを表示します。
find(tf_test)
ans = 3541
テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly
は既定のしきい値でテスト データ中にある少数の異常を検出します。
しきい値近くの異常と観測値が見えるようにズームインします。
xlim([50 92]) ylim([0 0.001])
名前と値のペア ScoreThreshold
を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
入力引数
Tbl
— 予測子データ
テーブル
予測子データ。table として指定します。Tbl
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
Tbl
内の変数のサブセットを使用するには、名前と値の引数 PredictorNames
を使用して変数を指定します。
データ型: table
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。
名前と値の引数 PredictorNames
を使用して X
内の予測子変数に名前を割り当てることができます。
データ型: single
| double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: NumLearners=50,NumObservationsPerLearner=100
は、50 個の木とそれぞれの木の 100 個の観測値を使用してロバスト ランダム カット フォレスト モデルに学習させるように指定します。
CategoricalPredictors
— カテゴリカル予測子のリスト
正の整数のベクトル | logical ベクトル | 文字行列 | string 配列 | 文字ベクトルの cell 配列 | "all"
カテゴリカル予測子のリスト。次の表のいずれかの値として指定します。
値 | 説明 |
---|---|
正の整数のベクトル | ベクトルの各エントリは、対応する予測子がカテゴリカルであることを示すインデックス値です。インデックス値の範囲は 1 ~
|
logical ベクトル |
|
文字行列 | 行列の各行は予測子変数の名前です。名前は 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
CollusiveDisplacement
— collusive 変位の計算方法
"maximal"
(既定値) | "average"
collusive 変位の計算方法。"maximal"
または "average"
として指定します。
関数 rrcforest
は、それぞれの木について、モデルの複雑度の最大変化 ("maximal"
) または平均変化 ("average"
) を調べ、各観測値の collusive 変位 (異常スコア) を計算します。詳細については、異常スコアを参照してください。
例: CollusiveDisplacement="average"
データ型: char
| string
ContaminationFraction
— 学習データ中の異常の比率
0 (既定値) | 範囲 [0,1] の数値スカラー
学習データに含まれている異常の比率。範囲 [0,1] の数値スカラーとして指定します。
ContaminationFraction
の値が 0 (既定) の場合、rrcforest
はすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (forest
のScoreThreshold
プロパティの値) をscores
の最大値に設定します。ContaminationFraction
の値が範囲 (0,1] にある場合、rrcforest
は指定された比率の学習観測値が異常として検出されるようにしきい値を決定します。
例: ContaminationFraction=0.1
データ型: single
| double
NumLearners
— ロバスト ランダム カット ツリーの数
100 (既定値) | 正の整数スカラー
ロバスト ランダム カット ツリー (ロバスト ランダム カット フォレスト モデルの木) の数。正の整数として指定します。
例: NumLearners=50
データ型: single
| double
NumObservationsPerLearner
— 各ロバスト ランダム カット ツリーの観測値の数
min(N,256)
(N
は学習観測値の個数) (既定値) | 3 以上の正の整数スカラー
学習データから非復元抽出する各ロバスト ランダム カット ツリー (ロバスト ランダム カット フォレスト モデルの木) の観測値の数。3 以上の正の整数スカラーとして指定します。
例: NumObservationsPerLearner=100
データ型: single
| double
PredictorNames
— 予測子変数名
一意な名前の string 配列 | 一意な文字ベクトルの cell 配列
この プロパティ は読み取り専用です。
予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames
の機能は、予測子データの提供方法によって決まります。
Tbl
を指定した場合、PredictorNames
を使用して使用する予測子変数を指定できます。つまり、rrcforest
は、PredictorNames
の予測子変数のみを使用します。PredictorNames
はTbl.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
StandardizeData
— 予測子データを標準化するためのフラグ
false
または 0
(既定値) | true
または 1
UseParallel
— 並列実行のフラグ
false
または 0
(既定値) | true
または 1
並列実行のフラグ。数値または logical の 1 (true
) または 0 (false
) として指定します。UseParallel=true
を指定した場合、関数 rrcforest
は parfor
を使用して for
ループの反復を実行します。Parallel Computing Toolbox™ がある場合、ループが並列に実行されます。
例: UseParallel=true
データ型: logical
出力引数
forest
— 学習済みのロバスト ランダム カット フォレスト モデル
RobustRandomCutForest
モデル オブジェクト
学習済みのロバスト ランダム カット フォレスト モデル。RobustRandomCutForest
モデル オブジェクトとして返されます。
オブジェクト関数 isanomaly
で forest
を使用して、新規のデータの異常を見つけることができます。
tf
— 異常インジケーター
logical 列ベクトル
異常インジケーター。logical 列ベクトルとして返されます。tf
の要素は、Tbl
または X
の対応する行の観測値が異常であれば true
、それ以外の場合は false
になります。tf
の長さは Tbl
または X
と同じです。
rrcforest
は、scores
がしきい値 (forest
の ScoreThreshold
プロパティの値) を超える観測値を異常として識別します。関数は、指定された比率 (名前と値の引数 ContaminationFraction
) の学習観測値が異常として検出されるようにしきい値を決定します。
詳細
ロバスト ランダム カット フォレスト
ロバスト ランダム カット フォレスト アルゴリズム[1]では、点によって生じるモデルの複雑度の変化に基づいて、その点を正常な点または異常として分類します。孤立森アルゴリズムと同様に、ロバスト ランダム カット フォレスト アルゴリズムでは木のアンサンブルを作成します。2 つのアルゴリズムには、木の分岐変数の選択方法と異常スコアの定義方法に違いがあります。
関数 rrcforest
は、学習観測値のロバスト ランダム カット フォレスト モデル (ロバスト ランダム カット ツリーのアンサンブル) を作成し、外れ値 (学習データ中の異常) を検出します。学習観測値の部分集合について、それぞれの木に次のように学習させます。
rrcforest
は、それぞれの木について、学習観測値から標本を非復元抽出します。rrcforest
は、分岐変数を変数の範囲に対する比率に応じて選択し、分岐位置を一様に無作為に選択することで木を成長させます。それぞれの木について、すべての標本が個別の葉ノードに到達するまでこれが繰り返されます。
分岐変数の選択に範囲情報を使用することで、無関係な変数に対してロバストなアルゴリズムになります。
異常の記述は簡単ですが、異常によって残りのデータの記述が複雑になります。そのため、モデルに異常を追加すると、森モデルのモデルの複雑度が増します[1]。関数 rrcforest
は、モデルの複雑度の変化を基に定義された異常スコアを使用して外れ値を識別します。
関数 isanomaly
は、学習済みのロバスト ランダム カット フォレスト モデルを使用してデータ中の異常を検出します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) では、汚染されていない学習データ (外れ値がないデータ) でロバスト ランダム カット フォレスト モデルに学習させ、このモデルを使用して新規のデータの異常を検出できます。新規のデータの各観測値について、それぞれの木の対応する葉ノードが特定された後、葉ノードによって生じるモデルの複雑度の変化が計算され、異常インジケーターおよび異常スコアが返されます。
異常スコア
ロバスト ランダム カット フォレスト アルゴリズムでは、collusive 変位を異常スコアとして使用します。点 x の "collusive 変位" は、森モデルのモデルの複雑度に対する x の寄与を示します。小さい正の異常スコアの値は正常な観測値を示し、大きい正の値は異常を示します。
[1]で定義されているように、木 T のモデルの複雑度 |M(T)| は、学習データ Z のすべての点についてのパスの長さ (ルート ノードから葉ノードまでの距離) の合計です。
ここで、f(y,Z,T) は木 T における y の深さです。x の変位は、x によって生じるモデルの複雑度の想定される変化を示すものと定義されます。
ここで、T' は Z – {x} の木です。Disp
(x,Z) は、x を含む葉ノードの兄弟ノードに含まれる想定される点の数です。この定義は重複や準重複に対してロバストでなく、外れ値をマスクしてしまう原因になることがあります。外れ値をマスクしないように、ロバスト ランダム カット フォレスト アルゴリズムでは、collusive 変位 CoDisp
を使用して集合 C に x と x の colluders を含めます。
ここで、T" は Z – C の木、|C| は C に対する T の部分木の点の数です。
rrcforest
の名前と値の引数 CollusiveDisplacement
の既定値は "maximal"
です。既定では、[2]で説明されているように、それぞれの木について、x の葉ノードからルート ノードまで移動して比率 Disp
(x,C)/|C| が最大になる集合 C が求められます。
を指定すると、それぞれの木について比率の平均が計算され、その平均の値を使用し collusive 変位の値が計算されます。CollusiveDisplacement
="average"
アルゴリズム
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.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、この関数を呼び出すときに名前と値の引数 UseParallel
を true
に設定します。
並列計算の全般的な情報については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2023a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)