Tìm hiểu các kỹ thuật phát hiện bất thường khác nhau

Tìm hiểu các kỹ thuật phát hiện bất thường khác nhau

Nút nguồn: 1867449

Chúng tôi đã sử dụng Bộ chia tỷ lệ tiêu chuẩn để làm cho dữ liệu của chúng tôi trở nên bình thường và vẽ biểu đồ phân tán.

Bây giờ chúng tôi sẽ nhập DBSCAN để cung cấp điểm cho các cụm. Nếu không thành công, nó sẽ hiển thị -1.

Bây giờ chúng tôi có kết quả, nhưng làm cách nào để kiểm tra giá trị nào là tối thiểu, tối đa và liệu chúng tôi có giá trị -1 hay không? Chúng tôi sẽ sử dụng giá trị arg min để kiểm tra giá trị nhỏ nhất trong cụm.

Chúng ta có thể thấy từ kết quả có sáu giá trị là -1.

Bây giờ hãy vẽ một biểu đồ phân tán.

Các phương pháp trên chúng tôi đã áp dụng là trên các ngoại lệ đơn biến.

Để phát hiện các giá trị ngoại lệ đa biến, chúng ta cần hiểu các giá trị ngoại lệ đa biến.

Ví dụ: chúng tôi lấy bài đọc Xe hơi. Chúng ta đã thấy hai đồng hồ chỉ số, một là đồng hồ đo quãng đường, ghi lại hoặc đo tốc độ xe đang di chuyển, và đồng hồ thứ hai là chỉ số vòng/phút ghi lại số vòng quay của bánh xe ô tô trong một phút.

Giả sử đồng hồ đo quãng đường hiển thị trong khoảng 0-60 dặm/giờ và vòng/phút trong khoảng 0-750. Chúng tôi giả định rằng tất cả các giá trị sẽ tương quan với nhau. Nếu đồng hồ đo quãng đường hiển thị tốc độ 50 và vòng tua máy hiển thị 0 lần nạp, thì kết quả đọc không chính xác. Nếu đồng hồ đo quãng đường hiển thị giá trị lớn hơn 0, điều đó có nghĩa là ô tô đang di chuyển, do đó vòng tua máy phải có giá trị cao hơn, nhưng trong trường hợp của chúng tôi, nó hiển thị giá trị XNUMX. tức là, các ngoại lệ đa biến.

C. Phương pháp khoảng cách Mahalanobis

Trong DBSCAN, chúng tôi đã sử dụng các số liệu khoảng cách euclide, nhưng trong trường hợp này, chúng tôi đang nói về phương pháp khoảng cách Mahalanobis. Chúng ta cũng có thể sử dụng khoảng cách Mahalanobis với DBSCAN.

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

Tại sao Euclidean không phù hợp với các thực thể có quan hệ tương quan với nhau? Khoảng cách Euclide không thể tìm thấy hoặc sẽ cung cấp dữ liệu không chính xác về mức độ gần của hai điểm.

Phương pháp Mahalanobis sử dụng khoảng cách giữa các điểm và phân phối là dữ liệu sạch. Khoảng cách Euclide thường nằm giữa hai điểm và điểm z của nó được tính bằng x trừ đi giá trị trung bình và chia cho độ lệch chuẩn. Trong Mahalanobis, điểm z bằng x trừ đi giá trị trung bình chia cho ma trận hiệp phương sai.

Do đó, việc chia cho ma trận hiệp phương sai có tác dụng gì? Các giá trị hiệp phương sai sẽ cao nếu các biến trong tập dữ liệu của bạn có mối tương quan cao.

Tương tự, nếu các giá trị hiệp phương sai thấp, khoảng cách không giảm đáng kể nếu dữ liệu không tương quan. Nó hoạt động tốt đến mức nó giải quyết được cả vấn đề về quy mô và mối tương quan của các biến số.

