5.过拟合和如何避免
基本概念:泛化;拟合和过拟合;复杂度控制
主要技巧:交叉验证;属性选择;树修剪
规则化
泛化
过拟合
过拟合检验
维持数据和拟合图
树归纳中的过拟合
数学方程中的过拟合
例子:过拟合线性方程
*例子:为什么过拟合不好?
从维持估计到交叉验证
重访客户流失数据集
学习曲线
避免过拟合和复杂度控制
树模型避免过拟合
避免过拟合总的方法
*避免过拟合:参数优化
总结
第五章 过拟合和其避免
基本概念:泛化;拟合和过拟合;复杂度控制
主要技巧:交叉验证;特征选择;树修剪;规则化
实际应用中的“侥幸(fluke)”是在设计阶段中的反复思考试验中获得的。
过拟合
任何模型都有过拟合的倾向,这是没有办法消除的。正确的策略是在复杂度和过拟合之间权衡。以下探讨评估过拟合的程度以及尽量避免过拟合。
过拟合检验
保留数据和拟合图
决策树如果穷尽所有属性很容易导致过拟合。
从上图中可以推断,过拟合从TREE SIZE=100开始控制了模型,所以我们应该把树模型尺寸(树模型叶节点)控制在100,但是现在没人想出决定准确甜点(sweet spot)的理论方法所以我们不得不依赖经验技巧。
数学函数中的过拟合
首先考虑如何使模型变得复杂:
在基本线性模型中加入新的属性(是已有参数的函数),加入这样的属性越多,模型越复杂,就能够拟合更多的样本点。
可以人工通过上述方法进行特征筛选,但是遇到大数据集,通常自动筛选。
例子:过拟合线性函数
逻辑回归线性模型对异常点或离群点特别敏感,它会把它们考虑其中,常会发生过拟合——把这些离群点也拟合了。但是SVM对它们就不敏感。SVM对于不同的数据集更稳健。
从保留评估到交叉验证
保留评估只是进行了一次评估。交叉验证可以进行多次,可以给我们提供根多统计信息如均值和方差。
侧条:
尽量建立和实际使用中环境相同的实验室环境。否则模型性能会大为下降。记住,将数据作为资产。
学习曲线
学习曲线:
x:不同的数据集大小, y:测试集上表现
比较,拟合曲线:
x:同样大小的数据集,不同的模型的复杂度;y:训练和测试集的表现
学习曲线除了帮我们验证模型是否过拟合,还知道我们应用正确的样本量。之前说过,数据是战略资产,通过学习曲线的分析,可以帮助决策是否要继续投入。
过拟合避免和复杂度控制
树模型有很大的灵活性,没有控制机制很容易过拟合。
避免决策树过拟合:
两个思路:
1.在它变得太复杂之前停止增长
2.修剪使之减小,复杂度也减少
具体的说:
最简单的方式就是限制叶节点的最小实例数。
极端的例子就是只有一个实例。
那到底选什么阈值呢?研究者找到一种统计停止点。
统计学提供了一个“假设检验”的概念,粗略地说,假设检验试图评估某些统计数据的差异是否仅仅是由于偶然因素造成的。
大多数情况下,假设检验是基于“p值”的,该值给出了统计差异是由于偶然性的概率的限制。如果p值低于这个阈值(通常为5%),那么假设检验得出的结论是,这种差异可能不是偶然的。
为了限制树木生长,一种方法是在每一个节点上进行假设检验,以确定观察到的信息增益的差异是否可能是偶然的。如果得出结论是这种差异可能不是偶然的,那就继续让树生长(是否意味着计算节点上类别比率和设定值进行比较,如果太小,那就是偶然的,就不用再生长了?)
**
这段结合多重比较理解,对我来说是比较精深的内容,是新知识,它对统计来说很重要,所以必须弄懂。
多重比较:显著性检验(假设检验)进行许多次后,出现错误的可能性会增大。
假设检验通常用来判定统计结果的差异到底是由于偶然,还是确有实质差异。
例子:
比如用1000枚硬币进行足够多次数投掷实验,其中一枚硬币(0.001的概率的硬币)正面朝上的概率是60%,其余99.9%的硬币正反面概率基本等同。
提出假设H0:样本之间的差异是由于偶然引起的。
备选假设H1:样本之间存在本质上的差异,实际意义就是那枚正面朝上概率60%的硬币,它真的是一个投掷起来会正面朝上概率较大的硬币。
那如何验证假设呢?
我们需要预先设定检验水准,通常为0.001,0.05,0.1,这里选择0.05.
p=0.001是一个小概率事件,这个结论就是用p<0.05得出来的。
**
减小过渡拟合的第二个策略是“修剪”过大的树。剪枝就是把树叶和树枝剪下来,用树叶代替。通过估计去掉某个树枝是否会降低准确性来决定是否要剪枝。
避免过拟合的通用方法:
构建各种各样复杂度的模型,然后比较它们之间的泛化性能(如果我们跳过模型精度和方差的比较)。
但需要注意一点:最终的测试数据应该有严格的独立性。
我们可以把训练集再分成训练子集和测试子集。然后,我们可以在这个训练子集上构建模型,并根据这个测试子集选择最佳模型。让我们将前者称为子训练集,后者称为验证集,以便更清晰。验证集与最终的测试集是分开的,在最后的测试集上我们永远不会做出任何建模决策。这个过程通常被称为嵌套坚持测试。
回到我们的分类树示例,我们可以从子训练集中归纳出许多复杂的树,然后从验证集估计每个树的泛化性能。假设这个评估的最佳模型有122个节点(“最佳点”)的复杂性。然后我们可以使用这个模型作为我们的最佳选择,可能会估计最终坚持测试集的实际泛化性能。这个模型是建立在我们训练数据的一个子集上的,因为我们必须保持验证集来选择复杂度。但是一旦我们选择了复杂性,为什么不从原始的训练集中引入一个包含122个节点的新树呢?然后我们可能会得到两方面的好处:使用子训练/验证分离来选择最好的复杂度而不污染测试集,并在整个训练集(子训练加验证)上构建这种最佳复杂度的模型。
*参数优化中避免过拟合
避免过拟合包括复杂度控制:在拟合数据和模型复杂度之间找到权衡。参数模型不像树模型可以自己选择参数,因此它需要选择一套“对的”属性。
在目标函数中加入惩罚项,最常用的就是权重的平方和*某个系数(L2-norm penalty)。来减小属性权重过大带来的影响。
引入L2-norm penalty的回归模型叫做“脊回归”
引入L1-norm penalty(权重的绝对值和*某个系数)叫做拉索回归。它更常被称为L1-规则化,它让很多参数趋近于0(要解释这一点非常有技术性)。因为这些参数是特征的相乘权重,它有效的进行了一种自动化的特征选择,进而避免了过拟合。
特别的,线性支持向量机模型基本上等同于L2-规则化逻辑回归(SVM自带合页损失函数)。
工具条:小心“多重比较”
如果你将1000枚硬币多次投掷,其中一枚硬币正面向上的概率会超过50%,而其余99.5%的正反面概率基本想等。如果你将这枚硬币取出来,认为投掷它更有可能获得正面向上的结果,那是愚蠢的。
这是一个重要的统计学现象。总有混沌混杂其中,但是我们还是可以找到混沌的规律。
业务分析师和数据科学家要牢记这一点。当有人做了很多测试,然后选择看起来不错的结果时,要小心:这个结果很可能只是偶然发生的事件,一个小概率事件,基本上不会发生,也没有实际意义。统计学书籍会警告人们不要运行多个假设测试,然后再去看那些给出“显著”结果的测试。这通常违反了统计测试背后的假设,结果的实际意义是可疑的。
多次试验下,会出现偶然性的结果,没有实际意义。
总结
数据挖掘包括基本的模型复杂度和泛化性的权衡。
所有模型都有可能过拟合,没有(现在)单一的方法可以消除过拟合。最好的策略是在保留数据中发现过拟合。通过拟合图发现“甜点”——最合适的复杂性。
一个常用的实验性的方法叫做交叉验证,即系统性的查分数据集产生多种可衡量的表现。好处在于可以看到结果的平均表现和方差。
严格控制模型复杂度避免过拟合的通用方法叫做模型规则化,比如树剪枝(预剪枝,避免树变得过大),特征选择(拉索惩罚,使相关性较小的特征参数趋近于零,相当于特征选择),等等。