机器学习--处理数值型数据(二)

4.6 识别异常值

异常值是指显著偏离数据整体分布的极端值,可能是 “噪声(如输入错误、测量误差)”,也可能是 “真实的极端情况(如高收入用户、罕见疾病样本)”。准确识别异常值是后续处理的前提。

4.6.1 常见识别方法

  1. 3σ 原则(Z - 分数法)
    前提:假设特征服从正态分布。原理:计算每个样本的 Z - 分数(即标准化后的数值),若 (|Z| > 3),则视为异常值(正态分布中,99.7% 的数据落在 μ±3σ 内)。

  2. 箱线图法(四分位距法)
    原理:
    计算特征的四分位数:Q1(下四分位,25% 分位数)、Q3(上四分位,75% 分位数);
    计算四分位距(IQR):(IQR = Q3 - Q1);
    异常值判定:小于 (Q1 - 1.5 * IQR) 或大于 (Q3 + 1.5 * IQR) 的值。
    优点:不依赖数据分布假设,对偏态分布更鲁棒。

  3. 聚类法
    原理:用聚类算法(如 K-Means)将数据聚为若干类,计算每个样本到其聚类中心的距离,距离远于阈值的样本视为异常值。
    适用场景:数据分布复杂(无明显正态 / 偏态特征)的场景。

  4. 孤立森林(Isolation Forest)
    原理:基于决策树的无监督算法,通过 “随机划分特征空间”,异常值会被更快地孤立(划分次数更少),从而识别异常。
    适用场景:高维数据的异常值识别,效率较高。

问题描述

识别样本中的一些极端的观察值(异常值)。

解决方案

与其说识别异常值是一门技术不如说是一门艺术,常用的方法就是假设数据是正态分布的,基于这个假设,在数据周围“画”一个椭圆。将所有的处于椭圆内的观察值视为正常值(标注为1),将所有椭圆外的值视为异常值(标注为-1):

import numpy as np
from sklearn.covariance import EllipticEnvelope
from sklearn.datasets import  make_blobs

#创建模拟数据
feature,_ = make_blobs(n_samples=10,n_features=2,centers=1,random_state=1)

#将第一个观察值转换成极端值
feature[0,0] = 10000
feature[0,1] = 10000

#创建识别器
outlier_detector = EllipticEnvelope(contamination=.1)

#拟合识别器
outlier_detector.fit(feature)

#预测异常值
x = outlier_detector.predict(feature)
print(x)

讨论

这个方法的一个主要限制是它需要指定一个contamination(污染指数)参数,表示异常值在观察值中的一个比例-----这个值我们也不知道是多少。可以将contamination视为你估计的数据的清洁程度。如果你认为数据中只有很少几个异常值,可以将contamination设置得小一点。反之,如果数据中很有可能有好几个异常值,就将contamination设置成更大点的值。

注意:
除了查看所有的观察值,我们还可以之查看某些特征,并且使用四分位差(IQR)来识别这些特征的极端值。


import numpy as np
from sklearn.datasets import make_blobs
from sklearn.covariance import EllipticEnvelope

features,_ = make_blobs(n_samples=10,n_features
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创作者mateo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值