Python phát hiện bất thường

Phát hiện bất thường xác định các mục, điểm dữ liệu, sự kiện hoặc quan sát bất thường khác biệt đáng kể so với tiêu chuẩn. Trong Học máy và Khoa học dữ liệu, bạn có thể sử dụng quy trình này để dọn sạch các giá trị ngoại lệ khỏi bộ dữ liệu của mình trong giai đoạn chuẩn bị dữ liệu hoặc xây dựng hệ thống máy tính phản ứng với các sự kiện bất thường. Ví dụ về các trường hợp sử dụng phát hiện bất thường có thể là phân tích lưu lượng truy cập mạng tăng đột biến, độ lệch chỉ số giám sát ứng dụng hoặc thậm chí phát hiện luồng bảo mật

Bài viết này giải thích cách sử dụng thuật toán Isolation Forests và Local Outlier Factor để phát hiện bất thường (Python) trong bộ dữ liệu của bạn

Hiệu suất của bất kỳ thuật toán Machine Learning nào phụ thuộc nhiều vào độ chính xác của tập dữ liệu được cung cấp. Trong các tình huống thực tế, chúng ta thường xử lý dữ liệu thô để phân tích và xử lý trước khi chạy các tác vụ Machine Learning. Chuẩn bị tập dữ liệu để đào tạo được gọi là Phân tích dữ liệu khám phá (EDA) và phát hiện bất thường là một trong các bước của quy trình này

Best Machine Learning Books for Beginners and Experts

Sách học máy tốt nhất cho người mới bắt đầu và chuyên gia

Khi Machine Learning ngày càng trở nên phổ biến, cả người mới bắt đầu và chuyên gia đều cần cập nhật những tiến bộ mới nhất. Đối với người mới bắt đầu, hãy xem những cuốn sách Machine Learning tốt nhất có thể giúp hiểu rõ những điều cơ bản. Đối với các chuyên gia, đọc những cuốn sách này có thể giúp bắt kịp với bối cảnh luôn thay đổi. Trong cả hai trường hợp, một số lý do chính để xem những cuốn sách này có thể hữu ích

Đầu tiên, chúng cung cấp một cái nhìn tổng quan toàn diện về chủ đề này, chủ yếu là về các thuật toán học máy. Thứ hai, họ cung cấp những hiểu biết sâu sắc từ các chuyên gia hàng đầu trong lĩnh vực này. Và thứ ba, họ đưa ra lời khuyên cụ thể về cách áp dụng các khái niệm máy học trong các tình huống thực tế. Khi máy học tiếp tục phát triển, không còn nghi ngờ gì nữa, những cuốn sách này sẽ tiếp tục là tài nguyên thiết yếu cho bất kỳ ai có kiến ​​thức trước đó muốn đi trước đường cong

Dị thường là gì?

Điểm bất thường là một mục, điểm dữ liệu, sự kiện hoặc quan sát bất thường khác biệt đáng kể so với tiêu chuẩn. Các thuật toán phát hiện bất thường giúp tự động xác định các điểm dữ liệu trong tập dữ liệu không khớp với các điểm dữ liệu khác. Trong Khoa học dữ liệu và Học máy, điểm dữ liệu bất thường trong tập dữ liệu còn được gọi là "ngoại lệ" và các thuật ngữ này được sử dụng thay thế cho nhau

Đây là cách các điểm bất thường hoặc ngoại lệ từ tập dữ liệu thường xuất hiện trong biểu đồ

anomaly-detection-using-python-outliers

Có một số loại bất thường

  • Điểm bất thường là các đối tượng nằm cách xa phân phối trung bình hoặc trung bình của tập dữ liệu. Một ví dụ về điểm bất thường có thể là một giao dịch đơn lẻ của một số tiền lớn từ thẻ tín dụng
  • Bất thường theo ngữ cảnh là bất thường theo ngữ cảnh cụ thể thường xảy ra trong bộ dữ liệu chuỗi thời gian. Ví dụ: lưu lượng truy cập cao vào một trang web có thể là điều phổ biến vào bất kỳ ngày nào trong tuần, nhưng không phải vào cuối tuần. Vì vậy, lưu lượng truy cập tăng đột biến vào cuối tuần có thể thể hiện sự bất thường về ngữ cảnh
  • Một điểm bất thường tập thể mô tả một nhóm các đối tượng bất thường có liên quan. Phiên bản dữ liệu riêng lẻ trong một điểm bất thường tập thể có thể không phải là một điểm bất thường, nhưng nhiều lần xuất hiện của các điểm dữ liệu đó cùng nhau có thể là một điểm bất thường. Ví dụ: một kết nối mạng chậm đến trang web nói chung có thể không phải là vấn đề, nhưng hàng nghìn kết nối như vậy có thể là dấu hiệu của một cuộc tấn công DDoS

Phát hiện dị thường thị giác

Cách nhanh nhất để tìm điểm bất thường trong tập dữ liệu là trực quan hóa các điểm dữ liệu của nó. Ví dụ: có thể dễ dàng xác định các giá trị ngoại lệ bằng cách trực quan hóa chuỗi dữ liệu bằng biểu đồ hộp, biểu đồ phân tán hoặc biểu đồ đường

cốt truyện hộp

Biểu đồ hộp là một cách hiển thị phân phối dữ liệu được tiêu chuẩn hóa dựa trên năm chỉ số. tối thiểu, phần tư thứ nhất (Q1), trung bình, phần tư thứ ba (Q3) và tối đa

Box plot - Outlier example

Biểu đồ hộp không hiển thị phân phối dữ liệu và biểu đồ. Tuy nhiên, nó vẫn hữu ích để chỉ ra liệu một phân phối có chứa các điểm dữ liệu bất thường tiềm ẩn (ngoại lệ) trong tập dữ liệu hay không

Biểu đồ hộp có các đặc điểm sau

  • Các mặt dưới cùng và trên cùng của hộp là các phần tư dưới và trên. Hộp bao gồm khoảng tứ phân vị chứa 50% dữ liệu
  • Trung tuyến là đường thẳng đứng chia hộp thành hai phần
  • Râu là hai đường bên ngoài hộp đi từ phần tư tối thiểu đến phần tư dưới và sau đó từ phần tư trên đến tối đa
  • Bất kỳ điểm dữ liệu nào nằm bên ngoài râu được coi là ngoại lệ
  • Một biến thể của biểu đồ hộp và râu giới hạn độ dài của râu ở mức tối đa là 1. 5 lần phạm vi liên vùng. Các điểm dữ liệu bên ngoài khoảng thời gian này được biểu diễn dưới dạng các điểm trên biểu đồ và được coi là các ngoại lệ tiềm năng

biểu đồ đường

Biểu đồ đường là lý tưởng để trực quan hóa một loạt các điểm dữ liệu. Nếu chuỗi dữ liệu chứa bất kỳ điểm bất thường nào, chúng có thể dễ dàng nhận dạng bằng mắt thường

Line chart - Outlier example

Biểu đồ phân tán sử dụng dấu chấm để biểu thị giá trị cho hai biến số khác nhau. Vị trí của mỗi dấu chấm trên trục ngang và trục dọc biểu thị các giá trị cho một điểm dữ liệu riêng lẻ. Biểu đồ phân tán được sử dụng để quan sát mối quan hệ giữa các biến

biểu đồ. io – Biểu đồ phân tán là gì

Nếu tập dữ liệu có điểm bất thường, bạn có thể nhìn thấy chúng trên biểu đồ đó. Đây là hình ảnh trực quan của bộ dữ liệu Iris nổi tiếng, nơi chúng ta có thể dễ dàng thấy ít nhất một ngoại lệ

Scatter plot - Outlier example

Phát hiện và sửa lỗi bất thường trong bộ dữ liệu

Trong phần này của bài viết, chúng tôi sẽ chỉ ra mức độ bất thường (hoặc ngoại lệ) có thể ảnh hưởng đáng kể đến kết quả của bất kỳ mô hình Học máy nào bằng cách phân tích một tập dữ liệu đơn giản

Hãy cài đặt một số mô-đun Python cần thiết bằng cách chạy các lệnh sau trong ô của Jupyter Notebook

%pip install sklearn
%pip install pandas
%pip install numpy
%pip install matplotlib
%pip install plotly
%pip install seaborn
%pip install sktime
%pip install statsmodels

Khám phá tập dữ liệu

Bước đầu nhập tập dữ liệu và làm quen với kiểu dữ liệu. Chúng tôi sẽ phân tích một bộ dữ liệu đơn giản chứa doanh số bán cá da trơn từ năm 1986 đến 2001. Bạn có thể tải xuống bộ dữ liệu từ liên kết này

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()

đầu ra

Catfish sales dataset 1986-2001

Đầu ra cho thấy dữ liệu của chúng tôi có hai cột chứa ngày và số lượng bán hàng mỗi tháng. Bây giờ chúng ta hãy trực quan hóa tập dữ liệu để xem thông tin bán hàng rõ ràng hơn

import plotly.express as px
# Limiting DataFrame to specific date
mask = (dataset['Date'] <= '2000-01-01')
dataset = dataset.loc[mask]
# Plotting a part of DataFrame
fig = px.line(dataset, x='Date', y="Sales", title='Catfish sales 1986-2000')
fig.show()

đầu ra

Đầu ra có vẻ tốt và chúng tôi không có bất kỳ điểm bất thường nào trong tập dữ liệu. Hãy kiểm tra lại nó bằng biểu đồ hộp

import plotly.express as px
fig = px.box(dataset, y="Sales", title='Catfish sales 1986-2000')
fig.show()

Biểu đồ cốt truyện hộp không hiển thị bất kỳ ngoại lệ nào

Lập chỉ mục lại tập dữ liệu

Như bạn đã thấy ở trên, chỉ mục của DataFrame là một kiểu số nguyên. Sẽ rất hữu ích nếu lập chỉ mục lại toàn bộ Khung dữ liệu bằng cách sử dụng thông tin từ cột

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
9 làm chỉ mục mới

# convert the column (it's a string) to datetime type
datetime_series = pd.to_datetime(dataset['Date'])
# create datetime index passing the datetime series
datetime_index = pd.DatetimeIndex(datetime_series.values)
# datetime_index
period_index = pd.PeriodIndex(datetime_index, freq='M')
# period_index
dataset = dataset.set_index(period_index)
# we don't need the column anymore
dataset.drop('Date',axis=1,inplace=True)
dataset.head()

đầu ra

Catfish sales dataset 1986-2000 (re-indexed)

Dự đoán giá (bộ dữ liệu không có bất thường)

Bây giờ, hãy dự đoán giá năm 1999 dựa trên dữ liệu chuỗi thời gian lịch sử hiện có từ năm 1986

Trước tiên, hãy chia tập dữ liệu của chúng tôi

import plotly.graph_objects as go
from sktime.forecasting.model_selection import temporal_train_test_split
# Splitting dataset (test dataset size is last 12 periods/months)
y_train, y_test = temporal_train_test_split(dataset, test_size=12)
# Visualizing train/test dataset
fig = go.Figure()
fig.add_trace(go.Scatter(
    name="Train DataSet", x=y_train.index.astype(str), y=y_train['Sales']
))
fig.add_trace(go.Scatter(
    name="Test DataSet", x=y_test.index.astype(str), y=y_test['Sales']
))
fig.update_layout(
    title="Splitted dataset"
)
fig.show()

đầu ra

Chúng tôi sẽ sử dụng thuật toán SARIMA để lập mô hình và ước tính giá cho thị trường cá da trơn dựa trên bộ dữ liệu lịch sử của chúng tôi cho mục đích demo

from statsmodels.tsa.statespace.sarimax import SARIMAX
model = SARIMAX(y_train['Sales'], order=(1, 1, 1), seasonal_order=(1,0,1,12))
model_fit = model.fit()
y_pred = model_fit.predict(start=len(y_train), end=len(y_train)+11, exog=None, dynamic=True)

Hãy trực quan hóa kết quả dự đoán

________số 8_______

đầu ra

Như bạn có thể thấy, thuật toán SARIMA dự đoán rất cao về giá trong tương lai

Dưới đây là các giá trị Lỗi tuyệt đối trung bình (MAE) và Lỗi phần trăm tuyệt đối trung bình (MAPE)

from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
mae = mean_absolute_error(list(y_test['Sales']), list(y_pred))
mape = mean_absolute_percentage_error(list(y_test['Sales']), list(y_pred))
print('MAE: %.3f' % mae)
print('MAPE: %.3f' % mape)

đầu ra

Dự đoán giá (bộ dữ liệu có điểm bất thường)

Hãy chia nhỏ tập dữ liệu và giới thiệu một điểm bất thường để xem ảnh hưởng của các điểm bất thường đối với cùng một thuật toán dự đoán

