常用的正则化形式(横截面模型拟合优度过高的原因)
本文目录
横截面模型拟合优度过高的原因
所谓模型过拟合现象:在训练网络模型的时候,会发现模型在训练集上表现很好,但是在测试集上表现一般或者很差。总结一句话:已知数据预测的很好,但对未知数据预测得很差的现象。模型过拟合将图片数据的噪声当成特征点学习进去,导致模型的泛化能力很差,只能在训练集上表现不错,对未知的其它样本预测表现不佳!我们通过深度学习或者机器学习的根本问题是解决优化和泛化的问题平衡。优化问题:训练模型以在训练数据上得到最佳性能。泛化问题:模型在测试集上的取得很好的性能。简单分析在模型训练过程的初期和后期:2、模型拟合模型拟合分为过拟合和欠拟合以及适度拟合。下面以表格的形式表示拟合程度的简要判断标准。训练集准确率测试集准确率得出结论不好不好欠拟合好不好过拟合好好适度拟合以下是欠拟合、适度拟合、过拟合的抽象数学表达以及形象展示拟合的程度。第1组模型欠拟合:模型复杂度过低,抽象出的数学公式过于简单,有很多错分的数据,不能很好的你和我们的训练集。第2组模型拟合适度:虽然有个别错误数据点,但是预测新数据效果很好。第3组模型过拟合:模型复杂度过高,抽象出的数学公式非常复杂,很完美的拟合训练集的每个数据,但过度强调拟合原始数据。预测新数据时它的表现性很差。3、简述原因欠拟合:训练的特征量过少。模型复杂度过低,网络模型过于简单。训练数据集非常不健康,存在大量的错误标注。过拟合:样本数量太少,样本数据不足以代表预定的分类规则。样本噪音干扰过大,将大部分噪音认为是特征从而扰乱了预设的分类规则。4、欠拟合解决办法对于欠拟合:总结一句话是模型简单的,样本数据量不够。扩充样本数据,则增加更多的样本数据特征,使输入数据具有更强的表达能力。增加模型复杂度:更换更复杂的网络模型,或者网络模型取消掉原有的正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数,不过这种方法一般不用,通常是更换更复杂的网络。增加模型训练的迭代次数,模型训练迭代次数太少,训练的数据特征未充分学习。手动调整参数和超参数。5、过拟合解决办法对于过拟合:发生过拟合最常见的现象就是数据量太少而模型太复杂。训练集的数量级和模型的复杂度不匹配,大致思路是训练集的数量级要小于模型的复杂度。首先增加训练数据数的样本数据量,并检查样本标签的准确性,训练集越多,过拟合的概率越小。最好的是人工标注高质量的数据,可以采用一定的数据增强策略,来实现数据集的扩充。注意扩充后的图像要手动确认,因为可能会有脏数据,从而会引入一定的噪声,噪声也会影响模型的性能的。样本噪音干扰过大,需要手动清理掉脏数据,否则模型过分学习了噪音特征,反而忽略了真实的输入输出间的关系参数太多,模型复杂度过高,将模型更换为更简单的网络模型,或者正则化L1和L2。 L1是模型各个参数的绝对值之和。L2是模型各个参数的平方和的开方值。使用正则化约束:损失函数后面添加正则化项,可以避免训练出来的参数过大从而使模型过拟合。使用正则化缓解过拟合的手段广泛应用,不论是在线性回归还是在神经网络的梯度下降计算过程中,都应用到了正则化的方法。常用的正则化有l1正则和l2正则。使用Dropout,即按一定的比例去除隐藏层的神经单元,使神经网络的结构简单化。torch.nn.Dropout(0.6),这里的0.6是神经元不保留的概率。使用BN:Batch Normalization批归一化处理层,作用非常大。使得每一层的数据分布不变,做归一化处理,加快了模型的收敛速度,避免梯度消失、提高准确率。保证训练数据的分布和测试数据的分布要保持一致,否则模型学习识鸟,你用它识别鸡蛋。不要过度训练,提前结束训练early-stopping:训练时间足够长,模型就会把一些噪声隐含的规律学习到,这个时候降低模型的性能是显而易见的。所以建议在模型迭代训练时候记录训练精度(或损失)和验证精度(或损失),如果模型训练的效果不再提高,比如训练误差一直在降低但是验证误差却不再降低甚至上升,这时候便可以结束模型训练了。手动调整参数和超参数。
(二):GBDT算法梳理
GBDT(Gradient Boosting Decision Tree)是一种采用加法模型(即基函数的线性组合)与前向分步算法并以决策树作为基函数的提升方法。通俗来说就是,该算法由多棵决策树组成,所有树的结论加起来形成最终答案。 GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
要理解GBDT算法,得先来了解一下什么是前向分步算法。下面一起来瞧瞧。
我们将
作为加法模型,其中b(x;γm)为基函数,γm为基函数的参数,βm为基函数的系数,βm表示着对应的基函数在加法模型f(x)中的重要性。
在给定训练数据和损失函数L(y,f(x))的条件下,学习加法模型成为经验风险极小化 (即损失函数极小化问题) :
前向分步算法求解这一优化问题的思路: 因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步去逼近上述的目标函数式,就可简化优化的复杂度,每一步只需优化如下损失函数:
前向分步算法流程:
因此,前向分布算法将同时求解从m=1到M的所有参数βm, rm的优化问题简化为逐次求解各个βm, rm的优化问题。
提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失和指数损失函数时,每一步优化很简单,但对一般损失函数而言,每一步的优化并不容易。Freidman提出了 梯度提升算法 (gradient boosting),其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树(用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树)。第t轮的第i个样本的损失函数的负梯度表示为:
. 其中 J 为叶子节点的个数。
针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值Ctj
如下:
这样我们就得到了本轮的决策树拟合函数如下:
从而本轮最终得到的强学习器的表达式如下:
通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用 GBDT 来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。
在GBDT算法中,损失函数的选择十分重要。针对不同的问题,损失函数有不同的选择。
1.对于分类算法,其损失函数一般由对数损失函数和指数损失函数两种。
(1)指数损失函数表达式:
(2)对数损失函数可分为二分类和多分类两种。
2.对于回归算法,常用损失函数有如下4种。
(1)平方损失函数 :
(2)绝对损失函数 :
对应负梯度误差为:
(3)Huber损失 ,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失误差,而对于靠近中心的点则采用平方损失。这个界限一般用分位数点度量。损失函数如下:
对应的负梯度误差为:
(4)分位数损失。 它对应的是分位数回归的损失函数,表达式为:
其中 θ为分位数,需要我们在回归之前指定。对应的负梯度误差为:
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
这里我们再看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。 为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。
和 Adaboost 一样,我们也需要对 GBDT 进行正则化,防止过拟合。GBDT 的正则化主要有三种方式。
在scikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBDT的回归类。两者的参数类型完全相同,当然有些参数比如损失函数loss的可选择项并不相同。这些参数中,类似于Adaboost,我们把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。 下面我们就从这两个方面来介绍这些参数的使用。
这次基本上是个CRUD boy,对于这些资料都大部分没有消化完成,还不知道能用在哪个地方。 参考资料:
***隐藏网址***
更多文章:
diva dance(The Diva Dance的原唱是谁 追加100分)
2024年7月20日 19:40
jdbctemplate update(jdbcTemplate必须使用spring事务吗 否则不能提交)
2024年7月17日 17:21
paraphrase练习(paraphrase 有什么技巧么尽量具体一点,谢谢)
2024年7月14日 09:26
css选择器nthchild(CSS3 选择器nth-child()问题,谢绝抢答,求懂的大神)
2024年5月10日 15:35
volatile(c语言中volatile关键字是什么含义怎么办呢)
2023年11月11日 20:20
当前许可不支持影像服务器(安装solidworks2005时得到不了许可证 许可服务器不支持(-18,147,0)怎么办)
2024年8月12日 06:46
apache software foundation(tomcat是干什么用的)
2024年8月11日 00:15
大白菜安装linux教程(大白菜做的u盘启动可以安装linux系统吗)
2024年8月30日 01:30
用asp制作一个登录页面(用asp和access数据库作登录界面怎么做)
2024年7月24日 00:28
版本控制系统(linux、centos等开源软件在开发过程中,如果某个模块或功能同时被多个人修改,该怎么处理呢)
2024年7月8日 03:36
access update语句(如何优化access update语句)
2024年7月11日 03:13
modbus通讯协议(modbus协议是否就是RS232或者RS485, 如果不是又有哪些区别)
2024年7月22日 14:55