机器学习入门与Python实战(九):异常数据监测Anamoly Detection

目录

现实问题思考

异常检测

概率密度函数

知识巩固

Python实战:异常消费行为检测

拓展学习


现实问题思考

以下为监控传感器检测的设备工作数据,如何让机器在接收到异常数据时自动报警?

当相机画面中突然出现异常目标,如何实现自动识别?

更多案例

欺诈检测:盗刷信用卡检测

入侵检测:检测网络入侵或计算机入侵行为

医疗:缺陷基因检测

生态系统:预测飓风、洪水、干旱、热浪和火灾的发生

异常检测

根据输入数据,对不匹配预期模式的数据进行识别

监督式异常检测:提前使用带“正常”与“异常”标签的数据对模型进行训练,机器基于训练好的模型判断新数据是否为异常数据

无监督式异常检测:通过寻找与其他数据最不匹配的实例来检测出未标记测试数据的异常

基于数据分布,寻找与其他数据最不匹配的实例

寻找发生可能性低的数据(事件)

概率是一个在01之间的实数,是对随机事件发生可能性的度量,反映某种情况出现的可能性(likelihood)大小。

概率密度函数

在连续分布事件中,用于描述连续随机变量的输出值在某个确定的取值点附近的可能性的函数,通过其可计算取值点附近区间发生事件的概率。

基于高斯分布的概率密度函数

概率论中最重要的分布: 现实生活中,很多事件发生的频率都符合高斯分布,比如:工业产品的强力、抗压强度、口径、长度等指标;人体的身高、体重等指标;同一品种种子的重量;某个地区的年降水量,等等。

知识巩固

问题:计算一下样本分布的均值、标准差、基于高斯分布的概率密度函数


Python实战:异常消费行为检测

基础环境: Python语言;安装核心工具包numpy、pandas、sklearn、matplotlib;环境管理软件Anaconda;Jupyter notebook

环境配置参考:机器学习入门与Python实战核心工具篇:pip源、python、anaconda、工具包(完整版)https://blog.csdn.net/dfly_zx/article/details/110188923

任务:基于ad_data数据,基于高斯分布的概率密度函数实现异常消费行为检测。

1、可视化消费数据、数据分布次数、及其对应高斯分布的概率密度函数;

2、设置概率密度阈值0.03,建立模型,实现异常数据点预测

3、可视化异常检测处理结果

4、修改概率密度为0.10.2,查看阈值改变对结果的影响

#数据加载
import pandas as pd
import numpy as np
data = pd.read_csv('task1_data.csv')
data.head()

#数据可视化
from matplotlib import pyplot as plt
fig1 = plt.figure()
plt.scatter(data.loc[:,'frequency'],data.loc[:,'payment'],marker='x')
plt.title('raw data')
plt.xlabel('frequency')
plt.ylabel('payment')
plt.show()

#x1 x2 X赋值
X = data
x1 = data.loc[:,'frequency']
x2 = data.loc[:,'payment']
X.head()
x1.head()
x2.head()

#数据分布的可视化操作
fig2 = plt.figure(figsize=(20,5))
fig2_1 = plt.subplot(121)
plt.hist(x1,bins=100)
plt.title('frequency data')
plt.xlabel('frequency')
plt.ylabel('counts')

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

#计算平均值u,以及标准差sigma
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)

#计算基于高斯分布的概率密度函数
from scipy.stats import norm
x1_range = np.linspace(0,10,300)
x1_normal = norm.pdf(x1_range,x1_mean,x1_sigma)
x2_range = np.linspace(0,400,300)
x2_normal = norm.pdf(x2_range,x2_mean,x2_sigma)
# print(x1_range,x1_range.shape)
print(x1_normal,x1_normal.shape)

#原始数据的高斯分布概率密度函数可视化
fig3 = plt.figure(figsize=(20,5))
fig3_1 = plt.subplot(121)
plt.plot(x1_range,x1_normal)
plt.title('x1(frequency) Gaussian Distribution')
plt.xlabel('x1(frequency)')
plt.ylabel('p(x1)')

fig3_2 = plt.subplot(122)
plt.plot(x2_range,x2_normal)
plt.title('x2(payment) Gaussian Distribution')
plt.xlabel('x2(payment)')
plt.ylabel('p(x2)')
plt.show()

