Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

教師なし異常検出

このトピックでは、Statistics and Machine Learning Toolbox™ で使用できる多変量の標本データ向けの教師なし異常検出機能を紹介し、それらの機能による外れ値検出 (学習データ中の異常を検出) と新規性の検出 (汚染されていない学習データで新規のデータの異常を検出) のワークフローについて説明します。

ラベル付けされていない多変量の標本データについて、孤立森、1 クラス サポート ベクター マシン (OCSVM)、およびマハラノビス距離を使用して異常を検出できます。これらの手法では、モデルに学習させるかパラメーターを学習することで外れ値を検出します。新規性の検出では、汚染されていない学習データ (外れ値がないデータ) でモデルに学習させるかパラメーターを学習し、学習させたモデルまたは学習したパラメーターを使用して新規のデータの異常を検出します。

  • 孤立森 — 孤立森アルゴリズムでは、孤立木のアンサンブルを使用して異常を正常な点から分離することで異常を検出します。関数 iforest を使用して外れ値を検出し、オブジェクト関数 isanomaly を使用して新規性を検出します。

  • 1 クラス サポート ベクター マシン (OCSVM) — 1 クラス学習 (教師なし SVM) では、変換された高次元予測子空間で原点からのデータの分離を試みます。関数 fitcsvm を使用して OCSVM モデルに学習させてから、オブジェクト関数 resubPredictpredict をそれぞれ使用して外れ値と新規性を検出します。

  • マハラノビス距離 — 標本データが多変量正規分布に従っている場合、標本から分布までのマハラノビス平方距離はカイ二乗分布に従います。したがって、この距離を使用してカイ二乗分布の棄却限界値に基づいて異常を検出できます。外れ値の検出では、関数 robustcov を使用してロバストなマハラノビス距離を計算します。新規性の検出では、関数 robustcovpdist2 を使用してマハラノビス距離を計算できます。

外れ値検出

この例では、3 つの教師なし異常検出法 (孤立森、OCSVM、およびマハラノビス距離) による外れ値の検出のワークフローを示します。

データの読み込み

変数 featactid を含む humanactivity データ セットを読み込みます。変数 feat には、24,075 個の観測値に関する 60 個の特徴量から成る予測子データ行列が格納され、応答変数 actid には、観測値の身体動作 ID が整数として格納されています。この例では、変数 feat を異常検出に使用します。

load humanactivity

変数 feat のサイズを調べます。

[N,D] = size(feat)
N = 24075
D = 60

データに含まれる外れ値の比率が 0.05 であると仮定します。

contaminationFraction = 0.05;

孤立森

関数iforestを使用して外れ値を検出します。

関数 iforest を使用して孤立森モデルに学習させます。外れ値の比率 (ContaminationFraction) を 0.05 と指定します。

rng("default") % For reproducibility
[forest,tf_forest,s_forest] = iforest(feat, ...
    ContaminationFraction=contaminationFraction);

forestIsolationForestオブジェクトです。iforest は、データ (feat) の異常インジケーター (tf_forest) および異常スコア (s_forest) も返します。iforest は、指定した比率の観測値が外れ値として検出されるようにスコアのしきい値 (forest.ScoreThreshold) を決定します。

スコア値のヒストグラムをプロットします。指定した比率に対応するスコアのしきい値に垂直線を作成します。

figure
histogram(s_forest,Normalization="probability")
xline(forest.ScoreThreshold,"k-", ...
    join(["Threshold =" forest.ScoreThreshold]))
title("Histogram of Anomaly Scores for Isolation Forest")

Figure contains an axes object. The axes object with title Histogram of Anomaly Scores for Isolation Forest contains 2 objects of type histogram, constantline.

データ中の検出された異常の比率を確認します。

OF_forest = sum(tf_forest)/N
OF_forest = 0.0496

しきい値におけるスコアが同じになる値があると、外れ値の比率が指定した比率 (0.05) よりも小さくなることがあります。

1 クラス サポート ベクター マシン (OCSVM)

関数fitcsvmを使用して OCSVM モデルに学習させてから、関数resubPredictを使用して外れ値を検出します。

