偏差和方差
- 偏差值得是算法的期望预测和真实预测之间的差距,反映了模型本身的拟合能力:方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所造成的的影响。
- 当模型越复杂的时候,拟合的程度越高,模型的训练偏差就会很小,但是如果放到测试集上模型的变化就会很大,也就是模型的方差很大。所以模型过于复杂的时候会导致过拟合。
- 当模型越简单的时候,模型的方差很小,在测试集和训练集上的额记过差别不会很大,但是因为模型比较简单,偏差就会很大,也就是训练的时候精确度就不高。
- 简单来说,假设训练时的准确度是98%,测试集上的准确度是96%,那么100%和98%之间的差距就是偏差,98%和96之间的差距就是方差
bagging是降低方差,boosting是降低偏差
bagging和boosting是集成学习的两种策略
- bagging:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。一般使用简单的多数投票,代表算法是随机森林(随机森林还引入了随机属性选择,在每个节点的构建过程中,随机的从节点的属性集合中选取一个属性子集,然后在子集中选择最优的属性来划分)
- boosting:迭代的方式训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关,代表算法是adaboost,GBDT。
对于bagging算法来说,由于我们并行的训练很多不同的分类器,目的就是降低方差,所以在构建每个基分类器的时候我们的目的就是降低偏差,所以我们会采用深度很深或者不剪枝的决策树。
对于boosting算法来说,每一步我们都会在上一步的基础上更加拟合原数据,所以可以保证偏差,在构建每个基分类器时目的就是要降低偏差,选择偏差更小的分类器,也就是更简单的分类器,所以我们一般选择深度很浅的决策树。
GBDT简介
参考https://blog.youkuaiyun.com/legendavid/article/details/78904353
GBDT主要由三个概念构成:回归决策树,梯度提升和缩减
- 回归树,基于回归树得到的数值进行加减是有道理的,GDBT运用了回归树的这个性质,在最后计算结果时将所有树的累加结果最为最终的结果。
(回归树和分类树的不同:回归树的每个节点得到的是一个预测值,也就是属于这个节点的所有人年龄的平均值,并且在节点的选择上,回归树采用了最小化均值方差来作为划分标准) - 梯度提升,基本思想为沿着梯度方向构造一系列的弱分类器函数,然后按照一定的权重组合起来,形成最终的强分类器。GDBT的核心在于每一棵树所学习的是之前所有树结论和的残差,也就是结论和和与真实值的差值(预测25岁,实际26岁,残差为1)
- 缩减,基本思想为没走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。也就是说不信任每一棵残差树,他认为每一颗残差树只学到了真理的一小部分,累加的时候也只累加一小部分,只有通过多学几棵树才能弥补不足。
优点
- 预测精度高
- 适合低维数据
- 能处理非线性数据
缺点 - 并行麻烦(因为上下两棵树有联系)
- 数据维度较高时会加大算法的计算复杂度
XGBoost
- GDBT是以CART为基分类器,XGBoost在这个基础上还支持线性分类器,并且XGBoot相当于带L1和L2正则化项的logistics回归问题
- XGBoost在目标函数中加入了正则项,用于控制模型的复杂度,正则项里面包含了树的叶子节点的个数和每棵树叶子节点上面输出分数的L2模平方,降低了模型的方差,防止过拟合。
- 树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost采用了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点
- Shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(当然普通的GBDT实现也有学习速率)
- 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行
- 列抽样(column subsampling):XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性
- 除此之外,XGBoost还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法效率
防止模型过拟合常用的方法
- 数据增强: 增加数据量来提高模型的泛化能力
- 提前终止训练(early stopping):在每一个epoch结束时计算validation data 的accuracy,如果accuracy不再提高就停止训练。通过迭代次数截断的方法来防止过拟合,即在模型对训练数据集迭代手链之前停止迭代来防止过拟合
- 正则化:在损失函数中引入正则项,使参数空间受到一定的限制。L1范数:称为系数规则算子,可以实现特征的自动选择,他会将没有信息的特征对应的权重重置为0,L2范数和L1范数不同的地方在于L2使得特征对应的权重尽量的小,接近于0但不会等于0,模型不会过分的学习训练集的某个特征,也就不容易造成过拟合。例如线性回归中的岭回归和lasso回归,加入lambda来缩减特征(岭回归限制系数的平方和(L2),lasso限制系数的绝对值和(L1)。
- 批标准化
- Dropout:使神经网络中的节点随机失活来降低模型的复杂度,也可以理解为在训练不同的神经网络,而不同的神经网络会以不同的方式过拟合,所以Dropout就类似于不同的神经网络以投票的方式降低过拟合。
常用的数据标准化方法
- Z-score标准化
目的:将不同量级的数据转化为同一个量级,保证数据之间的可比性
计算方法:首先计算出总体数据的均值 μ \mu μ,然后计算数据的标准差 σ \sigma σ
x i = x i − μ σ x_i= \frac{x_i-\mu}{\sigma} xi=σxi−μ - 最大-最小标准化
目的:也成为离散标准化,是对原始数据的线性变化,iangshuju映射到[0,1]之间
计算方法: x i = x i − m i n ( x ) m a x ( x ) − m i n ( x ) x_i= \frac{x_i-min(x)}{max(x)-min(x)} xi=max(x)−min(x)xi−min(x) - 小数定标法
目的:通过移动属性值的小数位数,将属性值映射到[-1,1]之间。
计算方法:k的大小取决于属性值绝对值的最大值 x i = x i 1 0 k x_i = \frac{x_i}{10^k} xi=10kxi
LSI与SVD原理
https://blog.youkuaiyun.com/qq_16633405/article/details/80577851