異常検出のさまざまな手法の学習

異常検出のさまざまな手法の学習

ソースノード: 1867449

Standard Scaler を使用してデータを正規化し、散布図をプロットしました。

ここで、DBSCAN をインポートしてクラスターにポイントを与えます。 失敗すると、-1 が表示されます。

これで結果が得られましたが、最小値、最大値、および -1 値があるかどうかを確認するにはどうすればよいでしょうか。 arg min 値を使用して、クラスター内の最小値を確認します。

結果から、-1 である XNUMX つの値を見ることができます。

散布図をプロットしてみましょう。

適用した上記の方法は、単変量外れ値に関するものです。

多変量の外れ値を検出するには、多変量の外れ値を理解する必要があります。

たとえば、車の測定値を取ります。 XNUMX つは走行距離計で、車両の移動速度を記録または測定します。もう XNUMX つは、車の車輪が XNUMX 分間に回転する回数を記録する rpm の読み取り値です。

走行距離計が 0 ~ 60 mph の範囲で表示され、rpm が 0 ~ 750 であるとします。 来るすべての値は互いに相関していると仮定します。 走行距離計が 50 速度を示し、rpm が 0 インテークを示している場合、読み取り値は正しくありません。 走行距離計がゼロより大きい値を示している場合、それは車が動いていたことを意味するため、rpm はより高い値を持つはずですが、この場合は値 0 を示しています。 すなわち、多変量外れ値。

C. マハラノビス距離法

DBSCAN ではユークリッド距離メトリックを使用しましたが、この場合はマハラノビス距離法について話しています。 DBSCAN でマハラノビス距離を使用することもできます。

DBSCAN(eps=0.5, min_samples=3, metric='mahalanobis', metric_params={'V':np.cov(X)}, algorithm='brute', leaf_size=30, n_jobs=-1)

ユークリッドが相互に相関するエンティティに適していないのはなぜですか? ユークリッド距離では、XNUMX つの点がどれだけ近いかについて、データが見つからないか、誤ったデータが返されます。

マハラノビス法では、点間の距離ときれいなデータである分布を使用します。 多くの場合、ユークリッド距離は XNUMX 点間であり、その z スコアは x から平均を引いて標準偏差で割って計算されます。 マハラノビスでは、z スコアは x から平均を引いて共分散行列で割ったものです。

では、共分散行列で除算するとどのような効果があるでしょうか? データセット内の変数が高度に相関している場合、共分散値は高くなります。

同様に、共分散値が低い場合、データが相関していなければ、距離は大幅に減少しません。 変数の問題の規模と相関の両方に対処できるほどうまく機能します。

Code

データセットはから取得できます メインの Anomaly-/caret.csv · aster28/Anomaly- (github.com)

df = pd.read_csv('caret.csv').iloc[:, [0,4,6]] df.head()

関数距離を x= なし、データ= なし、共分散 = なしと定義しました。 関数内では、データの平均を取り、そこで値の共分散値を使用しました。 それ以外の場合は、共分散行列を計算します。 T は転置を表します。

たとえば、配列サイズが XNUMX または XNUMX で、それを XNUMX つの変数にしたい場合、行列を転置する必要があります。

np.random.multivariate_normal(mean, cov, size = 5)
array([[ 0.0509196, 0.536808 ], [ 0.1081547, 0.9308906], [ 0.4545248, 1.4000731], [ 0.9803848, 0.9660610], [ 0.8079491 , 0.9687909]])
np.random.multivariate_normal(mean, cov, size = 5).T
array([[ 0.0586423, 0.8538419, 0.2910855, 5.3047358, 0.5449706], [ 0.6819089, 0.8020285, 0.7109037, 0.9969768, -0.7155739]])

線形代数であり、線形代数で実行されるさまざまな機能を持つ sp.linalg を使用しました。 行列を逆にする inv 関数があります。 行列の乗算の手段としての NumPy ドット。

import scipy as sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) cov でない場合: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) left = np.dot(x_m, inv_cov) m_distance = np.dot(left, x_m.T) return m_distance.diagonal() df_g= df[['carat', 'depth', 'price' ]].head(50) df_g['m_distance'] = distance(x=df_g, data=df[['carat', 'depth', 'price']]) df_g.head()

B. 外れ値検出のための Tukey の方法

Tukey 法は、Box and Whisker または Box plot 法とも呼ばれます。

テューキー法はアッパーレンジとロワーレンジを利用します。

上限範囲 = 75 パーセンタイル -k*IQR

下限 = 25 パーセンタイル + k* IQR

箱ひげ図を使用して、年齢変数を持つタイタニック号のデータを見てみましょう。

sns.boxplot(タイタニック['年齢'].値)