関数 fitcsvm を使用して 1 クラス学習用のサポート ベクター マシン モデルに学習させます。クラス ラベル変数が 1 のベクトルの場合、関数は 1 クラス学習用にモデルに学習させます。外れ値の比率 (OutlierFraction) を 0.05 と指定します。

Mdl = fitcsvm(feat,ones(size(feat,1),1), ...
    OutlierFraction=contaminationFraction, ...
    KernelScale="auto",Standardize=true);

Mdl は、ClassificationSVM オブジェクトです。

関数 resubPredict を使用して feat の外れ値のスコアを計算します。

[~,s_OCSVM] = resubPredict(Mdl);

負のスコア値は、対応する観測値が外れ値であることを示します。異常インジケーターを取得します。

tf_OCSVM = s_OCSVM < 0;

スコア値のヒストグラムをプロットします。

figure
histogram(s_OCSVM,Normalization="probability");
xline(0,"k-","Threshold = 0")
title("Histogram of Anomaly Scores for OCSVM")

Figure contains an axes object. The axes object with title Histogram of Anomaly Scores for OCSVM contains 2 objects of type histogram, constantline.

データ中の検出された異常の比率を確認します。

OF_OCSVM = sum(tf_OCSVM)/N
OF_OCSVM = 0.0500

fitcsvm は、指定された比率の学習観測値が負のスコアになるように SVM モデルのバイアス項に学習させます。そのため、OF_OCSVM は指定した比率の値に近くなります。

マハラノビス距離

関数robustcovを使用して、ロバストなマハラノビス距離、およびデータの平均と共分散のロバスト推定値を計算します。

関数 robustcov を使用して、feat から feat の分布までのマハラノビス距離を計算します。外れ値の比率 (OutlierFraction) を 0.05 と指定します。robustcov は、95% を超える観測値の共分散行列式を最小化します。

[sigma,mu,s_robustcov,tf_robustcov_default] = robustcov(feat, ...
    OutlierFraction=contaminationFraction);

robustcov は、ロバスト共分散行列の推定値 (sigma) とロバスト平均の推定値 (mu) を求めます。これらは、関数 cov および mean からの推定値よりも外れ値の影響が少なくなります。関数 robustcov は、マハラノビス距離 (s_robustcov) と外れ値インジケーター (tf_robustcov_default) も計算します。関数は、既定ではデータ セットが多変量正規分布に従うものと仮定し、カイ二乗分布の棄却限界値に基づいて入力観測値の 2.5% を外れ値として識別します。

データ セットが正規性の仮定を満たす場合、マハラノビス平方距離は自由度 D のカイ二乗分布に従います。ここで、D はデータの次元です。その場合、関数 chi2inv を使用して、指定した比率の観測値を外れ値として検出する新しいしきい値を見つけることができます。

s_robustcov_threshold = sqrt(chi2inv(1-contaminationFraction,D));
tf_robustcov = s_robustcov > s_robustcov_threshold;

距離-距離プロット (DD プロット) を作成して、データの多変量正規性を確認します。

figure
d_classical = pdist2(feat,mean(feat),"mahalanobis");
gscatter(d_classical,s_robustcov,tf_robustcov,"kr",".x")
xline(s_robustcov_threshold,"k-")
yline(s_robustcov_threshold,"k-", ...
    join(["Threshold = " s_robustcov_threshold]));
l = refline([1 0]);
l.Color = "k";
xlabel("Mahalanobis Distance")
ylabel("Robust Distance")
legend("Normal Points","Outliers",Location="northwest")
title("Distance-Distance Plot")

Figure contains an axes object. The axes object with title Distance-Distance Plot contains 5 objects of type line, constantline. These objects represent Normal Points, Outliers.

正常な点が見えるように座標軸を拡大します。

xlim([0 10])
ylim([0 10])

Figure contains an axes object. The axes object with title Distance-Distance Plot contains 5 objects of type line, constantline. These objects represent Normal Points, Outliers.

データ セットが多変量正規分布に従っていれば、データ点が 45 度の基準線の周囲に密集します。この DD プロットは、データ セットが多変量正規分布に従っていないことを示しています。

データ セットが正規性の仮定を満たさないため、累積確率に対する距離の値の分位数 (1 — contaminationFraction) を使用してしきい値を見つけます。

