lightgbm:
一、位置:
相比XGB,LGBM有更高效的计算效率和更低的内存占用,并且面对高维数据,LGBM算法拥有更好的过拟合特性,这使得在建模数据量日趋增加的今天,LGBM会更适合作为前期探索性建模的模型
CatBoost算法同样在训练效率上比XGB更快,并且更加自动化——在特征衍生和超参数优化已经成为机器学习模型训练标配的今天,CatBoost能够(一定程度上)实现对输入的特征进行自动特征衍生和对超参数进行自动超参数优化。
LGBM以牺牲极小的计算精度为代价,将GBDT的计算效率提升了近20倍
方法:
LGBM充分借鉴了XGB提出的一系列提升精度的优化策略,同时在此基础之上进一步提出了一系列的数据压缩和决策树建模流程的优化策略。
二、优化点在三个方面:
数据压缩:
1.全样本上连续变量分箱(连续变量离散化):等宽分箱,
2.同时带入离散特征和离散后的连续变量进行离散特征捆绑(合并)降维:互斥特征捆绑(Exclusive Feature Bundling, EFB)算法
降维且不让精度下降太多
独热编码逆向过程:
如果两个变量互斥(我取1你就不取1,不会同时取得非0)
冲突比例:冲突样本占非全0样本比例
图着色问题:如果两个特征互斥比例小于设定的阈值,则没有边相连。然后对图着色,用尽可能少的颜色对图染色,相邻节点不同色。
从度最大的点出发,开始着色。
最后赋予新特征取值:不同颜色取不同的值
原理思考:如果冲突比例过大,新生成的值会很多,特征压缩效果太大
3.最终在每次构建一颗树之前进行样本下采样:基于梯度的单边采样(Gradient-based One-Side Sampling, GOSS)的方法
目的:压缩数据集并且不太降低精度。
计算样本梯度,小梯度样本进行抽样,再结合大梯度样本一起建模。
为了还原原始数据集梯度,用膨胀系数,最终数据集样本梯度=大样本梯度+小样本梯度*膨胀系数
而膨胀系数=(1-大梯度样本比例)/小梯度样本阈值
注意点:
top_rate越大other_rate越小好一些。
以上方法只适用于lightgbm,不能单独使用
建模优化方法:
1.直方图优化算法:通过直方图的形式更加高效简洁的表示每次分裂前后数据节点的核心信息,并且父节点和子节点也可以通过直方图减法计算直接算得,从而加速数据集分裂的计算过程
用直方图代替原始数据集来训练,大幅加快决策树生长过程。
直方图:每个特征的梯度和 、hess和图
2.leaf wise tree growth的叶子节点优先的决策树生长策略:LGBM则允许决策树生长过程优先按照节点进行分裂,即允许决策树“有偏”的生长
希望精度提升,过拟合风险更大些。
3.LGBM决策树生长的增益计算公式
图
对于实际计算过程的优化:例如Voting Parallel(投票特征并行)方法、特征多线程并行处理方法、GPU加速方法和分布式计算
三、超参数
LGBMClassifier特殊参数:
Boosting过程控制超参数:boosting_type(提升类型,如gbdt、dart、goss、rf)
与之相关的是subsample_for_bin参数:subsample_for_bin:该参数表示对连续变量进行分箱时(直方图优化过程)抽取样本的个数,默认取值为200000,当实际抽样个数大于输入训练数据样本数量时,会带入全部样本进行计算。而如果boosting_type选择的是goss,则在直方图优化时会自动完成抽样,具体抽样策略是:会保留所有较小梯度的样本(即那些已经被模型很好拟合的样本),并对较大梯度的样本进行采样。这种策略能够在加速训练(大梯度样本的贡献)的同时有效防止过拟合(小梯度样本的贡献)。因此,如果boosting_type选择的是 "goss",。则subsample_for_bin参数会失去作用,此时无论subsample_for_bin取值多少都不影响最终结果。
特征和数据处理类超参数则主要与数据采样有关:包含subsample(样本子集的比例)、subsample_freq(进行子采样的频率)、colsample_bytree(列采样的比例)
subsample:模型训练时抽取的样本数量,取值范围为 (0, 1],表示抽样比例,默认为1.0
subsample_freq:抽样频率,表示每隔几轮进行一次抽样,默认取值为0,表示不进行随机抽样(如果它为0,则不论subsample是多少,都不抽样)
colsample_bytree:在每次迭代(树的构建)时,随机选择特征的比例,取值范围为 (0, 1],默认为1.0
特征和数据处理类超参数:
注意:
LGBM和RF的不同特征抽样(分配)规则:LGBM和随机森林不同,随机森林是每棵树的每次分裂时都随机分配特征,而LGBM是每次构建一颗树时随机分配一个特征子集,这颗树在成长过程中每次分裂都是依据这个特征子集进行生长。
LGBMRegressor:
和LGBMClassifier只有两点不同,其一是LGBMRegressor没有class_weight参数,其二则是LGBMRegressor的损失函数和LGBMClassifier完全不同。
损失函数:包含了GBDT和XGB的各类回归类损失函数