异常检测检测实战

异常检测检测实战

异常检测实战过程:
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/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 autoencoder 异常检测的 Python 实战代码,用于检测 MNIST 数据集中的异常样本: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from keras.layers import Input, Dense from keras.models import Model # 加载 MNIST 数据集 from keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:]))) x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:]))) # 构建 autoencoder 模型 input_img = Input(shape=(784,)) encoded = Dense(32, activation='relu')(input_img) decoded = Dense(784, activation='sigmoid')(encoded) autoencoder = Model(input_img, decoded) autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') # 训练 autoencoder 模型 autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test)) # 获取编码器模型 encoder = Model(input_img, encoded) # 获取测试集的重构误差 x_test_encoded = encoder.predict(x_test) x_test_decoded = autoencoder.predict(x_test) mse = np.mean(np.power(x_test - x_test_decoded, 2), axis=1) # 设置阈值 threshold = np.max(mse) # 检测异常样本 x_test_normal = x_test[mse <= threshold] x_test_abnormal = x_test[mse > threshold] print('Number of normal samples:', len(x_test_normal)) print('Number of abnormal samples:', len(x_test_abnormal)) # 展示一些异常样本 n = 10 plt.figure(figsize=(20, 4)) for i in range(n): # 原始图像 ax = plt.subplot(2, n, i + 1) plt.imshow(x_test_abnormal[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # 重构图像 ax = plt.subplot(2, n, i + 1 + n) plt.imshow(x_test_decoded[mse > threshold][i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show() ``` 在上面的代码中,首先加载了 MNIST 数据集并进行了数据预处理。然后构建了一个简单的 autoencoder 模型,并用训练集进行训练。接着,获取编码器模型和测试集的重构误差。最后,根据重构误差的阈值检测异常样本,并展示一些异常样本的原始图像和重构图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值