如何在Scala中使用Spark获取XGBoost的特征重要性?

3

我正在尝试使用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 )

我现在缺少哪些步骤?


你正在尝试做什么? - Bob Dalgleish
也许问题不太清楚。一旦模型被训练,我想获得模型中每个特征的贡献/重要性/分数。通常这意味着调用scikit-learn中的feature_importance()方法。然而,我不知道如何获取这样的信息。@BobDalgleish - pmanresa93
2个回答

2
尝试一下这个:
val featureScoreMap = xgbModel.booster.getFeatureScore()
val sortedScoreMap = featureScoreMap.toSeq.sortBy(-_._2) // descending order

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

如果您真正想要的是特征实际名称与特征重要性分数配对,则应提供特征名称到特征索引的映射。


1
在你的代码中加入一些解释,说明它为什么可能有效。 - Bob Dalgleish

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

快速评论,我相信这个方法是在0.9版本中添加的(它绝对不可用于0.8版本)。 - Inox
如何打印变量的名称而不是f1,f2等? - Rio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接