防止过拟合

本文介绍机器学习中防止过拟合的多种方法,包括早停法、数据集扩增、L1/L2正则化及Dropout等。重点讨论了L2正则化如何通过权重衰减减少模型复杂度,L1正则化如何促使权重稀疏,以及Dropout如何通过随机失活神经元降低模型依赖。

本文是《Neural networks and deep learning》概览 中第三章的一部分,讲机器学习/深度学习算法中常用的正则化方法。

在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。

为了防止overfitting,可以用的方法有很多,下文就将以此展开。有一个概念需要先说明,在机器学习算法中,我们常常将原始数据集分为三部分:training data、validation data,testing data。这个validation data是什么?它其实就是用来避免过拟合的,在训练过程中,我们通常用它来确定一些超参数(比如根据validation data上的accuracy来确定early stopping的epoch大小、根据validation data确定learning rate等等)。那为啥不直接在testing data上做这些呢?因为如果在testing data做这些,那么随着训练的进行,我们的网络实际上就是在一点一点地overfitting我们的testing data,导致最后得到的testing accuracy没有任何参考意义。因此,training data的作用是计算梯度更新权重,testing data则给出一个accuracy以判断网络的好坏。

避免过拟合的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout。

L2 regularization(权重衰减)

L2正则化就是在代价函数后面再加上一个正则化项:

技术分享

C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。

L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:

技术分享

可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:

技术分享

在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1?ηλ/n ,因为η、λ、n都是正的,所以 1?ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。

另外,需要提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:

技术分享

技术分享

对比上面w的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。

到目前为止,我们只是解释了L2正则化项有让w“变小”的效果,但是还没解释为什么w“变小”可以防止overfitting?人们普遍认为:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)。而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。



L1 regularization

在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n(这里不像L2正则化项那样,需要再乘以1/2,具体原因上面已经说过。)

技术分享

同样先计算导数:

技术分享

上式中sgn(w)表示w的符号。那么权重w的更新规则为:

技术分享

比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

另外,上面没有提到一个问题,当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉η*λ*sgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)



Dropout

L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧(trike)。它的流程如下:

技术分享

假设我们要训练上图这个网络,在训练开始时,我们随机地“删除”一半的隐层单元,视它们为不存在,得到如下的网络:

技术分享

保持输入输出层不变,按照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,因为它们被“临时删除”了)。

以上就是一次迭代的过程,在第二次迭代中,也用同样的方法,只不过这次删除的那一半隐层单元,跟上一次删除掉的肯定是不一样的,因为我们每一次迭代都是“随机”地去删掉一半。第三次、第四次……都是这样,直至训练结束。

以上就是Dropout,它为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。

更加深入地理解,可以看看Hinton和Alex两牛2012的论文《ImageNet Classification with Deep Convolutional Neural Networks》



数据集扩增(data augmentation)

“有时候不是因为算法好赢了,而是因为拥有更多的数据才赢了。”

不记得原话是哪位大牛说的了,hinton?从中可见训练数据有多么重要,特别是在深度学习方法中,更多的训练数据,意味着可以用更深的网络,训练出更好的模型。

既然这样,收集更多的数据不就行啦?如果能够收集更多可以用的数据,当然好。但是很多时候,收集更多的数据意味着需要耗费更多的人力物力,有弄过人工标注的同学就知道,效率特别低,简直是粗活。

所以,可以在原始数据上做些改动,得到更多的数据,以图片数据集举例,可以做各种变换,如:

  • 将原始图片旋转一个小角度

  • 添加随机噪声

  • 一些有弹性的畸变(elastic distortions),论文《Best practices for convolutional neural networks applied to visual document analysis》对MNIST做了各种变种扩增。

  • 截取(crop)原始图片的一部分。比如DeepID中,从一副人脸图中,截取出了100个小patch作为训练数据,极大地增加了数据集。感兴趣的可以看《Deep learning face representation from predicting 10,000 classes》.

    更多数据意味着什么?

用50000个MNIST的样本训练SVM得出的accuracy94.48%,用5000个MNIST的样本训练NN得出accuracy为93.24%,所以更多的数据可以使算法表现得更好。在机器学习中,算法本身并不能决出胜负,不能武断地说这些算法谁优谁劣,因为数据对算法性能的影响很大。

