XGBoost实践总结
曾经参与一个数据分析项目,其中需要对数据进行分类预测,使用了XGBoost模型,一些经验和感悟梳理如下供参考。
项目背景
输入数据是结构化的表格数据项,数据类型有数字型(离散类别,连续数字)和文本型,连续数字项最多,占比70%以上。
输出是分类
模型选择
因为项目要求模型的输出要有一定的可解释性,即是什么原因导致的分类结论,所以DNN/CNN/RNN等深度学习模型新贵首先被pass了。而在传统机器学习模型中,XGBoost在各大赛事中常常有耀眼的成绩(XGBoost号称结构化数据的大杀器),考虑到是对结构化数据的处理和模型的可解释性,外加XGBoost实现起来也比较容易(网上有很多学习资料和开源demo代码等,可以快速实现),于是决定选择XGBoost。而通过在小数据集上对比测试,也验证了这一点,XGBoost的表现确实优于逻辑回归,贝叶斯,SVM,随机森林等。
从其他文章介绍来看,lightGBM和CatBoost据说也不错,与XGBoost相当,它们都属于集成学习的Boosting一类,其实也可以考虑。本项目因为时间问题,没有进一步考证。
XGBoost原理
XGBoost算法的思想就是将多个树模型(CART回归树)集成在一起,通过众多CART树的集成,互补提升(Boosting),纠正前面学习器残差,多个学习器相加在一起形成一个强分类器。
XGBoost训练过程就是不断地添加树,不断地进行特征分裂来生长一棵树,直到达到目标。每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。训练完成后将得到的多棵树合在一起来对样本进行预测。预测过程就是根据目标样本的特征,在每棵树中落到对应的一个叶子节点,每个叶子节点对应一个分数,最后将每棵树对应的分数加起来就是该样本的预测值。预测值通过转换得到样本的分类。
XGBoost效果
总样本随机抽取20%作为独立测试集,其他作为训练集。训练样本数据经过数据清洗,特征提取,和标准化后,进入XGBoost模型进行训练。XGBoost针对训练准确率可调参数不多,主要是生成树个数和树深度,在实际调试中,其他参数对准确率影响较小。
如果特征较多,可以加大树的个数和深度。此外,如果训练样本偏少,可以采用交叉验证的方法。
训练完成后对独立测试集(总样本中随机抽取)进行测试,效果不错,可以满足项目需要。
XGBoost扩展
尝试通过模型扩展进一步提升准确率,包括多模型投票,融合模型(Blending), 堆叠模型(Stacking),但测试后发现效果没有改善。说明在较好的特征工程下,模型提升空间有限。各种方法描述如下:
- 多模型投票:XGBoost,逻辑回归,贝叶斯,随机森林,SVM,决策树分别进行训练和预测,对预测结果进行投票或加权。
- XGBoost+LR融合模型:先用已有特征训练Xgboost模型,然后利用Xgboost模型学习到的树来构造新特征(样本通过树落在叶子节点的叶子位置信息),最后把这些新特征加入原有特征一起训练LR模型。
- XGBoost/RF+GBDT Stacking模型:训练集5折交叉验证生成预测结果(5个模型)得到新训练数据,测试集在5个模型上的预测结果平均得到新测试数据,新的训练数据和测试数据。堆叠XGBoost/RF,拼接得到训练数据和测试数据,进行GBDT训练。
XGBoost使用总结
- 从提升准确率角度来说,特征工程最重要,甚至比模型选择还要重要。开发实现过程中,特征工程也是最耗时间推敲的地方。
- XGBoost运行性能不错(得益于其简单的算法,新树的生成可以直接从前面的树计算得到),也不需要GPU,从训练调试和工程部署角度,这是相当不错的选择。
总而言之,如果是处理结构化数据的分类预测,XGBoost方案确实值得考虑。
浙公网安备 33010602011771号