目录
一、集成模型
1、随机森林-RF模型(bagging)
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树
2、AdaBoost模型(基于权值)
AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写。它的自适应在于:前一个基本分类器分错的样本会得到加权,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
具体说来,整个Adaboost 迭代算法就3步:
第一步初始化训练数据的权值分布:如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
第二步训练弱分类器:具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,最后直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
第三步将各个训练得到的弱分类器组合成强分类器:各个弱分类器的训练过程结束后,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
3、GBDT模型(基于残差)
与AdaBoost不同,GBDT每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型。
具体说来,整个GBDT迭代算法就3步:
第一步第一棵树预测结果:有一个样本[数据->标签]:[(2,4,5)-> 4],第一棵决策树用这个样本训练的预测为3.3
第二步第二课树预测结果:第二棵决策树训练时的输入就变成了:[(2,4,5)-> 0.7]
第三步:下一棵决策树输入样本会与前面决策树的训练和预测相关,最后直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
4、XGBoost模型(boosting)
与GBDT不同
第一,GBDT将目标函数泰勒展开到一阶,而xgboost将目标函数泰勒展开到了二阶。保留了更多有关目标函数的信息,对提升效果有帮助。
第二,GBDT是给新的基模型寻找新的拟合标签(前面加法模型的负梯度),而xgboost是给新的基模型寻找新的目标函数(目标函数关于新的基模型的二阶泰勒展开)。
第三,xgboost加入了和叶子权重的L2正则化项,因而有利于模型获得更低的方差。
第四,xgboost增加了自动处理缺失值特征的策略。通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理
5、LightGBM模型(boosting)
LightGBM是XGBoost的改进版,添加了很多新的方法来改进模型,包括:并行方案、基于梯度的单边检测、排他性特征捆绑等。
第一,XGBoost使用基于预排序的决策树算法,每遍历一个特征就需要计算一次特征的增益,时间复杂度为O(datafeature)。
而LightGBM使用基于直方图的决策树算法,直方图的优化算法只需要计算K次,时间复杂度为O(Kfeature)
第二,XGBoost使用按层生长(level-wise)的决策树生长策略,LightGBM则采用带有深度限制的按叶子节点(leaf-wise)算法。在分裂次数相同的情况下,leaf-wise可以降低更多的误差,得到更好的精度。leaf-wise的缺点在于会产生较深的决策树,产生过拟合。
第三,支持类别特征,不需要进行独热编码处理
第四,优化了特征并行和数据并行算法,除此之外还添加了投票并行方案
第五,采用基于梯度的单边采样来保持数据分布,减少模型因数据分布发生变化而造成的模型精度下降
第六,特征捆绑转化为图着色问题,减少特征数量
二、模型调参
1.贪心调参方法(坐标下降)
坐标下降法是一类优化算法,其最大的优势在于不用计算待优化的目标函数的梯度。最容易想到一种特别朴实的类似于坐标下降法的方法,与坐标下降法不同的是,不是循环使用各个参数进行调整,而是贪心地选取了对整体模型性能影响最大的参数。参数对整体模型性能的影响力是动态变化的,故每一轮坐标选取的过程中,这种方法在对每个坐标的下降方向进行一次直线搜索(line search)
先使用当前对模型影响最大的参数进行调优,达到当前参数下的模型最优化,再使用对模型影响次之的参数进行调优,如此下去,直到所有的参数调整完毕。
特性:就是可能会调到局部最优而不是全局最优
#这里列举一下日常调参过程中常用的参数和调参顺序:
#①:max_depth、num_leaves
#②:min_data_in_leaf、min_child_weight
#③:bagging_fraction、 feature_fraction、bagging_freq
#④:reg_lambda、reg_alpha
#⑤:min_split_gain
2.网格调参方法(GridSearchCV)
作用是在指定的范围内可以自动调参,只需将参数输入即可得到最优化的结果和参数。相对于人工调参更省时省力,相对于for循环方法更简洁灵活,不易出错。
在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
特性:网格搜索的结果会更优,但是网格搜索只适合于小数据集,缺陷是计算代价非常非常大,面临维度灾难。
3.随机调参方法(RandomizedSearchCV)
随机搜索顾名思义就是在超参的搜索分布中随机搜索几个超参进行尝试
特性:随机搜索的好处在于搜索速度快,但是容易错过一些重要的信息
4.贝叶斯调参
贝叶斯优化通过基于目标函数的过去评估结果建立替代函数(概率模型),来找到最小化目标函数的值。贝叶斯方法与随机或网格搜索的不同之处在于,它在尝试下一组超参数时,会参考之前的评估结果,因此可以省去很多无用功。
超参数的评估代价很大,因为它要求使用待评估的超参数训练一遍模型,而许多深度学习模型动则几个小时几天才能完成训练,并评估模型,因此耗费巨大。贝叶斯调参发使用不断更新的概率模型,通过推断过去的结果来“集中”有希望的超参数。
三、模型验证
评估模型,看模型的泛化能力。可以利用留出法或k折交叉验证法验证模型的好坏。
3.1诊断偏差与方差
如果一个算法表现的不理想,多半是出现两种情况,一种情况是偏差比较大(这种情况是欠拟合情况),另一种是方差比较大(这种情况是过拟合的情况)。下图是欠拟合、刚好、过拟合三种情况的Size-price图(仍然是预测房价的示例)。
那么,多项式的次数对cv误差的影响是什么呢?
总结:
在欠拟合(高偏差)情况下:J_train(Θ)比较高,并且J_cv(Θ)≈J_train(Θ);
在过拟合(高方差)情况下:J_train(Θ)比较低,但是J_cv(Θ)比较高,J_cv(Θ) >> J_train(Θ)。
3.2正则化和偏差、方差
算法正则化能够通过控制λ的值,使参数Θ尽可能地小,这样可以有效防止过拟合问题的发生,那么,正则化和算法的方差/偏差到底有什么关系呢?正则化系数λ的大小对方差/偏差的影响是什么呢?
由上图可知,当λ非常大的时候,对Θ的压缩也比较大,使得θ1、θ2、......、θn都≈0(记住,θ0没有被压缩),因此h(x)≈θ0,即h(x)是一条直线,在这种情况下,会出现欠拟合的现象,若最左侧的图;中间的图形是比较合适的λ,这种情况下拟合效果"Just right";最右侧的图是过拟合的情况,在这种情况下,λ的值较小。
正则化参数λ对J_train(θ)曲线和J_cv(θ)曲线的有什么影响呢?
3.3模型学习曲线
学习曲线是在训练集大小不同时,通过绘制模型训练集和交叉验证集上的准确度来观察模型在新数据上的表现,进而判断模型的方差或偏差是否过高,以及增大训练集是否可以减小过拟合。
本部分主要分析三张图的曲线,、和 对应的学习曲线及其分析。
(一)的学习曲线
由右侧图形可知,随着训练集样本数的增加,二次函数拟合的效果越来越差,即训练误差越来越高。而随着训练样本数的增加,验证误差/测试误差越来越小,即当m足够大时,cv error(test error)≈train error。
(二)的学习曲线
上图的学习曲线是高偏差(high bias)的情况,在这种情况下:
(1)当m较小时,train error较小,cv error(test error)非常大
(2)当m较大时,train error≈cv error(test error),这是由于在接近找到最好的拟合函数时,train error和cv error(test error)趋于平稳。
以上表明:当学习算法出现高偏差时,使用更多的训练数据集不会有太大的帮助。
(三)的学习曲线
上图的学习曲线是高方差(high variance)的情况,在这种情况下:
(1)当m较小时,train error较小,cv error(test error)非常大
(2)当m较大时,仍然存在train error < cv error(test error),train error和cv error(test error)之间有一定的距离。但是两者都越来越接近于desired performance曲线。
以上表明:当学习算法出现高方差时,使用更多的训练数据集可能会有帮助。
3.4模型验证曲线
和学习曲线不同,验证曲线的横轴为某个超参数的一系列值,由此比较不同参数设置下(而非不同训练集大小)模型的准确率。
3.5改进模型
改进模型的方法:
1、获取更多的训练集数据 ---> 解决高方差问题(过拟合)
2、减少特征数量 ---> 解决高方差问题(过拟合)
3、增加特征 ---> 解决高偏差问题(欠拟合)
4、增加多项式特征 ---> 解决高偏差问题(欠拟合)
5、减小lamda ---> 解决高偏差问题(欠拟合)
6、增大lamda ---> 解决高方差问题(过拟合)
参考链接: