异常检测检测实战

异常检测实战过程:
1、基于anomaly_data.csv,可视化数据分布情况,及其对应高斯分布的概率密度函数
2、建立模型,实现异常点数据的预测
3、可视化异常检测处理结果
4、修改概率分布阈值EllipticEnvelope(contamination)中的contamination,查看阈值改变对结果的影响

1、加载数据集

本次实战所用数据集:链接: https://pan.baidu.com/s/18IRYPuk6NSU6xW4NyRokpA 密码: stug

1
2
3
4
5
# load the data
import numpy as np
import pandas as pd
data = pd.read_csv('anomaly_data.csv')
data.head()

2、将数据可视化

1
2
3
4
5
6
7
8
# visualize the data
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(10, 5))
plt.scatter(data.loc[:, 'x1'], data.loc[:, 'x2'])
plt.title('data')
plt.xlabel('x1')
plt.ylabel('x1')
plt.show()

图像显示如下:

3、定义x1与x2并展示图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# define x1 and x2
x1 = data.loc[:, 'x1']
x2 = data.loc[:, 'x2']

fig2 = plt.figure(figsize=(20, 5))

plt.subplot(121)
plt.hist(x1, bins=100)
plt.title('x1 distribut')
plt.xlabel('x1')
plt.ylabel('counts')

plt.subplot(122)
plt.hist(x2, bins=100)
plt.title('x2 distribut')
plt.xlabel('x2')
plt.ylabel('counts')
plt.show()

可视化数据如下所示:

4、计算x1与x2均值和标准差

1
2
3
4
5
6
# calculate the mean and sigma of x1 and x2
x1_mean = x1.mean()
x1_sigma = x1.std()
x2_mean = x2.mean()
x2_sigma = x2.std()
print(x1_mean, x1_sigma, x2_mean, x2_sigma)

5、计算高斯分布的概率密度

1
2
3
4
5
6
7
# calculate the gaussion distribution p(x)
from scipy.stats import norm
x1_range = np.linspace(0, 20, 300)
x1_normal = norm.pdf(x1_range, x1_mean, x1_sigma)

x2_range = np.linspace(0, 20, 300)
x2_normal = norm.pdf(x2_range, x2_mean, x2_sigma)

6、可视化高斯密度曲线

1
2
3
4
5
6
7
8
9
10
11
# visualize the p(x)
fig2 = plt.figure(figsize=(20, 5))
plt.subplot(121)
plt.plot(x1_range, x1_normal)
plt.title('normal p(x1)')

plt.subplot(122)
plt.plot(x2_range, x2_normal)
plt.title('normal p(x2)')

plt.show()

高斯密度曲线可视化如下所示:

7、建立模型并进行预测

1
2
3
4
5
6
7
8
# establish the model and predict
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope()
ad_model.fit(data)

# make prediction
y_predict = ad_model.predict(data)
print(pd.value_counts(y_predict))

8、将预测结果可视化

1
2
3
4
5
6
7
8
9
10
# visualize the result
fig4 = plt.figure(figsize=(10, 5))
original_data = plt.scatter(data.loc[:, 'x1'], data.loc[:, 'x2'], marker='x')
anomaly_data = plt.scatter(data.loc[:, 'x1'][y_predict==-1], data.loc[:, 'x2'][y_predict==-1], marker='o', facecolor='none', edgecolor='red', s=150)

plt.title('anomaly detection result')
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((original_data, anomaly_data), ('original_data', 'anomaly_data'))
plt.show()

异常结果如下所示:

9、修改概率分布阈值,看看影响

1
2
3
ad_model = EllipticEnvelope(contamination=0.02)
ad_model.fit(data)
y_predict = ad_model.predict(data)

将新数据进行可视化:

10、小结

1、通过计算数据各维度对应的高斯分布概率密度函数,可用于寻找数据中的异常点

2、通过修改概率密度阈值contamination,可调整异常点检测的灵敏度

3、核心算法上官网查看https://scikit-learn.org.cn/