Bộ dữ liệu có thể được lấy từ Anomaly-/caret.csv tại chính · aster28/Anomaly- (github.com)

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

Chúng tôi đã xác định khoảng cách hàm là x= Không, dữ liệu= Không và Hiệp phương sai = Không. Bên trong hàm, chúng tôi lấy giá trị trung bình của dữ liệu và sử dụng giá trị hiệp phương sai của giá trị ở đó. Nếu không, chúng tôi sẽ tính toán ma trận hiệp phương sai. T là viết tắt của chuyển vị.

Ví dụ: nếu kích thước mảng là năm hoặc sáu và bạn muốn nó có hai biến, thì chúng ta cần hoán vị ma trận.

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]])

Chúng tôi đã sử dụng sp.linalg, là đại số tuyến tính và có các chức năng khác nhau được thực hiện trên đại số tuyến tính. Nó có chức năng inv để đảo ngược ma trận. NumPy dot làm phương tiện cho phép nhân của ma trận.

nhập scipy dưới dạng sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) nếu không phải 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. Phương pháp Tukey phát hiện ngoại lệ

Phương pháp Tukey cũng thường được gọi là phương pháp Box and Whisker hoặc Box plot.

Phương pháp Tukey sử dụng phạm vi Trên và dưới.

Phạm vi trên = Phần trăm thứ 75 -k*IQR

Phạm vi thấp hơn = Phân vị thứ 25 + k* IQR

Hãy cho chúng tôi xem dữ liệu Titanic của chúng tôi với biến tuổi bằng biểu đồ hộp.

sns.boxplot(titanic['age'].values)

Chúng ta có thể thấy trong hình ảnh ô vuông do Seaborn tạo ra cho thấy nhiều dấu chấm trong độ tuổi từ 55 đến 80 là ngoại lệ không nằm trong các phần tư. Chúng tôi sẽ phát hiện phạm vi thấp hơn và cao hơn bằng cách tạo một hàm outliers_detect.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) first = np.quantile(x, .25) third = np.quantile(x, .75) # Tính toán IQR iqr = thứ ba - thứ nhất #Dải trên và dải dưới thấp hơn = thứ nhất - (k * iqr) trên = thứ ba + (k * iqr) trả về dưới, trên
outliers_detect(titanic['age'], k = 1.5)
(2.5, 54.5)

D. Phát hiện bởi PyCaret

Chúng tôi sẽ sử dụng cùng một bộ dữ liệu để PyCaret phát hiện.

từ pycaret.anomaly nhập * setup_anomaly_data = setup(df)

Pycaret là một máy học mã nguồn mở sử dụng mô hình học không giám sát để phát hiện các giá trị ngoại lệ. Nó có phương thức get_data để sử dụng tập dữ liệu trong chính pycaret, set_up cho tác vụ tiền xử lý trước khi phát hiện, thường lấy khung dữ liệu nhưng cũng có nhiều tính năng khác như ign_features, v.v.

Các phương thức khác create_model để sử dụng thuật toán. Đầu tiên chúng ta sẽ sử dụng Khu rừng cách ly.

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

Điểm bất thường 1 cho biết điểm bất thường và Điểm bất thường 0 không hiển thị điểm bất thường.

Màu vàng ở đây biểu thị các ngoại lệ.

Bây giờ chúng ta hãy xem một thuật toán khác, K Hàng xóm gần nhất (KNN)

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

Bây giờ chúng ta sẽ sử dụng thuật toán phân cụm.

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomaly"] == 1] print(clus_anomaly.head()) clus_anomaly. hình dạng

E. Phát hiện bất thường bằng PyOD

PyOD là một thư viện python để phát hiện các giá trị ngoại lai trong dữ liệu đa biến. Nó tốt cho cả việc học có giám sát và không giám sát.

từ pyod.models.iforest nhập IForest từ pyod.models.knn nhập KNN 

Chúng tôi đã nhập thư viện và thuật toán.

