如何使用spark获得scala中XGBoost的特性重要性?

如何使用spark获得scala中XGBoost的特性重要性?,scala,xgboost,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

我正在尝试使用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 )
我现在错过了哪些步骤?

试试这个:

val featureScoreMap = xgbModel.booster.getFeatureScore()
val sortedScoreMap = featureScoreMap.toSeq.sortBy(-_._2) // descending order
getFeatureScore方法将返回特征重要性图(类型:map[String,Integer]),其中键为特征索引(例如:f0、f1、f2…)(特征索引与训练数据集中用于训练模型的特征顺序相同),整数为特征分数(通过在训练模型中累积该特征的信息增益计算)


如果您真正想要的是功能实名与功能重要性评分,那么您应该向功能索引映射提供功能名称。

上面的答案是
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)

你想做什么?可能问题还不清楚。一旦模型经过训练,我想得到模型中每个特性的贡献/重要性/分数。这通常转化为调用scikit学习特性中的典型方法_重要性()。但是,我不知道如何获取此类信息。@BobDalgleish请对代码添加一些解释,说明它可能会起作用的原因。快速评论,此方法是在0.9版中添加的(在0.8版中肯定不可用)。如何打印变量的名称,而不是f1、f2,。。。?