如何在Spark中使用新的DMatrix for XGBoost4J

时间:2017-11-17 11:09:05

标签: apache-spark xgboost

我有一个RDD,其元素是ml.dmlc.xgboost4j.LabeledPoint,就像

org.apache.spark.rdd.RDD[ml.dmlc.xgboost4j.LabeledPoint]

函数XGBoost.train需要DMatrix来训练数据,我查看xgboost源代码并找到DMatrix的构造函数,就像DMatrix(Iterator iter,String cacheInfo)。 DMatrix API

但是,我不知道为DMatrix构建Iterator。

任何解决方案?

此外:我只能在spark1.5中使用xgboost4j -v0.5,因此新版本中的某些功能无法使用。

1 个答案:

答案 0 :(得分:0)

您可以在xgboost github上找到一个用法示例:https://github.com/dmlc/xgboost/blob/master/jvm-packages/xgboost4j-example/src/main/scala/ml/dmlc/xgboost4j/scala/example/spark/SparkWithRDD.scala

相关部分是:

import org.apache.spark.ml.feature.{LabeledPoint => MLLabeledPoint}
import org.apache.spark.ml.linalg.{DenseVector => MLDenseVector}

 val trainRDD = MLUtils.loadLibSVMFile(sc, inputTrainPath).map(lp =>
      MLLabeledPoint(lp.label, new MLDenseVector(lp.features.toArray)))
    val testSet = MLUtils.loadLibSVMFile(sc, inputTestPath)
        .map(lp => new MLDenseVector(lp.features.toArray))
    // training parameters
    val paramMap = List(
      "eta" -> 0.1f,
      "max_depth" -> 2,
      "objective" -> "binary:logistic").toMap
    val xgboostModel = XGBoost.trainWithRDD(trainRDD, paramMap, numRound, nWorkers = args(1).toInt,
      useExternalMemory = true)
    xgboostModel.predict(testSet, missingValue = Float.NaN)