常见问题
本文档包含关于 XGBoost 的常见问题。
如何调整参数
请参阅 参数调优指南。
模型描述
请参阅 提升树简介。
我的数据集很大
XGBoost 设计为内存高效。通常,只要数据能装入内存,它就可以处理这些问题。这通常意味着数百万个实例。
如何处理类别特征?
访问此教程以获取类别数据处理的详细说明和一些示例。
为什么不在 X (Spark, Hadoop) 之上实现分布式 XGBoost?
首先我们需要知道的是,采用分布式并不一定能解决所有问题。相反,它会产生更多问题,例如更多的通信开销和容错问题。最终的问题仍然是如何突破每个计算节点的极限,并使用更少的资源来完成任务(从而减少通信和失败的可能性)。
为了实现这些,我们决定复用单节点 XGBoost 中的优化,并在其之上构建分布式版本。机器学习中的通信需求相当简单,我们可以依赖一组有限的 API。这种设计允许我们复用大部分代码,同时可移植到 Hadoop/Yarn、MPI、SGE 等主要平台。最重要的是,它突破了我们能使用的计算资源的极限。
如何将模型移植到我自己的系统?
XGBoost 的模型和数据格式是可以交换的,这意味着用一种语言训练的模型可以在另一种语言中加载。这意味着你可以使用 R 训练模型,同时使用 Java 或 C++ 运行预测,这在生产系统中更常见。你也可以使用分布式版本训练模型,然后从 Python 中加载它们进行一些交互式分析。请参阅 模型 IO 了解更多信息。
你们支持 LambdaMART 吗?
是的,XGBoost 实现了 LambdaMART。请查看 参数 中的目标函数部分。
如何处理缺失值
XGBoost 默认支持缺失值。在树算法中,训练过程中会学习缺失值的分支方向。请注意,gblinear 助推器将缺失值视为零。
当指定 missing
参数时,输入预测器中等于 missing
的值将被视为缺失值并被移除。默认情况下设置为 NaN
。
多次运行结果略有不同
这可能发生,由于浮点数求和顺序的不确定性以及多线程的影响。此外,分布式框架导致的数据分区变化也可能是一个问题。不过,总体准确率通常会保持不变。
为什么稀疏数据和密集数据结果不同?
树助推器将“稀疏”元素视为“缺失”,线性助推器将其视为零。然而,如果我们将稀疏矩阵转换回密集矩阵,稀疏矩阵可能会用 0 填充缺失的条目,而 0 对于 xgboost 是一个有效值。简而言之,像 scipy 这样的稀疏矩阵实现将 0 视为缺失,而 0 对于 XGBoost 决策树是一个有效的分裂值。