IsolationForest
説明
外れ値の検出および新規性の検出に孤立森 (孤立木のアンサンブル) モデル オブジェクト IsolationForest を使用します。
外れ値検出 (学習データ中の異常を検出) — 関数
iforestを使用して、学習データ中の異常を検出します。関数iforestは、IsolationForestオブジェクトをビルドし、学習データの異常インジケーターおよびスコアを返します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を
iforestに渡してIsolationForestオブジェクトを作成し、このオブジェクトおよび新規データをオブジェクト関数isanomalyに渡して新規のデータの異常を検出します。関数isanomalyは、新規データの異常インジケーターおよびスコアを返します。
作成
関数 iforest を使用して、IsolationForest オブジェクトを作成します。
プロパティ
この プロパティ は読み取り専用です。
カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。CategoricalPredictors には、対応する予測子がカテゴリカルであることを示すインデックス値が格納されます。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。
この プロパティ は読み取り専用です。
学習データに含まれている異常の比率。範囲 [0,1] の数値スカラーとして指定します。
ContaminationFractionの値が 0 の場合、iforestはすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (ScoreThresholdプロパティの値) を学習データの異常スコアの最大値に設定します。ContaminationFractionの値が範囲 (0,1] にある場合、iforestは、指定した比率の学習観測値が異常として検出されるように、しきい値 (ScoreThresholdプロパティの値) を決定します。
この プロパティ は読み取り専用です。
孤立木の個数。正の整数スカラーとして指定します。
この プロパティ は読み取り専用です。
学習データから各孤立木を非復元抽出する観測値の個数。正の整数スカラーとして指定します。
この プロパティ は読み取り専用です。
予測子変数の名前。文字ベクトルの cell 配列を指定します。PredictorNames の要素の順序は、予測子名が学習データに現れる順序に対応します。
この プロパティ は読み取り専用です。
学習データに含まれている異常の識別に使用される異常スコアのしきい値。範囲 [0,1] の数値スカラーとして指定します。
しきい値を超える異常スコアをもつ観測値が異常であると識別されます。
関数
iforestは、指定した比率 (ContaminationFractionプロパティ) の学習観測値が異常として検出されるように、しきい値を決定します。
オブジェクト関数
isanomalyは、ScoreThresholdプロパティの値を名前と値の引数ScoreThresholdの既定値として使用します。
オブジェクト関数
isanomaly | 孤立森を使用したデータ中の異常の検出 |
例
関数 iforest を使用して、外れ値 (学習データ中の異常) を検出します。
標本データ セット 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
SALEDATE 列は datetime 配列です。iforest ではサポートされていません。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 個を超えるカテゴリをもつカテゴリカル変数の場合、関数 iforest は近似分割法を使用しますが、これは孤立森モデルの精度を低下させる可能性があります。254 個のカテゴリをもつカテゴリカル変数が含まれている NEIGHBORHOOD 列を削除します。
NYCHousing2015.NEIGHBORHOOD = [];
NYCHousing2015 用に孤立森モデルに学習させます。学習観測値に含まれている異常の比率を 0.1 に指定し、最初の変数 (BOROUGH) をカテゴリカル予測子として指定します。最初の変数は数値配列であるため、この変数をカテゴリカル変数として指定しない限り、iforest により連続変数であると仮定されます。
rng("default") % For reproducibility [Mdl,tf,scores] = iforest(NYCHousing2015,ContaminationFraction=0.1, ... CategoricalPredictors=1);
Mdl は IsolationForest オブジェクトです。iforest は、学習データ NYCHousing2015 の異常インジケーター (tf) および異常スコア (scores) も返します。
スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。
histogram(scores) xline(Mdl.ScoreThreshold,"r-",["Threshold" Mdl.ScoreThreshold])

