文本分类的14种算法(5)

文本分类的14种算法(5)

lightGBM

lightGBM是对GBDT算法的一种改进,先说说GBDT算法:
之前的AdaBoosting是Boosting框架+任意基学习器算法+指数损失函数。
GBDT是Boosting框架+CART回归树模型+任意损失函数。
AdaBoosting利用前一轮迭代弱学习器的误差率来更新训练集的权重,而GBDT采用梯度下降法。
GBDT在迭代的每一步构建一个能够沿着梯度最陡的方向降低损失的学习器来弥补已有模型的不足。就是说,本轮迭代找到决策树,要让样本的损失(与真实值的偏离)尽量变得更小。对于回归算法,常用的损失函数有:均方差、绝对损失、Huber损失、分位数损失,其中后两种主要用于减少异常点的影响。
在GBDT中,数据集没有权重,不同梯度的数据集在计算信息增益时产生不同的作用。根据信息增益的定义,对于有更大梯度(即训练不足的数据集)将产生更多信息增益(即其获得的“确定性效益”更高)。于是,当降低数据集的数据量时,通过保持大梯度的数据集,随机丢掉小梯度的数据集,保持信息增益的准确性。

值得注意的是AdaBoosting的误差率、权重和GBDT的梯度都是在弱分类器之间的关系上的,是在分类器迭代时起作用的,而不是用在单个弱分类器/决策树的节点分裂层面上的。但这是对下一轮的决策树的生成/节点的分裂有影响的,让损失变小的方法即设计下一棵决策树。

LightGBM是一个梯度Boosting框架,就是对GBDT算法的一种改进。除了在运行速度、占用空间、准确率方面的提升,LightGBM还针对GBDT由于使用的弱分类器存在依赖性,具体深究还是看链接吧:
https://www.cnblogs.com/jiangxinyang/p/9337094.html
lightgbm的包要另装,不在sklearn包里,跑一下:
文本分类的14种算法(5)_第1张图片

xgBoost

xgBoost也是一种基于决策树的boosting算法。xgBoost的决策树和CART一样是根据特征和特征值分类的二叉决策树。既然要生成二叉决策树,在节点分裂的时候就逃不掉两点:1.选哪个特征作为分类指标。2.选多大的特征值作为作为分类指标。所以我们来看看他的目标函数(损失函数):
文本分类的14种算法(5)_第2张图片
其中||w||为叶子节点向量的模,这样说应该清楚点:
文本分类的14种算法(5)_第3张图片
目标函数第一部分l就是说误差要小;T就是说决策树的叶节点也不能多;||w||的平方项要小是为了使节点分出来要均衡,防止过拟合(树的预测值是各叶节点的预测值之和,一个叶节点预测值占比过大就有这个节点的重要性被高估的可能,即过拟合)。其中l是树的误差方面,T和w是树的复杂度方面。

损失函数据说是可以自己定义的,但要可以二阶泰勒展开。
注意这里的wj是我们要求的,给每个节点选定他的分类阈值/类别,这个分类阈值/类别使损失函数最小。
于是我们的流程就是:选特征、算最小分类阈值、分叉,选特征、算最小分类阈值、分叉…
注意上述的wj的计算的意义是针对节点分裂而言的
值得注意的是传统CART的分类阈值/特征是特征本身的分类/阈值里经过计算比较“找”出来的:
在这里插入图片描述
而这里的分类阈值/类别是我们根据损失函数自己求出来、“算”出来的,公式推导网上很多。

求出来的wj本身作为节点分裂时节点的分类阈值(预测值),此时wj影响该决策树的损失函数,使损失函数最小,也就确定了生成的决策树与真实值的偏离越来越小,所以调优。
也就是说,确定了树的形状和节点的值,下一棵决策树自然就确定了。

xgBoost除了正则化防止过拟合,支持自定义损失函数,xgBoost还在特征粒度(注意不是树粒度)上支持并行,在节点分类计算特征增益时可以多线程并行。

和lightGBM相比,xgBoost的不足之处主要有:
1.每轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。
2.预排序方法的时间和空间的消耗都很大。
3.对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。
这些点上lightGBM都相应做了优化。

你可能感兴趣的:(大数据)