từ pyod.utils.data nhập generate_data từ pyod.utils.data nhập đánh giá_print từ pyod.utils.example nhập trực quan hóa train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,contamination=contaminate,random_state=42)
cname_alg = 'KNN' # tên của thuật toán là K Nearest Neighbors c = KNN() c.fit(X_train) # Khớp thuật toán y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("Dữ liệu đào tạo:") đánh giá_print(cname_alg, y_train, y_train_scores) print("Dữ liệu kiểm tra:") đánh giá_print(cname_alg, y_test, y_test_scores) visualization(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=True, save_figure=True)

Chúng tôi sẽ sử dụng thuật toán IForest.

fname_alg = 'IForest' # tên của thuật toán là K Hàng xóm gần nhất f = IForest() f.fit(X_train) # Khớp thuật toán 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("Dữ liệu đào tạo:") đánh giá_print(fname_alg, y_train_pred, y_train_scores) print("Dữ liệu kiểm tra:") đánh giá_print(fname_alg, y_test_pred, y_test_scores) visualization(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

F. Nhà tiên tri phát hiện sự bất thường

Chúng tôi sẽ sử dụng tập dữ liệu hành khách hàng không với chuỗi thời gian tiên tri/example_air_passengers.csv tại chính · aster28/prophet (github.com)

nhập tiên tri từ tiên tri nhập dự báo từ tiên tri nhập Tiên tri m = Tiên tri()
dữ liệu = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

Nhật ký của cột y không cho phép giá trị âm. Chúng tôi chia dữ liệu của mình thành đào tạo, thử nghiệm và lưu trữ dự đoán trong dự báo có thể thay đổi.

đào tạo, kiểm tra= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) dự báo = m.predict(test) def detect(forecast): forcast = dự báo[['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['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range return forcast
phát hiện (dự báo)

Chúng tôi lấy điểm bất thường là -1.

Kết luận

Quá trình tìm kiếm các giá trị ngoại lệ trong một tập dữ liệu nhất định được gọi là phát hiện bất thường. Giá trị ngoại lệ là các đối tượng dữ liệu nổi bật so với các giá trị đối tượng còn lại trong tập dữ liệu và không hoạt động bình thường.

Các tác vụ phát hiện bất thường có thể sử dụng các phương pháp phân cụm dựa trên khoảng cách và dựa trên mật độ để xác định các điểm bất thường dưới dạng một cụm.

Ở đây chúng ta thảo luận về các phương pháp phát hiện bất thường khác nhau và giải thích chúng bằng cách sử dụng mã trên ba bộ dữ liệu của Titanic, Hành khách trên máy bay và Caret để

Những điểm chính

1. Có thể phát hiện ngoại lệ hoặc phát hiện bất thường bằng phương pháp Box-Whisker hoặc bằng DBSCAN.

2. Phương pháp khoảng cách Euclide được sử dụng với các hạng mục không tương quan.

3. Phương pháp Mahalanobis được sử dụng với các ngoại lệ đa biến.

4. Tất cả các giá trị hoặc điểm không phải là ngoại lệ. Một số là những tiếng ồn đáng lẽ phải là rác. Ngoại lệ là dữ liệu hợp lệ cần được điều chỉnh.

5. Chúng tôi đã sử dụng PyCaret để phát hiện ngoại lệ bằng cách sử dụng các thuật toán khác nhau trong đó điểm bất thường là một, được hiển thị bằng màu vàng và không có ngoại lệ nào trong đó ngoại lệ là 0.

6. Chúng tôi đã sử dụng PyOD, đây là thư viện phát hiện Ngoại lệ của Python. Nó có hơn 40 thuật toán. kỹ thuật giám sát và không giám sát nó được sử dụng.

7. Chúng tôi đã sử dụng Tiên tri và xác định chức năng phát hiện để phác thảo các giá trị ngoại lệ.

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả.

Dấu thời gian:

Thêm từ Phân tích Vidhya