如何剔除数据中的异常值?

对数据进行剔除异常值的时候,一般剔除到什么阶段呢?或者说应该剔除的异常值占总异常值的百分之多少?还有就是我剔除的异常值,占总体数据的三分之一,这正常吗…
关注者
76
被浏览
468,922

21 个回答

首先回归到问题本质,什么是「异常」?

用常识来理解,异常必须是小概率事件 。所以当你把大部分数据都通过某种方法检测为异常时,那么大概率是出错了。一般来说,我们默认异常在10%以内,甚至更低。在真实的场景下很多都是低于1%的。绝大部分机器学习工具库默认异常比例是10%。

其次,绝大部分异常检测算法的输出都是连续的数值。 假设有五个样本,那么检测算法会给出比如[0.1, 0.35, 12, 3.4, 0.2]这种结果。当你认为有1个异常时,那么12就是异常,有两个时可能[12, 3.4]会被认为是异常。所以异常的结果其实是排序,而“是”与“不是”取决于你认为异常的比例。

最后再讨论一下怎么选择异常的比例

  1. 假设你有历史数据,知道异常的大概比例,直接使用即可
  2. 如果条件允许,你可以随机挑选k个数据来人工验证异常比例,手动算一个异常的比例
  3. 当然,你可以观察异常值的变化情况,尤其是突然的“断层” 。比如异常值是[0.1, 0.2, 0.3, 0.2, 18, 19],那么大概认为[18,19]是异常时合理的。但绝大部分算法输出是非线性的,因此这个方法也仅供参考
  4. 训练多个模型(可以是算法或者参数上的不同),比如t个。然后找出每个模型异常值最高的k个样本,那么理论上一个样本可以做多出现t次。这样你可以选择一个阈值,比如 一个样本至少出现了0.5t次。这个其实只是把异常比例转化为了阈值。 用集成学习的思路增强选择的鲁棒性
  5. 如果这些方法都无法使用,就用默认的5%或者10%也行。

总体而言, 异常检测的输出是连续的,那么直接一刀切是没有太大的意义的。评估模型应该更多的使用基于排序的指标 ,比如ROC或者average precision。从保守意义上出发,或者说从数据预处理的角度出发,去掉小于10%的数据往往是可以接受的。