利用线性回归模型检测异常

该博客介绍了如何利用线性回归模型来检测数据集中的异常点。通过将正常数据和可能含异常的数据分开,训练线性回归模型,并设置阈值来判断测试集中哪些点可能为异常。文中给出了具体实例,展示当训练模型包含异常点时,拟合结果会受到干扰,影响对正常数据的判断。

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

利用线性回归模型检测异常

关键思想
真实值与模型预测值之间的差值可以用来衡量这个数据点是多么异常。

检测步骤如下

  1. 将数据集分割为训练集(均为正常点)和测试集(包含异常点)
  2. 利用训练集得到线性回归模型的参数和选择是否判断为异常的阈值。
  3. 将第2步得到的模型和阈值检测测试集。

对于第一点,我们得到的线性回归模型参数一定得是基于正常点的,否则,会出现下图这种情况:
在这里插入图片描述
其中,左侧是基于正常数据的拟合结果,右侧是基于含有异常数据的拟合结果,蓝色是拟合线,绿色是基于正常数据的拟合线。我们可以发现,异常点的存在使拟合线发生了偏移,使“正常值显得有点不正常,异常值显得有点正常”

举一个例子,我们有一个考试成绩y和学习时长x的数据集,实验过程如下:

import numpy as np
import sklearn.linear_model as linear_model
#第一步,得到训练集exam_data1和测试集exam_data2
exam_data1 = np.array([[1, 2, 3, 4, 5],
                    [57, 70, 76, 84, 91]]).T
# One anomaly replaces a normal point
exam_data2 = np.array([[1, 2, 3, 4, 5],
                      [57, 70, 99, 84, 91]]).T

ftrs, tgt = exam_data1[:,0:1], exam_data1[:,1]
#第二步,利用训练集拟合线性回归模型
lr_train = linear_model.LinearRegression().fit(ftrs, tgt)
print(f'Slope: {lr_train.coef_}')#系数项
print(f'Intercept: {lr_train.intercept_:.{3}}')#截距项
#第二步,确定阈值为略高于训练集分数的最大值
#用残差的平方作为异常分数
train_scores = (tgt - lr_train.predict(ftrs))**2 
margin = 0.01
threshold = max(train_scores) + margin
print(f'Threshold: {threshold:.{3}}')
#第三步,计算测试集的异常分数
anom_score = (exam_data2[:,1] - lr_train.predict(exam_data2[:,0:1]))**2
print("测试集的异常分数:",anom_score)
print("超过阈值的异常分数:",anom_score[(anom_score>threshold)])

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值