技术分享


转载出处: http://blog.youkuaiyun.com/u012162613/article/details/44261657
<think>首先,用户的问题是:“我想查找随机森林防止过拟合的方法 请问随机森林防止过拟合的方法”。这是在询问随机森林算法中防止过拟合的具体方法。 我有五个引用来源: - 引用[1]:提到随机森林防止过拟合的方法,包括减少每个树的复杂度(如控制深度),减少构建决策树时使用的特征数量。 - 引用[2]:描述随机森林中的两个随机采样过程——行采样(有放回抽样)和列采样(特征采样),这有助于防止过拟合。 - 引用[3]:解释随机森林作为bagging方法,通过行和列采样来避免过拟合。 - 引用[4]:提到树的构建不剪枝,因为随机性减轻过拟合,但也说过拟合可能与样本质量、数量等有关。 - 引用[5]:这是一个广泛的机器学习流程,包括数据预处理、特征选择等,提到防止过拟合的参数设置和特征重要性。 用户的上一个问题似乎没有提供,但从系统指令看,我需要基于这些引用回答。 关键点是总结防止过拟合的方法。从引用中提取: 1. **行采样(Bootstrap Aggregating/Bagging)**:有放回地抽样样本,每个树使用不同的样本子集(引用[2]和[3])。 2. **列采样(特征采样)**:在构建每个决策树时,随机选择一部分特征用于分裂(引用[1]、[2]和[3])。 3. **控制树的复杂度**:减少决策树的深度或限制树的生长(如max_depth),以避免单个树过拟合(引用[1])。 4. **增加树的数量**:构建多个树(n_estimators),通过集成降低方差(引用[4]中提到树的数量,如100左右)。 5. **特征选择**:基于特征重要性减少特征数量(引用[1]和[4])。 6. **数据预处理**:在引用[5]中提到,如处理缺失值、异常值、标准化数据,可以提高模型泛化能力。 7. **参数调优**:如调节n_estimators、max_depth等参数(引用[5])。 8. **交叉验证**:确保模型泛化(引用[5])。 在回答时,我需要结构化,并用中文。系统指令要求回答结构清晰,逐步解决问题。 回答结构: - 开头解释什么是过拟合和随机森林如何减轻它。 - 然后列出具体方法,基于引用。 - 自然地添加引用标识。例如,末尾添加[^1]、[^2]等。 最后,生成相关问题,系统指令有§§相关问题§§部分。 相关问题示例: 1. 为什么随机森林不容易过拟合? 2. 随机森林中特征采样如何工作? 3. 如何调优随机森林参数来防止过拟合? 基于引用,确保真实可靠。 完整回答: 1. 介绍:随机森林通过集成多个决策树和随机性减轻过拟合(参考引用[1]、[2]、[3])。 2. 方法列表: - 行采样(有放回抽样):每个树使用不同的样本集,增加多样性[^2]。 - 列采样(特征抽样):在节点分裂时,随机选择部分特征,减少相关性[^1][^2][^3]。 - 控制树深度:设置最大深度(max_depth)避免过深树过拟合[^1]。 - 增加树数量:更多树降低方差(n_estimators通常在100左右)[^4]。 - 特征选择:使用特征重要性减少不相关特征[^1][^4]。 - 数据预处理:如标准化、处理缺失值,提高数据质量[^5]。 - 参数调优:交叉验证优化参数[^5]。 3. 结束语:总结防止过拟合的综合方法。 添加引用:在每个相关点后自然地添加,如:"通过行采样减少过拟合风险[^2]"。 相关问题: 1. 随机森林中的bagging和boosting有什么区别? 2. 如何解释随机森林的特征重要性? 3. 在实际项目中,如何评估随机森林是否过拟合? 确保LaTeX正确:用户问题中没有数学表达式,所以可能不需要用$...$或$$...$$,除非涉及公式。这里似乎不需要。 输出格式:系统指令有示例,如“快速排序”部分。回答主体后,有“相关问题”部分。 最终回答结构: - 回答主体(中文) - §§相关问题§§ - 相关问题列表(1. ... 2. ...) </think>### 随机森林防止过拟合的方法 随机森林是一种集成学习算法,通过组合多个决策树来提高泛化能力。虽然它天生具有抗过拟合的特性(如通过随机采样降低方差),但在实际应用中,仍需采取特定措施进一步防止过拟合。以下是基于引用资料总结的主要方法,我将逐步解释这些方法的工作原理和实施建议。 1. **行采样(Bootstrap Aggregating/Bagging)** 在构建每个决策树时,使用有放回抽样(bootstrap)从原始数据集随机抽取样本子集(样本量为N),这确保了每个树使用的训练数据不同。这种随机性增加了模型的多样性,减少了对特定样本的依赖,从而降低过拟合风险[^2][^3]。例如,如果原始数据集有1000个样本,每个树可能只使用约600个样本(部分样本可能重复),避免模型过度拟合噪声数据。 2. **列采样(特征采样)** 在决策树的节点分裂过程中,仅随机选择一部分特征(m个特征,其中 \( m \ll M \),M为总特征数)进行分裂评估。这减少了特征间的相关性,防止模型过于依赖少数强特征而导致过拟合[^1][^2][^3]。例如,在分类任务中,如果总共有50个特征,每次分裂时可能只随机选取 \( m = \sqrt{50} \approx 7 \) 个特征,以增强随机性。 3. **控制树的复杂度** 限制单个决策树的深度或节点数量,避免树生长过深。决策树越深,越容易捕捉训练数据中的噪声,导致过拟合。通过设置参数如最大深度(max_depth)、最小样本分裂数(min_samples_split)或最小叶子节点样本数(min_samples_leaf),可以简化树结构[^1][^4]。在实际应用中,建议从较浅的树开始调优(例如 max_depth=5-10),并根据交叉验证结果调整。 4. **增加树的数量(n_estimators)** 构建更多决策树(例如100棵或更多),通过集成降低整体模型的方差。树的数量越多,模型越稳定,但需权衡计算成本(通常在训练集性能饱和时停止增加)[^4]。需要注意的是,树数量过多也可能轻微增加过拟合风险,因此应结合交叉验证选择最优值。 5. **特征选择与重要性分析** 在训练前或训练后,基于随机森林提供的特征重要性评分,移除低重要性或不相关特征。这减少了噪声输入,简化模型结构。例如,使用特征重要性排名(如GINI系数或信息增益)过滤掉重要性低于阈值的特征[^1][^4][^5]。 6. **数据预处理** 确保输入数据质量:处理缺失值(如填充均值或删除)、检测异常值(如箱线图分析)、标准化数值特征,以及平衡类别分布(针对分类问题)。高质量数据能提升模型泛化能力,间接防止过拟合[^5]。 7. **参数调优与验证** 通过交叉验证(如k-fold)优化关键参数,例如树的数量、最大深度或特征采样比例(max_features)。比较训练集和测试集性能:如果训练集准确率远高于测试集(如训练精度95% vs. 测试精度70%),表明过拟合,需调整参数或增加数据[^5]。 ### 为什么这些方法有效? 随机森林通过上述随机性(行采样和列采样)和集成机制,本质上是“平均”多个高方差模型的输出,从而减小整体方差(过拟合的核心原因)。然而,如果数据噪声大或特征冗余,过拟合仍可能发生。因此,建议结合多种方法:例如,使用特征采样和控制树复杂度作为基础,再通过数据预处理和参数调优进一步优化[^1][^3][^5]。 如果需要具体实现,Python的scikit-learn库提供了简单接口: ```python from sklearn.ensemble import RandomForestClassifier # 示例代码:设置防止过拟合的参数 model = RandomForestClassifier( n_estimators=100, # 增加树数量 max_depth=10, # 限制树深度 max_features='sqrt', # 特征采样比例:sqrt(总特征数) min_samples_split=5, # 节点最少样本数 random_state=42 # 确保可复现性 ) model.fit(X_train, y_train) ``` 通过合理应用这些方法,随机森林可以在保持高精度的同时,有效避免过拟合问题[^1][^2][^3][^4][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值