import math
#设置范围
x_min, x_max = 0, 10
y_min, y_max = 0, 400
h1 = 0.1
h2 = 0.1
#生成矩阵数据
xx, yy = np.meshgrid(np.arange(x_min, x_max, h1), np.arange(y_min, y_max, h2))
print(xx.shape,yy.shape)

#展开矩阵数据
x_range = np.c_[xx.ravel(), yy.ravel()]
x1 = np.c_[xx.ravel()]
x2 = np.c_[yy.ravel()]
x_range_df = pd.DataFrame(x_range)
#x_range_df.to_csv('data.csv')
#高斯分布参数
u1 = x1_mean
u2 = x2_mean
sigma1 = x1_sigma
sigma2 = x2_sigma

#计算高斯分布概率
p1 = 1/sigma1/math.sqrt(2*math.pi)*np.exp(-np.power((x1-u1),2)/2/math.pow(sigma1,2))
p2 = 1/sigma2/math.sqrt(2*math.pi)*np.exp(-np.power((x2-u2),2)/2/math.pow(sigma2,2))
p = np.multiply(p1,p2)
#对概率密度维度转化
p_2d = p.reshape(xx.shape[0],xx.shape[1])

#综合高斯分布概率密度函数的可视化
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
fig5 = plt.figure()
axes3d = Axes3D(fig5)
axes3d.plot_surface(xx,yy,p_2d,cmap=cm.rainbow)

#建立异常检测模型
from sklearn.covariance import EllipticEnvelope
model = EllipticEnvelope(contamination=0.03)
model.fit(X)

#模型预测
y_predict = model.predict(X)
print(y_predict)
print(pd.value_counts(y_predict))

fig6 = plt.figure()
plt.scatter(data.loc[:,'frequency'],data.loc[:,'payment'],marker='x',label='raw data')
plt.scatter(data.loc[:,'frequency'][y_predict==-1],data.loc[:,'payment'][y_predict==-1],marker='o',facecolor='none',edgecolor='red',s=150,label='anomaly_data')

plt.title('raw data')
plt.xlabel('frequency')
plt.ylabel('payment')
plt.legend()
plt.show()

model = EllipticEnvelope(contamination=0.1)
model.fit(X)
#模型预测
y_predict = model.predict(X)
fig6 = plt.figure()
plt.scatter(data.loc[:,'frequency'],data.loc[:,'payment'],marker='x',label='raw data')
plt.scatter(data.loc[:,'frequency'][y_predict==-1],data.loc[:,'payment'][y_predict==-1],marker='o',facecolor='none',edgecolor='red',s=150,label='anomaly_data')

plt.title('raw data')
plt.xlabel('frequency')
plt.ylabel('payment')
plt.legend()
plt.show()

model = EllipticEnvelope(contamination=0.2)
model.fit(X)
#模型预测
y_predict = model.predict(X)
fig6 = plt.figure()
plt.scatter(data.loc[:,'frequency'],data.loc[:,'payment'],marker='x',label='raw data')
plt.scatter(data.loc[:,'frequency'][y_predict==-1],data.loc[:,'payment'][y_predict==-1],marker='o',facecolor='none',edgecolor='red',s=150,label='anomaly_data')

plt.title('raw data')
plt.xlabel('frequency')
plt.ylabel('payment')
plt.legend()
plt.show()

异常消费行为检测实战summary:

1、实现了消费数据、数据分布次数、及其对应高斯分布的概率密度函数的可视化;
2、建立了异常数据检测模型,根据预先设定的异常数据比例,自动寻找到了数据中的异常点;
3、实现了预测结果可视化,有助于评估模型表现及快速验证模型效果;
4、通过修改异常数据比例参数contamination,帮助我们更好的理解算法的原理;

核心算法参考链接:https://scikit-learn.org/stable/modules/generated/sklearn.covariance.EllipticEnvelope.html


拓展学习

如果现在就想开始学习机器学习,你还可以:

1、添加微信:ai_flare,领取Python编程课(AI方向)、Python实现机器学习,免费领取(仅限前100名)

2、人工智能学习路线:专为AI小白设计的人工智能实战课 - Python3入门人工智能 基础+实战 学习视频教程-CSDN学院

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值