from datetime import datetime
# Cloning good dataset
broken_dataset = dataset.copy()
# Breaking clonned dataset with random anomaly
broken_dataset.loc[datetime(1998, 12, 1),['Sales']] = 1000

Đây là hình ảnh của tập dữ liệu bị hỏng

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
0

đầu ra

Hãy sử dụng biểu đồ hộp để xem ngoại lệ

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
1

đầu ra

Biểu đồ hộp hiển thị một điểm bất thường dưới râu thấp hơn

Chúng ta có thể chạy cùng một thuật toán để trực quan hóa sự khác biệt trong các dự đoán

Hãy chia nhỏ tập dữ liệu

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
2

Bây giờ, hãy chạy thuật toán SARIMA

from statsmodels.tsa.statespace.sarimax import SARIMAX
model = SARIMAX(y_train['Sales'], order=(1, 1, 1), seasonal_order=(1,0,1,12))
model_fit = model.fit()
y_pred = model_fit.predict(start=len(y_train), end=len(y_train)+11, exog=None, dynamic=True)

Và trực quan hóa kết quả dự đoán

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
4

Như bạn có thể thấy, các dự đoán tuân theo khuôn mẫu nhưng thậm chí không gần với các giá trị thực tế

from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
mae = mean_absolute_error(list(y_test['Sales']), list(y_pred))
mape = mean_absolute_percentage_error(list(y_test['Sales']), list(y_pred))
print('MAE: %.3f' % mae)
print('MAPE: %.3f' % mape)

đầu ra

Các ví dụ Python về phát hiện bất thường

Rất khó để tìm ra sự bất thường của dữ liệu, đặc biệt là khi xử lý các tập dữ liệu lớn. May mắn thay, mô-đun Python của sklearn có nhiều thuật toán tích hợp để giúp chúng tôi giải quyết vấn đề này, chẳng hạn như Khu rừng cách ly, DBSCAN, Các yếu tố ngoại lai cục bộ (LOF) và nhiều thuật toán khác

Rừng cách ly

Khu rừng cách ly là một thuật toán học tập không giám sát giúp xác định các điểm bất thường bằng cách cô lập các giá trị ngoại lai trong dữ liệu dựa trên Thuật toán cây quyết định. Nó phân tách các giá trị ngoại lệ bằng cách chọn ngẫu nhiên một tính năng từ tập hợp các tính năng nhất định và sau đó chọn giá trị phân tách giữa giá trị tối đa và tối thiểu. Việc phân vùng ngẫu nhiên các tính năng này sẽ tạo ra các đường dẫn ngắn hơn trong cây cho các điểm dữ liệu bất thường, do đó phân biệt chúng với phần còn lại của dữ liệu

Hãy sử dụng triển khai Khu rừng cách ly sklearn trên cùng một tập dữ liệu bị hỏng để triển khai phát hiện bất thường với Python

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
6

Hãy hình dung những phát hiện của chúng tôi

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
7

đầu ra

Như bạn có thể thấy, thuật toán Khu rừng cách ly đã phát hiện ra hai điểm bất thường, bao gồm cả điểm bất thường do chúng tôi tự giới thiệu

Yếu tố ngoại lai cục bộ (LOF)

Thuật toán Yếu tố ngoại lai cục bộ (LOF) giúp xác định các ngoại lệ dựa trên mật độ điểm dữ liệu cho mọi điểm dữ liệu cục bộ trong tập dữ liệu. Thuật toán hoạt động tốt khi mật độ dữ liệu không giống nhau trong toàn bộ tập dữ liệu

Hãy áp dụng thuật toán Local Outlier Factor cho tập dữ liệu của chúng ta và tìm ra điểm bất thường

# Import pandas
import pandas as pd

# Read data
dataset = pd.read_csv('catfish_sales_1986_2001.csv', parse_dates=[0])
# Printing head of the DataFrame
dataset.head()
8

Hãy hình dung những phát hiện của chúng tôi

Như trong trường hợp của thuật toán Khu rừng cách ly, thuật toán Yếu tố ngoại lai cục bộ đã phát hiện ra hai điểm bất thường, bao gồm cả điểm bất thường mà chúng tôi đã tự giới thiệu

Câu hỏi thường gặp

