【从零入门人工智能】异常检测实战_数据集:anomaly_data.csv

本文通过导入数据集并使用EllipticEnvelope模型,展示了如何可视化数据分布、建立异常检测模型及预测异常值的过程。通过调整参数提高了预测准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验目标

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

数据集:百度云盘链接,提取码:qp2n

导入第三方库

# 导入第三方包
import numpy as np
import pandas as pd
from scipy.stats import norm
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.covariance import EllipticEnvelope

导入数据集

data = pd.read_csv("./dataset/anomaly_data.csv")
data.head()

数据预览

取出数据集中的每一列数据

取出每一列的数据,方便后面的数据可视化

# 取出每一列的数据
x1 = data.loc[:,"x1"]
x2 = data.loc[:,"x2"]
print(x1.shape,x2.shape)

数据维度
从运行结果中可以知道,数据集中一共含有 307 条数据

数据可视化

# 数据可视化
fig1 = plt.figure()
plt.scatter(x1,x2)

plt.title("x1 vs x2")
plt.xlabel("x1")
plt.ylabel("x2")

plt.show()

数据可视化结果1

可视化数据的分布情况

# 显示数据分布情况
fig2 = plt.figure(figsize=(20,5))
plt.subplot(121)
plt.hist(x1, bins=100)

plt.title("x1 distribution")
plt.xlabel("x1")
plt.ylabel("counts")

plt.subplot(122)
plt.hist(x2, bins=100)

plt.title("x2 distribution")
plt.xlabel("x2")
plt.ylabel("counts")

plt.show()

数据分布情况

通过可视化的结果,我们可以直观的看到 x1x2 的数据分布情况,其中 x1 的大部分数据都集中在7.5~11.5 这个区间之中,x2 的大部分数据都集中在8.5~11.5 这个区间之中

计算均值和方差

计算均值和方差,方便后续画出 x1x2 的高斯分布

# 计算均值和标准差
x1_mean = x1.mean()
x1_sigma = x1.std()

x2_mean = x2.mean()
x2_sigma = x2.std()
print(x1_mean, x1_sigma)
print(x2_mean, x2_sigma)

均值和方差

画出 x1x2 的高斯分布图形

# 计算高斯分布的 p(x)
fig3 = plt.figure(figsize=(20,5))
plt.subplot(121)
x1_range = np.linspace(0,20,1000)
x1_normal = norm.pdf(x1_range, x1_mean, x1_sigma)
plt.plot(x1_range, x1_normal)
plt.title("normal p(x1)")
plt.xlabel("x1")
plt.ylabel("counts")

plt.subplot(122)
x2_range = np.linspace(0,20,1000)
x2_normal = norm.pdf(x2_range, x2_mean, x2_sigma)
plt.plot(x2_range, x2_normal)
plt.title("normal p(x2)")
plt.xlabel("x2")
plt.ylabel("counts")

plt.show()

高斯分布

建立异常检测模型并进行预测

# 建立模型并进行预测
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope()
ad_model.fit(data)

y_predict = ad_model.predict(data)
print(pd.value_counts(y_predict))

异常检测预测结果
sklearn.covariance.EllipticEnvelope 的具体参数解释参考:官方文档

contamination 表示的是异常值所占的比例,默认为 0.1,表示异常值占总体数据的 10%

运行结果中y_predict 中取值为 1 的表示正常值,取值为 -1 表示模型预测出的异常值

默认参数情况下对模型预测结果进行可视化

# 可视化预测结果
fig4 = plt.figure(figsize=(20,10))
orginal_data = plt.scatter(x1, x2, marker="x")
anomaly_data = plt.scatter(x1[y_predict == -1], x2[y_predict == -1], marker="o", facecolor="none", edgecolors="red", s=150)

plt.title("anomaly datection result")
plt.xlabel("x1")
plt.ylabel("x2")
plt.legend((orginal_data, anomaly_data),('orginal_data', 'anomaly_data'))

plt.show()

默认参数的预测结果
matplotlib.pyplot.scatter 的具体参数可以参考:官方文档

图中红色圈圈表示选中的异常值。从可视化的结果中我们可以看出,模型的预测结果还不够准确,将一些正确的值也标记成了异常值,所以我们需要修改默认的参数是的预测的结果更加准确。

修改默认参数后,对模型预测结果进行可视化

# 修改阈值 contamination, 阈值表示异常点的比例
ad_model = EllipticEnvelope(contamination=0.03)
ad_model.fit(data)

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

