异常检测检测实战

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

1、加载数据集

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

# load the data
import numpy as np
import pandas as pd
data = pd.read_csv('anomaly_data.csv')
data.head()

2、将数据可视化

# 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并展示图像

# 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均值和标准差

# 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、计算高斯分布的概率密度

# 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、可视化高斯密度曲线

# 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、建立模型并进行预测

# 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、将预测结果可视化

# 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、修改概率分布阈值,看看影响

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/

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