Thuật toán nào là tốt nhất để phát hiện bất thường?

Thuật toán tốt nhất để phát hiện bất thường tùy thuộc vào loại dữ liệu và ngữ cảnh sử dụng thuật toán đó. Các thuật toán phổ biến để phát hiện bất thường bao gồm phân cụm K-Means, Máy vectơ hỗ trợ (SVM), Mô hình hỗn hợp Gaussian (GMM), SVM một lớp, Yếu tố ngoại lai cục bộ (LOF) và Rừng cách ly

Ba 3 cách tiếp cận cơ bản để phát hiện bất thường là gì?

Ba cách tiếp cận cơ bản để phát hiện bất thường là (1) dựa trên thống kê, (2) dựa trên máy học và (3) dựa trên quy tắc. Các phương pháp dựa trên thống kê sử dụng các kỹ thuật số như thống kê mô tả, kiểm tra giả thuyết và phân cụm để xác định các điểm bất thường. Các phương pháp dựa trên máy học sử dụng các thuật toán được giám sát hoặc không được giám sát để xác định các mẫu và điểm bất thường trong dữ liệu. Các phương pháp dựa trên quy tắc sử dụng các quy tắc và kinh nghiệm để xác định các sai lệch so với hành vi dự kiến

Chúng tôi có thể sử dụng KNN để phát hiện bất thường không?

KNN hoạt động bằng cách so sánh một điểm dữ liệu nhất định với các điểm lân cận gần nhất của nó để xác định xem điểm dữ liệu đó có phải là ngoại lệ hay không. Bằng cách đo mức độ khác biệt của điểm dữ liệu so với các điểm lân cận gần nhất, có thể xác định xem điểm đó có bất thường hay không. Vì vậy, thuật toán KNN có thể được sử dụng để phát hiện bất thường

PCA có thể được sử dụng để phát hiện bất thường không?

PCA có thể xác định các mẫu trong dữ liệu không có trong các điểm dữ liệu khác và các mẫu đó có thể được sử dụng để phát hiện sự bất thường. Điều này được thực hiện bằng cách xem xét các thành phần chính của dữ liệu, đại diện cho các yếu tố quan trọng nhất góp phần vào phương sai trong tập dữ liệu. Sau đó, có thể phát hiện ra sự bất thường khi có sự khác biệt lớn giữa một điểm nhất định và các điểm lân cận gần nhất của nó về các thành phần chính này

Tóm lược

Phát hiện bất thường là định vị các mục, điểm dữ liệu, sự kiện hoặc quan sát bất thường khiến nghi ngờ vì chúng khác với phần còn lại của điểm dữ liệu hoặc quan sát. Trong bài viết này, chúng tôi đã đề cập đến các điểm bất thường (ngoại lệ) và ảnh hưởng của chúng đối với các thuật toán dự đoán

Thuật toán nào là tốt nhất để phát hiện bất thường?

Yếu tố ngoại lai cục bộ (LOF) . Thuật toán này dựa trên khái niệm mật độ cục bộ. Nó so sánh mật độ cục bộ của một đối tượng với mật độ của các điểm dữ liệu lân cận.

Ba 3 cách tiếp cận cơ bản để phát hiện bất thường là gì?

Có ba loại kỹ thuật phát hiện bất thường chính. không giám sát, bán giám sát và giám sát . Về cơ bản, phương pháp phát hiện bất thường chính xác phụ thuộc vào các nhãn có sẵn trong tập dữ liệu.

Chúng tôi có thể sử dụng KNN để phát hiện bất thường không?

Các kỹ thuật được sử dụng rộng rãi hơn trong lĩnh vực phát hiện bất thường dựa trên các kỹ thuật mật độ như yếu tố ngoại lai cục bộ KNN, khu rừng cách ly, v.v. . Nói chung, dữ liệu được coi là một điểm trong không gian nhiều chiều, được xác định bởi số lượng các tính năng được sử dụng trong phân tích.

Có thể sử dụng Kmeans để phát hiện bất thường không?

K-nghĩa là phân cụm . nếu khoảng cách giữa một điểm dữ liệu và trọng tâm gần nhất của nó lớn hơn giá trị ngưỡng, thì đó là một điểm bất thường. A threshold value can be added to detect anomalies: if the distance between a data point and its nearest centroid is greater than the threshold value, then it is an anomaly.