• Spark XGBoost的一些问题

    2017/12/18 Creed 3 评论

在使用Spark版本的xgboost的时候会有一些单机版本遇不到的问题,可能对使用的人造成一些困扰,经过两周的踩坑,总结一下,希望有帮助

1、输入、预测数据的一致性

Spark版本的XGBoost处理的输入可以是RDD或者DataFrame。由于Spark的机制,在没有显式指定的情况下,是不会保存RDD或者DataFrame的内容的。所以预测之后得到结果的RDD和原本输入的RDD不能够保证对应关系。所以建议对需要预测的RDD输入显式的persist,不太建议cache。

2、样本逐条预测

为了保证输入输出对应的一致性,可以想到可以通过或者XGBoost.booster,通过广播到每一个Executor,然后就可以比较高效的逐条预测,实验过程中发现失败率比较高,不太建议这么做。

3、样本中包含missing value的情况。

当样本中的某列变为Float.NaN的时候,会发现报一个XGBoost train failed的错误,查看每个Executor的情况,可以看到是由于OOM导致的Container错误。这个问题找了很久,最后每个Executor的core数量设置为1,内存为14G解决。  猜测处理missing data导致了对内存的需求变大。

4、CV

在Spark中XGBoost的CV 通常只能通过mllib的Pipeline来做。同时,Spark版本的XGBoost没有eval_list接口,所以每一步的train和test的loss不太直观。根据版本不同,有些版本配置eval_matric后,可以在Spark任务的stdout或者stderr中有每一步的train loss。有些版本则没有这个功能。

5、其他

Spark版本的XGBoost相对于单机版本API和开发完成度低很多,所以如果在单机多线程版本能够满足计算性能需求的情况下,不太建议使用Spark版本。对于Spark版本的XGBoost,官方说法最多支持5TB的数据输入,测试在1TB的数据情况下没有问题。

以上

2 收藏


直接登录
最新评论