# 可视化预测结果
fig5 = plt.figure(figsize=(20,10))
orginal_data = plt.scatter(x1, x2, marker="x")
anomaly_data = plt.scatter(x1[y_predict == -1], x2[y_predict == -1], marker="o", facecolor="none", edgecolors="red", s=150)

plt.title("anomaly datection result")
plt.xlabel("x1")
plt.ylabel("x2")
plt.legend((orginal_data, anomaly_data),('orginal_data', 'anomaly_data'))

plt.show()

修改阈值之后对模型预测结果进行可视化的结果

从可视化的结果中我们可以看出,模型的预测准确性已经有了不小的提升,所有异常值都被标记了出来。

总结

  1. 本次实验,通过计算数据各维度对应的高斯分布概率密度函数,可用于寻找到数据中的异常点;
  2. 通过修改概率密度阈值contamination,可调整异常点检测的灵敏度;
  3. 异常值的检测在实际的生活中应用的比较广泛,例如一些传感器的数据检测,如果传感器的数据出现了异常,我们需要及时的对异常进行排除,对损坏的传感器进行更换,否则会导致检测结果的准确性下降。
  4. 核心算法参考链接: sklearn.covariance.EllipticEnvelop
### 实现异常检测的方法 对于 `anomaly_data.csv` 文件中的数据,可以采用多种方法来实现异常检测。以下是基于提供的引用内容以及专业知识的具体实现方式。 #### 方法一:使用高斯分布模型 通过计算数据点的概率密度并设定阈值来进行异常检测。这种方法假设数据服从正态分布,并利用统计学原理判断哪些数据点属于异常[^2]。 ```python import numpy as np import matplotlib.pyplot as plt from sklearn.covariance import EllipticEnvelope import pandas as pd # 加载数据 data = pd.read_csv('anomaly_data.csv') X = data.values # 将DataFrame转换为NumPy数组 # 使用EllipticEnvelope进行建模 model = EllipticEnvelope(contamination=0.1) # contamination参数定义异常比例 y_predict = model.fit_predict(X) # 可视化结果 plt.figure(figsize=(10, 6)) normal_points = X[y_predict == 1] outlier_points = X[y_predict == -1] plt.scatter(normal_points[:, 0], normal_points[:, 1], c='blue', label='Normal Data') plt.scatter(outlier_points[:, 0], outlier_points[:, 1], c='red', label='Outliers', s=100) plt.title("Anomaly Detection Result using Gaussian Distribution Model") plt.xlabel("Feature 1") plt.ylabel("Feature 2") plt.legend() plt.show() ``` 上述代码实现了以下功能: - 利用 `EllipticEnvelope` 构建了一个鲁棒协方差估计器。 - 设定了 `contamination=0.1` 参数,表示假定数据集中约有10%的数据是异常值[^3]。 - 对原始数据进行了分类,并绘制了正常点和异常点的散点图。 --- #### 方法二:使用 ADTK 工具包 如果目标是对时间序列数据执行异常检测,则可以考虑使用 ADTK 库。该库提供了丰富的无监督学习算法用于识别时间序列中的异常模式[^4]。 安装 ADTK 后,可以通过如下代码完成异常检测: ```python import pandas as pd from adtk.detector import ThresholdAD from adtk.visualization import plot # 加载CSV文件作为时间序列数据 df = pd.read_csv('anomaly_data.csv', parse_dates=['timestamp'], index_col='timestamp') # 创建ThresholdAD对象以设置上下限规则 detector = ThresholdAD(high=5, low=-5) # 高低阈值可以根据实际情况调整 anomalies = detector.detect(df['value']) # 假设列名为'value' # 绘制结果 plot(df['value'], anomaly=anomalies, ts_linewidth=1, ts_markersize=3, anomaly_color='orange', anomaly_alpha=0.3, curve_type="line"); ``` 此脚本完成了以下几个操作: - 导入必要的模块并将 CSV 转换为带有时间戳索引的时间序列 DataFrame。 - 设置简单的阈值规则(即高于某个最大值或低于最小值的情况视为异常)。 - 输出可视化图表展示标记出来的异常区域。 --- #### 结果解释与优化建议 无论选择哪种技术路线,都需要仔细评估所选超参数的影响。例如,在椭圆信封法中改变污染率会直接影响最终判定标准;而在 ADTK 场景下则需合理配置报警界限或其他特定条件下的触发机制。 为了进一步提升效果还可以尝试其他高级策略比如孤立森林(Isolation Forest),局部离群因子(LOF)或者深度神经网络架构等等。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值