啊啊啊,被迫重新营业,最近决定把遇到的一些问题及解决方案放到CSDN上,做简单的记录,至于系统性的知识还是自己搭个博客吧~
问题发现
为了使用样本权重,最近将xgboost4j-spark升级到0.9版本,跑了个模型auc看起来还行,生成的模型放到线上,效果惨不忍睹。不应该啊,于是对比了下线上和线下的打分没有一致,线下用的是xgboost4j-spark的transform进行打分,线上用的是开源的xgboost go版本预测,先定位问题吧。
问题追查
线上模型加载会不会有问题啊?那就再找一个其他版本的xgboost都统一个模型进行打分看看到底是spark的问题还是go的问题。于是找了python版本的xgboost,发现python版本的预测跟go版本是一致的。
这时候开始怀疑spark版本的transform是不是和用native booster存储的模型在某些参数上不一致导致了预测分值不一致。
接着对比了同一个模型在transform和native booster的打分,同一个模型打分居然是不同的。
/** by native booster **/
var t1 = samplesForLocal.map(_._1)
val t2 = samplesForLocal.map(_._2).toIterator
val dMatrix = new DMatrix(t2)
val ret = xgbClassificationModel.nativeBooster.predict(dMatrix)
val nativeResult = t1 zip ret
println("nativeResult:")
nativeResult.map{
x