モデル固有の異常検出
Statistics and Machine Learning Toolbox™ には、分類モデル、回帰モデル、またはクラスタリング モデルに学習させた後に適用できるモデル固有の異常検出機能が用意されています。たとえば、次のオブジェクト関数を使用して異常を検出できます。
近接行列 — ランダム フォレスト (
CompactTreeBagger
) のoutlierMeasure
マハラノビス距離 — 判別分析分類器 (
ClassificationDiscriminant
) のmahal
、混合ガウス モデル (gmdistribution
) のmahal
条件なし確率密度 — 判別分析分類器 (
ClassificationDiscriminant
) のlogp
、単純ベイズ分類器 (ClassificationNaiveBayes
) のlogp
、インクリメンタル学習用の単純ベイズ分類器 (incrementalClassificationNaiveBayes
) のlogp
詳細については、関数のリファレンス ページを参照してください。
ランダム フォレストに学習させた後の外れ値の検出
関数TreeBagger
を使用してランダム フォレスト分類器に学習させ、オブジェクト関数outlierMeasure
を使用して学習データの外れ値を検出します。
ランダム フォレスト分類器の学習
ionosphere
データ セットを読み込みます。これには、レーダー反射の品質 (Y
) と 34 個の変数の予測子データ (X
) が含まれています。レーダー反射の品質は良好 ('g'
) または不良 ('b'
) のいずれかです。
load ionosphere
ランダム フォレスト分類器に学習させます。予測子の重要度の推定に関する out-of-bag 情報を格納します。
rng("default") % For reproducibility Mdl_TB = TreeBagger(100,X,Y,Method="classification", ... OOBPredictorImportance="on");
Mdl_TB
は分類用のTreeBagger
モデル オブジェクトです。TreeBagger
は、予測子の重要度の推定を OOBPermutedPredictorDeltaError
プロパティに格納します。
近接度を使用した外れ値の検出
関数 outlierMeasure
を使用して学習データの外れ値を検出します。この関数は、学習済みランダム フォレスト内の観測値間の近接度の平均二乗に基づいて外れ値の尺度を計算します。
CMdl_TB = compact(Mdl_TB); s_proximity = outlierMeasure(CMdl_TB,X,Labels=Y);
外れ値の尺度の高い値はその観測値が外れ値であることを示します。関数isoutlier
を使用して、95 番目の百分位数に対応するしきい値を調べて外れ値を識別します。
[TF,~,U] = isoutlier(s_proximity,Percentiles=[0 95]);
外れ値の尺度のヒストグラムをプロットします。外れ値のしきい値の位置に垂直線を作成します。
histogram(s_proximity) xline(U,"r-",join(["Threshold =" U])) title("Histogram of Outlier Measures")
OOBPermutedPredictorDeltaError
プロパティに含まれる予測子の重要度の推定で選択された最も重要な 2 つの特徴量を使用して観測値を可視化します。
[~,idx] = sort(Mdl_TB.OOBPermutedPredictorDeltaError,'descend'); TF_c = categorical(TF,[0 1],["Normal Points" "Anomalies"]); gscatter(X(:,idx(1)),X(:,idx(2)),TF_c,"kr",".x",[],"on", ... Mdl_TB.PredictorNames(idx(1)),Mdl_TB.PredictorNames(idx(2)))
外れ値を除いて分類器にもう一度学習させ、外れ値の尺度のヒストグラムをプロットします。
Mdl_TB = TreeBagger(100,X(~TF,:),Y(~TF),Method="classification"); s_proximity = outlierMeasure(CMdl_TB,X(~TF,:),Labels=Y(~TF)); histogram(s_proximity) title("Histogram of Outlier Measures After Removing Outliers")
判別分析分類器に学習させた後の外れ値の検出
関数fitcdiscr
を使用して判別分析モデルに学習させ、オブジェクト関数logp
およびmahal
を使用して学習データの外れ値を検出します。
判別分析モデルの学習
フィッシャーのアヤメのデータセットを読み込みます。行列 meas
には、150 種類の花についての測定値が格納されています。変数 species
には、それぞれの花の種類がリストされています。
load fisheriris
データセット全体を使用して、判別分析モデルに学習をさせます。
Mdl = fitcdiscr(meas,species,PredictorNames= ... ["Sepal Length" "Sepal Width" "Petal Length" "Petal Width"]);
Mdl
は ClassificationDiscriminant
モデルです。
対数条件なし確率密度を使用した外れ値の検出
学習データの対数条件なし確率密度を計算します。
s_logp = logp(Mdl,meas);
密度の値が低ければ、対応する観測値が外れ値であることを示します。
関数isoutlier
を使用して、外れ値の密度の下限のしきい値を調べます。
[~,L_logp] = isoutlier(s_logp);
しきい値を使用して外れ値を識別します。
TF_logp = s_logp < L_logp;
密度の値のヒストグラムをプロットします。外れ値のしきい値の位置に垂直線を作成します。
figure histogram(s_logp) xline(L_logp,"r-",join(["Threshold =" L_logp])) title("Histogram of Log Unconditional Probability Densities ")
正常な点の観測値と異常の観測値を比較するために、関数gplotmatrix
を使用して、変数の組み合わせごとにグループ化されたヒストグラムとグループ化された散布図の行列を作成します。
TF_logp_c = categorical(TF_logp,[0 1],["Normal Points" "Anomalies"]); gplotmatrix(meas,[],TF_logp_c,"kr",".x",[],[],[],Mdl.PredictorNames)
マハラノビス距離を使用した外れ値の検出
学習データから真のラベルのクラス平均までのマハラノビス平方距離を調べます。
s_mahal = mahal(Mdl,meas,ClassLabels=species);
距離の値が大きければ、対応する観測値が外れ値であることを示します。
関数 isoutlier
を使用して、95 番目の百分位数に対応するしきい値を調べて外れ値を識別します。
[TF_mahal,~,U_mahal] = isoutlier(s_mahal,Percentiles=[0 95]);
距離のヒストグラムをプロットします。外れ値のしきい値の位置に垂直線を作成します。
figure histogram(s_mahal) xline(U_mahal,"-r",join(["Threshold =" U_mahal])) title("Histogram of Mahalanobis Distances")
関数gplotmatrix
を使用して、正常な点の観測値と異常の観測値を比較します。
TF_mahal_c = categorical(TF_mahal,[0 1],["Normal Points" "Anomalies"]); gplotmatrix(meas,[],TF_mahal_c,"kr",".x",[],[],[],Mdl.PredictorNames)
参考
outlierMeasure
| mahal
(ClassificationDiscriminant)
| mahal
(gmdistribution)
| logp
(ClassificationDiscriminant)
| logp
(ClassificationNaiveBayes)
| logp
(incrementalClassificationNaiveBayes)
| isoutlier