s_robustcov_threshold = quantile(s_robustcov,1-contaminationFraction);

新しいしきい値 s_robustcov_threshold を使用して feat の異常インジケーターを取得します。

tf_robustcov = s_robustcov > s_robustcov_threshold;

データ中の検出された異常の比率を確認します。

OF_robustcov = sum(tf_robustcov)/N
OF_robustcov = 0.0500

検出された外れ値の比較

検出された外れ値を可視化するには、関数tsneを使用してデータの次元を削減します。

rng("default") % For reproducibility
T = tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20);

削減した次元で正常な点と外れ値をプロットします。孤立森、OCSVM モデル、および robustcov からのロバストなマハラノビス距離の 3 つの手法について結果を比較します。

figure
tiledlayout(2,2)
nexttile
gscatter(T(:,1),T(:,2),tf_forest,"kr",".x",[],"off")
title("Isolation Forest")
nexttile(3)
gscatter(T(:,1),T(:,2),tf_OCSVM,"kr",".x",[],"off")
title("OCSVM")
nexttile(4)
gscatter(T(:,1),T(:,2),tf_robustcov,"kr",".x",[],"off")
title("Robust Mahalanobis Distance")
l = legend("Normal Points","Novelties");
l.Layout.Tile = 2;

Figure contains 3 axes objects. Axes object 1 with title Isolation Forest contains 2 objects of type line. Axes object 2 with title OCSVM contains 2 objects of type line. Axes object 3 with title Robust Mahalanobis Distance contains 2 objects of type line. These objects represent Normal Points, Novelties.

3 つの手法で識別された新規性は、削減した次元では互いに近い位置にあります。3 つの手法に共通の外れ値の比率を計算します。

sum(tf_forest.*tf_OCSVM.*tf_robustcov)/N
ans = 0.0298

3 つの手法で約 3% のデータ (feat) を外れ値として識別しています。

また、関数fsulaplacianで選択された最も重要な 2 つの特徴量を使用して観測値を可視化することもできます。

idx = fsulaplacian(feat);
figure
t = tiledlayout(2,2);
nexttile
gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_forest,"kr",".x",[],"off")
title("Isolation Forest")
nexttile(3)
gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_OCSVM,"kr",".x",[],"off")
title("OCSVM")
nexttile(4)
gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_robustcov,"kr",".x",[],"off")
title("Mahalanobis Distance")
l = legend("Normal Points","Novelties");
l.Layout.Tile = 2;
xlabel(t,join(["Column" idx(1)]))
ylabel(t,join(["Column" idx(2)]))

Figure contains 3 axes objects. Axes object 1 with title Isolation Forest contains 2 objects of type line. Axes object 2 with title OCSVM contains 2 objects of type line. Axes object 3 with title Mahalanobis Distance contains 2 objects of type line. These objects represent Normal Points, Novelties.

新規性の検出

この例では、3 つの教師なし異常検出法 (孤立森、OCSVM、およびマハラノビス距離) による新規性の検出のワークフローを示します。

データの読み込み

変数 featactid を含む humanactivity データ セットを読み込みます。変数 feat には、24,075 個の観測値に関する 60 個の特徴量から成る予測子データ行列が格納され、応答変数 actid には、観測値の身体動作 ID が整数として格納されています。この例では、変数 feat を異常検出に使用します。

load humanactivity

関数cvpartitionを使用して、データを学習セットと検定セットに分割します。観測値の 50% を学習データとして使用し、観測値の 50% を新規性の検出用の検定データとして使用します。

rng("default") % For reproducibility 
c = cvpartition(actid,Holdout=0.50);
trainingIndices = training(c); % Indices for the training set
testIndices = test(c); % Indices for the test set
XTrain = feat(trainingIndices,:);
XTest = feat(testIndices,:);

学習データは汚染されていない (外れ値がない) ものと仮定します。

学習セットと検定セットのサイズを調べます。

[N,D] = size(XTrain)
N = 12038
D = 60
NTest = size(XTest,1)
NTest = 12037

孤立森

関数iforestを使用して孤立森モデルに学習させた後、オブジェクト関数isanomalyを使用して新規性を検出します。