異なる汚染の比率 (たとえば 0.01) で異常を識別する場合は、新しい孤立森モデルに学習させることができます。
rng("default") % For reproducibility [newMdl,newtf,scores] = iforest(NYCHousing2015, ... ContaminationFraction=0.01,CategoricalPredictors=1);
異なるスコアのしきい値 (たとえば 0.65) で異常を識別する場合は、IsolationForest オブジェクト、学習データ、および新しいしきい値を関数 isanomaly に渡せます。
[newtf,scores] = isanomaly(Mdl,NYCHousing2015,ScoreThreshold=0.65);
汚染の比率またはスコアのしきい値を変更すると異常インジケーターのみが変更され、異常スコアは影響を受けないことに注意してください。したがって、iforest または isanomaly を使用して異常スコアを再度計算しない場合、既存のスコア値で新しい異常インジケーターを取得できます。
学習データ中の異常の比率を 0.01 に変更します。
newContaminationFraction = 0.01;
関数quantileを使用して、新しいスコアのしきい値を求めます。
newScoreThreshold = quantile(scores,1-newContaminationFraction)
newScoreThreshold = 0.7045
新しい異常インジケーターを取得します。
newtf = scores > newScoreThreshold;
関数 iforest を使用して、汚染されていない学習観測値用の IsolationForest オブジェクトを作成します。次に、オブジェクトおよび新規データをオブジェクト関数 isanomaly に渡して、新規性 (新規データ中の異常) を検出します。
census1994.mat に保存されている 1994 年の国勢調査データを読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するための、米国勢調査局の人口統計データから構成されます。
load census1994census1994 には学習データ セット adultdata およびテスト データ セット adulttest が含まれています。
adultdata 用に孤立森モデルに学習させます。adultdata には外れ値が含まれていないと仮定します。
rng("default") % For reproducibility [Mdl,tf,s] = iforest(adultdata);
Mdl は IsolationForest オブジェクトです。iforest は、学習データ adultdata の異常インジケーター tf および異常スコア s も返します。名前と値の引数 ContaminationFraction を 0 を超える値として指定していない場合、iforest はすべての学習観測値を正常な観測値として扱います。つまり tf の値はすべて logical 0 (false) となります。この関数によりスコアのしきい値が最大のスコア値に設定されます。しきい値を表示します。
Mdl.ScoreThreshold
ans = 0.8600
学習済み孤立森モデルを使用して、adulttest 内の異常を見つけます。
[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 = 15655
テスト データの異常スコア分布は学習データの異常スコア分布と類似しているため、isanomaly は既定のしきい値でテスト データ中にある少数の異常を検出します。名前と値のペア ScoreThreshold を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
詳細
孤立森アルゴリズム[1]は、孤立木のアンサンブルを使用して異常を正常な点から分離することにより、異常を検出します。
関数 iforest は、学習観測値の孤立森モデル (孤立木のアンサンブル) を作成し、外れ値 (学習データ中の異常) を検出します。学習観測値の部分集合について、各孤立木に次のように学習させます。
iforestは、それぞれの木について、学習観測値から標本を非復元抽出します。iforestは、分岐変数と分岐位置を一様に無作為に選択することで木を成長させます。それぞれの木について、すべての標本が個別の葉ノードに到達するまでこれが繰り返されます。
このアルゴリズムでは、データ中の異常は数が少なく、正常な点と異なるものであると仮定します。そのため、異常はルート ノードに近い個別の葉ノードに到達し、パスの長さ (ルート ノードから葉ノードまでの距離) が正常な点より短くなります。関数 iforest は、すべての孤立木に対するパスの平均長さを基に定義された異常スコアを使用して外れ値を識別します。
関数 isanomaly は、学習済み孤立森モデルを使用してデータ中の異常を検出します。新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) では、汚染されていない学習データ (外れ値がないデータ) で孤立森モデルに学習させ、このモデルを使用して新規のデータの異常を検出できます。新規のデータの各観測値について、それぞれの木の対応する葉ノードが特定された後、学習済み孤立森モデルのルート ノードから葉ノードに到達するパスの平均長さが計算され、異常インジケーターおよび異常スコアが返されます。
詳細については、孤立森による異常検出を参照してください。
孤立森アルゴリズムでは、パスの長さ h(x) を正規化することにより、観測値 x の異常スコア s(x) を計算します。
ここで、E[h(x)] は孤立森中にある孤立木すべてに関するパスの平均長さで、c(n) は n 個の観測値の二分探索木で失敗した探索のパスの平均長さです。
スコアは E[h(x)] が 0 に近づくにつれて 1 に近づきます。したがって、1 に近いスコア値は異常を示しています。
スコアは E[h(x)] が n – 1 に近づくにつれて 0 に近づきます。また、スコアは E[h(x)] が c(n) に近づくとき 0.5 に近づきます。したがって、0.5 より小さく 0 に近いスコア値は正常な点を示しています。
ヒント
lime、shapley、partialDependence、plotPartialDependenceなどの解釈可能性機能を使用して、異常スコアに対する予測子の寄与の程度を解釈できます。異常スコアを返すカスタム関数を定義してから、そのカスタム関数を解釈可能性関数に渡します。例については、関数ハンドルを使用したモデルの指定を参照してください。
参照
[1] Liu, F. T., K. M. Ting, and Z. Zhou. "Isolation Forest," 2008 Eighth IEEE International Conference on Data Mining. Pisa, Italy, 2008, pp. 413-422.
バージョン履歴
R2021b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)