为什么提升方法对异常值敏感

机器算法验证 机器学习 支持向量机 异常值 大车 助推
2022-02-14 15:59:26

我发现很多文章都指出提升方法对异常值很敏感,但没有文章解释原因。

以我的经验,异常值对任何机器学习算法都是不利的,但为什么提升方法特别敏感?

以下算法如何根据对异常值的敏感性进行排名:boost-tree、随机森林、神经网络、SVM 和逻辑回归等简单回归方法?

4个回答

异常值可能不利于提升,因为提升会在之前树的残差/错误上构建每棵树。异常值的残差将比非异常值大得多,因此梯度提升将不成比例的注意力集中在这些点上。

您指定的算法用于分类,因此我假设您不是指目标变量中的异常值,而是输入变量异常值。Boosted Tree 方法对输入特征中的异常值应该是相当稳健的,因为基学习器是树分裂。例如,如果拆分为x > 35 和 5,000,000,则视为相同。这可能是也可能不是一件好事,但这是一个不同的问题。

相反,如果您谈论的是目标变量中的回归和异常值,那么增强树方法的灵敏度将取决于所使用的成本函数。当然,平方误差对异常值很敏感,因为差异是平方的,这将极大地影响下一棵树,因为提升尝试拟合损失的(梯度)。然而,还有更强大的误差函数可用于提升树方法,如Huber 损失和绝对损失。

关于这个主题的一个很好的文献综述可以在

Alexander Hanbo Li 和 Jelena Bradic “在存在异常值时提升:具有非凸损失函数的自适应分类”美国统计协会杂志2018. 预印本链接:https ://arxiv.org/abs/1510.01064

最近在更便宜和更快的数据采集和存储技术方面取得的进展导致了各种研究领域的数据复杂性爆炸式增长,例如高通量基因组学、生物医学成像、高能物理学、天文学和经济学。结果,噪声积累、实验变化和数据不均匀性变得很严重。因此,开发在此类环境中高效且准确的分类方法是一个具有重要实际意义的问题。然而,众所周知,这种环境中的分类会带来许多统计挑战,并需要新的方法和理论。对于二元分类问题,我们假设存在可分离的,属于两个类别的无噪声数据,其中攻击者独立破坏了两个类别的许多观察结果。有许多设置属于这个通用框架。随机翻转标签设计,其中类成员的标签被随机翻转,是一个可能非常频繁发生的例子,因为标签容易出现许多错误,无论是人为的还是其他的。另一个例子是观察中存在异常值,其中来自两个类的少量观察具有大于其余观察的噪声的方差。这种情况可能会随着大数据和异构数据的新时代而自然发生,其中数据被破坏(任意或恶意)并且子组可能表现不同;

因此,相当大的努力集中在寻找适应数据中相对误差的方法上。尽管这导致了算法,例如 Grünwald 和 Dawid (2004),当污染模型 (Scott et al., 2013) 已知或多个数据的嘈杂副本是可用的(Cesa-Bianchi et al., 2011),测试集中的良好泛化错误绝不是保证。当污染模型未知时,这个问题会更加复杂,需要自动检测异常值。尽管异常值去除算法取得了进展,但仍然存在重大的实际挑战(由于其中施加的极其严格的条件)。在本文中,我们专注于集成算法。在这些当中,AdaBoost (Freund and Schapire, 1997) 已被证明在解决许多不同类型的分类问题方面简单而有效。AdaBoost 和其他前向贪心算法(例如 LogitBoost(Friedman 等人,2000))的美观和简单性也有助于对过度拟合进行默许防御,尤其是与算法的提前终止相结合时(Zhang 和 Yu,2005)。弗里德曼等人。(2000) 提出了一个强大的统计视角,将 AdaBoost 视为一种基于梯度的增量搜索,使用指数损失来寻找良好的加法模型。梯度提升 (Friedman, 2001) 和 AnyBoost (Mason et al., 1999) 使用这种方法将提升思想推广到更广泛的问题和损失函数系列。这个标准的动机是指数损失是铰链的凸替代物或 0-1 损失。然而,在存在标签噪声和/或异常值的情况下,它们的性能都会迅速恶化(Dietterich,2000)。尽管像 LogitBoost、MadaBoost (Domingo and Watanabe, 2000)、Log-lossBoost (Collins, et al., 2002) 等算法能够比 AdaBoost 更好地容忍噪声,但它们仍然对异常值不敏感。因此,当观察到的数据很少或没有噪声时,它们是有效的。然而,Long 和 Servedio (2010) 指出,任何具有凸损失函数的提升算法都非常容易受到随机标签噪声模型的影响。他们构建了一个简单的例子,从这里表示的 Long/Servedio 问题,不能被上面的提升算法“学习”。

在 boosting 中,我们尝试选择算法结果较差的数据集,而不是随机选择数据子集。这些困难的例子是重要的学习,所以如果数据集有很多异常值并且算法在这些异常值上表现不佳,那么学习这些困难的例子算法将尝试选择具有这些例子的子集。