如何使用spark获取scala中XGBoost的功能重要性?

时间:2017-10-19 17:49:15

标签: scala xgboost

我正在尝试使用Spark 2.1.1在Scala 2.11中获得XGBoost模型的功能重要性。我的代码到目前为止

(...)

def get_param(): mutable.HashMap[String, Any] = {

    val params = new mutable.HashMap[String, Any]()
    params += "eta"             -> Configuration.eta
    params += "max_depth"       -> Configuration.maxDepth
    params += "gamma"           -> Configuration.gamma
    params += "objective"       -> Configuration.objective
    params += "alpha"           -> Configuration.alpha
    params += "lambda"          -> Configuration.lambda
    params += "subSample"       -> Configuration.subSample
    params += "minChildWeight"  -> Configuration.minChildWeight

    return params
  }

val model = XGBoost.trainWithDataFrame(trainingDataCached, 
                                       get_param().toMap, 
                                       Configuration.numberOfRounds, 
                                       nWorkers = Configuration.numberOfWorkers, 
                                       useExternalMemory = useExternalMemory )

我现在缺少哪些步骤?

2 个答案:

答案 0 :(得分:0)

尝试:

val featureScoreMap = xgbModel.booster.getFeatureScore()
val sortedScoreMap = featureScoreMap.toSeq.sortBy(-_._2) // descending order

getFeatureScore方法将返回特征重要性地图(类型:Map [String,Integer]),其中键为特征索引(例如:f0,f1,f2 ...)(特征索引与特征相同训练数据集中用于训练模型的顺序),整数是特征得分(通过在训练模型中累积该特征的信息增益来计算)。

如果您真正想要的是特征实名和特征重要性得分,那么您应该提供特征名称到特征索引图。

答案 1 :(得分:0)

上面的答案说xgbModel.booster.getFeatureScore()通过累积信息增益来计算特征分数。这是不正确的。实际上,它是通过累加每个特定功能的树分割数来计算分数的。

在XGBoost版本0.8中,通过Spark中的信息获取来计算获得功能重要性的方法如下:

// first empty string argument means using a null feature map.
val featureScoreMap_gain = xgbModel.nativeBooster.getScore("", "gain")
println("feature importance by information gain is :")
println(featureScoreMap_gain)