孤立森モデルに学習させます。

[forest,tf_forest,s_forest] = iforest(XTrain);

forestIsolationForestオブジェクトです。iforest は、学習データ (XTrain) の異常インジケーター (tf_forest) および異常スコア (s_forest) も返します。既定では、iforest はすべての学習観測値を正常な観測値として扱い、スコアのしきい値 (forest.ScoreThreshold) を最大のスコア値に設定します。

学習済み孤立森モデルとオブジェクト関数 isanomaly を使用して、XTest 内の新規性を調べます。関数 isanomaly は、スコアがしきい値 (forest.ScoreThreshold) を超える観測値を新規性として識別します。

[tfTest_forest,sTest_forest] = isanomaly(forest,XTest);

関数 isanomaly は、新規データの異常インジケーター (tfTest_forest) および異常スコア (sTest_forest) を返します。

スコア値のヒストグラムをプロットします。スコアのしきい値の位置に垂直線を作成します。

figure
histogram(s_forest,Normalization="probability")
hold on
histogram(sTest_forest,Normalization="probability")
xline(forest.ScoreThreshold,"k-", ...
    join(["Threshold =" forest.ScoreThreshold]))
legend("Training data","New data",Location="southeast")
title("Histograms of Anomaly Scores for Isolation Forest")
hold off

Figure contains an axes object. The axes object with title Histograms of Anomaly Scores for Isolation Forest contains 3 objects of type histogram, constantline. These objects represent Training data, New data.

検定データの異常スコア分布が学習データの異常スコア分布と類似しているため、isanomaly で検出された検定データ中の異常が少ないことがわかります。

検定データ中の検出された異常の比率を確認します。

NF_forest = sum(tfTest_forest)/NTest
NF_forest = 8.3077e-05

検定データ中にある異常の観測値のインデックスを表示します。

idx_forest = find(tfTest_forest)
idx_forest = 3422

1 クラス サポート ベクター マシン (OCSVM)

関数fitcsvmを使用して OCSVM モデルに学習させてから、オブジェクト関数predictを使用して新規データの異常を検出します。

関数 fitcsvm を使用して 1 クラス学習用のサポート ベクター マシン モデルに学習させます。クラス ラベル変数が 1 のベクトルの場合、関数は 1 クラス学習用にモデルに学習させます。外れ値の比率 (OutlierFraction) を 0 と指定します。

Mdl = fitcsvm(XTrain,ones(size(XTrain,1),1),OutlierFraction=0, ...
    KernelScale="auto",Standardize=true);

Mdl は、ClassificationSVM オブジェクトです。

関数 resubPredict を使用して XTrain の外れ値のスコアを計算します。

[~,s_OCSVM] = resubPredict(Mdl);

関数 predict を使用して XTest の新規性のスコアを計算します。

[~,sTest_OCSVM] = predict(Mdl,XTest);

負のスコア値は、対応する観測値が異常であることを示します。異常インジケーターを取得します。

tfTest_OCSVM = sTest_OCSVM < 0;

スコア値のヒストグラムをプロットします。

figure
histogram(s_OCSVM,Normalization="probability");
hold on
histogram(sTest_OCSVM,Normalization="probability");
xline(0,"k-","Threshold = 0")
legend("Training data","New Data",Location="best")
title("Histograms of Anomaly Scores for OCSVM")
hold off

Figure contains an axes object. The axes object with title Histograms of Anomaly Scores for OCSVM contains 3 objects of type histogram, constantline. These objects represent Training data, New Data.

検定データ中の検出された異常の比率を確認します。

NF_OCSVM = sum(tfTest_OCSVM)/NTest
NF_OCSVM = 0.0707

検定データ中にある異常の観測値のインデックスを表示します。

idx_OCSVM = find(tfTest_OCSVM)
idx_OCSVM = 851×1

        1061
        1443
        1444
        1445
        1447
        1448
        1449
        1450
        1451
        1453
      ⋮

マハラノビス距離

関数robustcovを使用して学習データのマハラノビス距離を計算し、関数pdist2を使用して新規データのマハラノビス距離を計算します。

