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