有没有办法将xgb原生模型加载到spark中



下面是我的场景:我用单机训练XGB模型,并希望将其加载到spark中处理数据。有办法做到吗?

官方文件给出了用spark训练xgb模型的方法,并将其转换为原生模型。但它并没有给出相反的方向。

XGBoostClassificationModel.load只支持传递spark版本的xgb模型路径,如果传递本机模型的路径,则会报错。

根据github.com/dmlc/xgboost/issues/3689,步骤是1,读取本地助推器,2,构建模型

github.com/dmlc/xgboost/issues/3689只解析了2个构造模型,但我找不到用xgboost spark 1.0.0 读取本地助推器的方法

我想加载本机助推器的方法可以分为两个步骤:

  1. 加载本地增强器
  2. 创建XGB模型
import ml.dmlc.xgboost4j.scala.XGBoost
val booster = XGBoost.loadModel(nativeBoostPath)
// create a bridge class according to github.com/dmlc/xgboost/issues/3689
val model = new XGBoostClassificationModelBridge("1",2, booster) // this will report error

但是第二步报告错误

我知道这个问题很老了,但当我试图在Spark/Scala中加载用Python训练的本机XGBoost模型时,我遇到了同样的问题。

这似乎适用于桥接类:

import ml.dmlc.xgboost4j.scala.Booster
import ml.dmlc.xgboost4j.scala.spark.XGBoostClassificationModel
import java.lang.reflect.Constructor
class XGBoostClassificationModelBridge(uid: String, numClasses: Int, _booster: Booster) {
val constructor: Constructor[XGBoostClassificationModel] = classOf[XGBoostClassificationModel].getDeclaredConstructor(classOf[String], classOf[Int], classOf[Booster])
constructor.setAccessible(true)
val xgbClassificationModel: XGBoostClassificationModel = constructor.newInstance(uid, Int.box(numClasses), _booster)
}

然后我就可以这样使用它了:

val booster = XGBoost.loadModel("/path/to/model.xgb")
val bridge = new XGBoostClassificationModelBridge(null, 20, booster)
val classifier = bridge.xgbClassificationModel
// if you need params:
classifier.set(classifier.objective, "multi:softprob")
classifier.set(classifier.missing, 0f)

试图直接在Booster对象上设置params似乎不起作用。

最新更新