异常检测实战过程:
1、基于anomaly_data.csv,可视化数据分布情况,及其对应高斯分布的概率密度函数
2、建立模型,实现异常点数据的预测
3、可视化异常检测处理结果
4、修改概率分布阈值EllipticEnvelope(contamination)中的contamination,查看阈值改变对结果的影响
1、加载数据集
本次实战所用数据集:链接: https://pan.baidu.com/s/18IRYPuk6NSU6xW4NyRokpA 密码: stug
1 2 3 4 5
| 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
| 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
| 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
| 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
| 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
| 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
| from sklearn.covariance import EllipticEnvelope ad_model = EllipticEnvelope() ad_model.fit(data)
y_predict = ad_model.predict(data) print(pd.value_counts(y_predict))
|
8、将预测结果可视化
1 2 3 4 5 6 7 8 9 10
| 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/