iforest
構文
説明
関数 iforest は、外れ値の検出と新規性の検出のための孤立森モデルの当てはめに使用します。
- 外れ値検出 (学習データ中の異常を検出) — - iforestの出力引数- tfを使用して、学習データ中の異常を検出します。
- 新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) — 汚染されていない学習データ (外れ値がないデータ) を - iforestに渡して- IsolationForestオブジェクトを作成します。そのオブジェクトと新規データをオブジェクト関数- isanomalyに渡して、新規のデータの異常を検出します。
forest = iforest(Tbl)Tbl の予測子データに対する IsolationForest オブジェクトを返します。
forest = iforest(___,Name=Value)ContaminationFraction=0.1
例
関数 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 を使用して、異なるしきい値を指定できます。例については、異常スコアのしきい値の指定を参照してください。
入力引数
予測子データ。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 ~  
 | 
| logical ベクトル | 
 | 
| 文字行列 | 行列の各行は予測子変数の名前です。名前は PredictorNamesのエントリに一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。 | 
| 文字ベクトルの cell 配列または string 配列 | 配列の各要素は予測子変数の名前です。名前は PredictorNamesのエントリに一致しなくてはなりません。 | 
| "all" | すべての予測子がカテゴリカルです。 | 
既定では、予測子データが table (Tbl) の場合、iforest は、その変数が logical ベクトル、順序付けのない categorical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列のいずれかである場合に、変数を categorical であると見なします。予測子データが行列 (X) である場合、iforest はすべての予測子が連続的であると見なします。他の予測子をカテゴリカル予測子として指定するには、名前と値の引数 CategoricalPredictors を使用してそれらを指定します。
64 個を超えるカテゴリをもつカテゴリカル変数の場合、関数 iforest は近似分割法を使用しますが、これはモデルの精度を低下させる可能性があります。
例: CategoricalPredictors="all"
データ型: single | double | logical | char | string | cell
学習データに含まれている異常の比率。範囲 [0,1] の数値スカラーとして指定します。
- ContaminationFractionの値が 0 (既定) の場合、- iforestはすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (- forestの- ScoreThresholdプロパティの値) を- scoresの最大値に設定します。
- ContaminationFractionの値が範囲 (- 0,- 1] にある場合、- iforestは指定された比率の学習観測値が異常として検出されるようにしきい値を決定します。
例: ContaminationFraction=0.1
データ型: single | double
孤立木の個数。正の整数スカラーとして指定します。
孤立森アルゴリズムで異常スコアの計算に使用されるパスの平均長さは、正常な点と異常のどちらについても、通常は 100 個の孤立木を成長させるまでに十分に収束します[1]。
例: NumLearners=50
データ型: single | double
学習データから非復元抽出する各孤立木の観測値の個数。3 以上の正の整数スカラーとして指定します。
小さい標本サイズを使用すると、密な異常、および正常な点に近い異常の検出に役立つため、孤立森アルゴリズムは小さい NumObservationsPerLearner の値で適切に機能します。ただし、N が小さい場合は標本サイズを変えて試してみる必要があります。例については、小さいデータの NumObservationsPerLearner の調査を参照してください。
例: NumObservationsPerLearner=100
データ型: single | double
この プロパティ は読み取り専用です。
予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames の機能は、予測子データの提供方法によって決まります。
- Tblを指定した場合、- PredictorNamesを使用して使用する予測子変数を指定できます。つまり、- iforestは、- 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
並列実行のフラグ。数値または logical 1 (true) または 0 (false) として指定します。UseParallel=true を指定した場合、関数 iforest は parfor を使用して for ループの反復を実行します。Parallel Computing Toolbox™ がある場合、ループが並列に実行されます。
例: UseParallel=true
データ型: logical
出力引数
学習済み孤立森モデル。IsolationForest オブジェクトとして返されます。
オブジェクト関数 isanomaly を forest で使用して、新規のデータの異常を見つけることができます。
異常インジケーター。logical 列ベクトルとして返されます。tf の要素は、Tbl または X の対応する行の観測値が異常であれば true、それ以外の場合は false になります。tf の長さは Tbl または X と同じです。
iforest は、scores がしきい値 (forest の ScoreThreshold プロパティの値) を超える観測値を異常として識別します。関数は、指定された比率 (名前と値の引数 ContaminationFraction) の学習観測値が異常として検出されるようにしきい値を決定します。
詳細
孤立森アルゴリズム[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 に近いスコア値は正常な点を示しています。 
ヒント
アルゴリズム
iforest は、Tbl に含まれている NaN、'' (空の文字ベクトル)、"" (空の string)、<missing>、<undefined> の値と X に含まれている NaN 値を欠損値と見なします。
iforest は、欠損値を含む観測値を使用して、それらの観測値が有効な値をもつ変数の分岐を特定します。それらの観測値は、葉ノードではなく枝ノードに配置されることがあります。その場合、iforest は、ルート ノードから枝ノードまでの距離を使用して異常スコアを計算します。すべての値が欠損値である観測値はルート ノードに配置されるため、スコア値は 1 になります。
参照
[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.
拡張機能
並列実行するには、この関数を呼び出すときに名前と値の引数 UseParallel を true に設定します。
並列計算の全般的な情報については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
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)