画像では、Seaborn によって作成されたボックス ブロットが、55 歳から 80 歳までの多くのドットが四分位数内にない外れ値であることを示しています。 関数 outliers_detect を作成して、範囲の下限と上限を検出します。

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) 最初の = np.quantile(x, .25) 75番目の = np.quantile(x, .XNUMX) # IQR 計算 iqr = XNUMX 番目 - XNUMX 番目 #上限レンジと下限レンジ 下限 = XNUMX 番目 - (k * iqr) 上限 = XNUMX 番目 + (k * iqr) 下限、上限を返す
outliers_detect(タイタニック['年齢']、k = 1.5)
(2.5、54.5)

D. PyCaret による検出

PyCaret による検出に同じデータセットを使用します。

pycaret.anomaly import * setup_anomaly_data = setup(df) から

Pycaret は、教師なし学習モデルを使用して外れ値を検出するオープンソースの機械学習です。 pycaret 自体でデータセットを使用するための get_data メソッド、検出前の前処理タスクのための set_up があり、通常はデータ フレームを取得しますが、ignore_features などの他の多くの機能も備えています。

アルゴリズムを使用するためのその他のメソッド create_model。 最初に Isolation Forest を使用します。

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["異常"] == 1] print(ifor_anomaly.head()) print( ifor_anomaly.shape)

異常 1 は外れ値を示し、異常 0 は外れ値がないことを示します。

ここの黄色は外れ値を示します。

次に、別のアルゴリズム、K Nearest Neighbors (KNN) を見てみましょう。

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["異常"] == 1] knn_anomaly.head() knn_anomaly.shape

ここで、クラスタリング アルゴリズムを使用します。

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["異常"] == 1] print(clus_anomaly.head()) clus_anomaly.形

E. PyOD による異常検出

PyOD は、多変量データの外れ値を検出するための Python ライブラリです。 教師あり学習と教師なし学習の両方に適しています。

pyod.models.iforest から pyod.models.knn から IForest をインポート KNN をインポート 

ライブラリとアルゴリズムをインポートしました。

from pyod.utils.data import generate_data from pyod.utils.data import evaluate_print from pyod.utils.example import 視覚化 train= 300 test=100 contaminate = 0.1 、n_features=2、汚染=汚染、random_state=42)
cname_alg = 'KNN' # アルゴリズムの名前は K Nearest Neighbors c = KNN() c.fit(X_train) # アルゴリズムを当てはめる y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("トレーニング データ:") evaluate_print(cname_alg, y_train, y_train_scores) print("テスト データ:") evaluate_print(cname_alg, y_test, y_test_scores) 視覚化(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=True, save_figure=True)

IForest アルゴリズムを使用します。

fname_alg = 'IForest' # アルゴリズムの名前は K Nearest Neighbors f = IForest() f.fit(X_train) # アルゴリズムに適合 y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.predict(X_test) y_test_scores = c.decision_function(X_test) print("トレーニング データ:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("テスト データ:") evaluate_print(fname_alg, y_test_pred, y_test_scores) 視覚化(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

F. Prophet による異常検出

時系列の航空旅客データセットを使用します main · aster28/prophet (github.com) の prophet/example_air_passengers.csv

import prophet from prophet import Forecaster from prophet import Prophet m = Prophet()
data = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

y 列の Log は、負の値を許可しません。 データをトレーニング、テストに分割し、変数の予測に予測を保存しました。

列車、テスト= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) 予測= m.predict(テスト) def detect(予測): forcast = 予測[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['異常']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range return forcast
検出(予測)

異常を -1 としました。

まとめ

特定のデータセットで外れ値を見つけるプロセスは、異常検出と呼ばれます。 外れ値は、データセット内の残りのオブジェクト値から際立っており、正常に動作しないデータ オブジェクトです。

異常検出タスクでは、距離ベースおよび密度ベースのクラスタリング手法を使用して、外れ値をクラスターとして識別できます。

ここでは、異常検出のさまざまな方法について説明し、タイタニック、飛行機の乗客、キャレットの XNUMX つのデータセットのコードを使用して説明します。

キーポイント

1. 外れ値または異常検出は、Box-Whisker 法または DBSCAN を使用して検出できます。

2. 無相関項目はユークリッド距離法を採用。

3. マハラノビス法は、多変量外れ値で使用されます。

4. すべての値またはポイントが外れ値ではない。 いくつかはゴミであるべきノイズです。 外れ値は、調整が必要な有効なデータです。

5. 異常値が 0 で黄色で表示され、異常値が XNUMX の場合は異常値なしのさまざまなアルゴリズムを使用して、異常値の検出に PyCaret を使用しました。

6. Python の外れ値検出ライブラリである PyOD を使用しました。 40以上のアルゴリズムがあります。 監視ありおよび監視なしの手法が使用されます。

7. Prophet を使用し、外れ値を概説するために関数 detect を定義しました。

この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。

タイムスタンプ:

より多くの 分析Vidhya