関数 robustcov を使用して、XTrain から XTrain の分布までのマハラノビス距離を計算します。外れ値の比率 (OutlierFraction) を 0 と指定します。

[sigma,mu,s_mahal] = robustcov(XTrain,OutlierFraction=0);

robustcov は、共分散行列の推定値 (sigma) と平均の推定値 (mu) も返します。これらを使用して新規データの距離を計算できます。

s_mahal の最大値を新規性の検出用のスコアのしきい値として使用します。

s_mahal_threshold = max(s_mahal);

関数pdist2を使用して、XTest から XTrain の分布までのマハラノビス距離を計算します。

sTest_mahal = pdist2(XTest,mu,"mahalanobis",sigma);

XTest の異常インジケーターを取得します。

tfTest_mahal = sTest_mahal > s_mahal_threshold;

スコア値のヒストグラムをプロットします。

figure
histogram(s_mahal,Normalization="probability");
hold on
histogram(sTest_mahal,Normalization="probability");
xline(s_mahal_threshold,"k-", ...
    join(["Threshold =" s_mahal_threshold]))
legend("Training data","New Data",Location="southeast")
title("Histograms of Mahalanobis Distances")
hold off

Figure contains an axes object. The axes object with title Histograms of Mahalanobis Distances contains 3 objects of type histogram, constantline. These objects represent Training data, New Data.

検定データ中の検出された異常の比率を確認します。

NF_mahal = sum(tfTest_mahal)/NTest
NF_mahal = 8.3077e-05

検定データ中にある異常の観測値のインデックスを表示します。

idx_mahal = find(tfTest_mahal)
idx_mahal = 3654

検出された異常の比較

検出された異常を可視化するには、関数tsneを使用してデータの次元を削減します。

rng("default") % For reproducibility 
T = tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20);
XTest2D = T(testIndices,:);

削減した次元で正常な点と新規性をプロットします。孤立森、OCSVM モデル、および mahal からのマハラノビス距離の 3 つの手法について結果を比較します。

figure
tiledlayout(2,2)
nexttile
gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_forest,"kr",".x",[],"off")
title("Isolation Forest")
nexttile(3)
gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_OCSVM,"kr",".x",[],"off")
title("OCSVM")
nexttile(4)
gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_mahal,"kr",".x",[],"off")
title("Mahalanobis Distance")
l = legend("Normal Points","Novelties");
l.Layout.Tile = 2;

Figure contains 3 axes objects. Axes object 1 with title Isolation Forest contains 2 objects of type line. Axes object 2 with title OCSVM contains 2 objects of type line. Axes object 3 with title Mahalanobis Distance contains 2 objects of type line. These objects represent Normal Points, Novelties.

孤立森アルゴリズムで識別された新規性 (idx_forest) とマハラノビス距離で識別された新規性 (idx_mahal) は別のものですが、削減した次元では互いに近い位置にあります。

OCSVM で識別された新規性に孤立森アルゴリズムとマハラノビス距離で識別された新規性が含まれているかどうかを確認します。

ismember(idx_forest,idx_OCSVM)
ans = logical
   1

ismember(idx_mahal,idx_OCSVM)
ans = logical
   1

また、関数fsulaplacianで選択された最も重要な 2 つの特徴量を使用して観測値を可視化することもできます。

idx = fsulaplacian([XTrain; XTest]);
figure
t = tiledlayout(2,2);
nexttile
gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_forest,"kr",".x",[],"off")
title("Isolation Forest")
nexttile(3)
gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_OCSVM,"kr",".x",[],"off")
title("OCSVM")
nexttile(4)
gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_mahal,"kr",".x",[],"off")
title("Mahalanobis Distance")
l = legend("Normal Points","Novelties");
l.Layout.Tile = 2;
xlabel(t,join(["Column" idx(1)]))
ylabel(t,join(["Column" idx(2)]))

Figure contains 3 axes objects. Axes object 1 with title Isolation Forest contains 2 objects of type line. Axes object 2 with title OCSVM contains 2 objects of type line. Axes object 3 with title Mahalanobis Distance contains 2 objects of type line. These objects represent Normal Points, Novelties.

参考

| | | | | |

関連するトピック