我正在尝试使用Spark2.1.1在Scala2.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 )
我现在遗漏了哪些步骤?
发布于 2018-12-11 19:45:03
试试这个:
val featureScoreMap = xgbModel.booster.getFeatureScore()
val sortedScoreMap = featureScoreMap.toSeq.sortBy(-_._2) // descending order
getFeatureScore方法将返回特征重要性图(类型: MapString,Integer),其中关键字是特征索引(例如:f0,f1,f2...)(特征索引与用于训练模型的训练数据集中的特征顺序相同),整数是特征得分(通过在训练模型中累积此特征的信息增益来计算)。
如果您真正想要的是功能实名与功能重要性得分配对,那么您应该为功能索引映射提供功能名称。
发布于 2019-05-14 07:56:01
上面的答案说,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)
https://stackoverflow.com/questions/46835979
复制相似问题