Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 了解火花随机森林特征对结果的重要性_Apache Spark_Classification_Random Forest_Apache Spark Mllib - Fatal编程技术网

Apache spark 了解火花随机森林特征对结果的重要性

Apache spark 了解火花随机森林特征对结果的重要性,apache-spark,classification,random-forest,apache-spark-mllib,Apache Spark,Classification,Random Forest,Apache Spark Mllib,我正在使用RandomForest.featureImportances,但我不理解输出结果 我有12个特性,这是我得到的输出 我知道这可能不是一个特定于ApacheSpark的问题,但我找不到任何解释输出的地方 // org.apache.spark.mllib.linalg.Vector = (12,[0,1,2,3,4,5,6,7,8,9,10,11], [0.1956128039688559,0.06863606797951556,0.11302128590305296,0.09198

我正在使用RandomForest.featureImportances,但我不理解输出结果

我有12个特性,这是我得到的输出

我知道这可能不是一个特定于ApacheSpark的问题,但我找不到任何解释输出的地方

// org.apache.spark.mllib.linalg.Vector = (12,[0,1,2,3,4,5,6,7,8,9,10,11],
 [0.1956128039688559,0.06863606797951556,0.11302128590305296,0.091986700351889,0.03430651625283274,0.05975817050022879,0.06929766152519388,0.052654922125615934,0.06437052114945474,0.1601713590349946,0.0324327322375338,0.057751258970832206])

给定一个树集合模型,
RandomForest.featureImportances
计算每个特征的重要性

根据Leo Breiman和Adele Cutler在“随机森林”文档中对基尼重要性的解释,以及scikit learn的实施,本文将“基尼”重要性的概念推广到其他损失

对于树木的收集,包括增强和套袋,Hastine等人建议使用集合中所有树木的单株重要性的平均值

该特征重要性的计算如下:

  • 树上的平均值:
    • 重要性(特征j)=增益的总和(在特征j上分割的节点上),其中增益按通过节点的实例数进行缩放
    • 将树的重要性规格化为总和为1
  • 将特征重要性向量归一化为和1
参考资料:-15.3.2变量重要性第593页

让我们回到您的重要性向量:

val importanceVector=Vectors.sparse(12,数组(0,1,2,3,4,5,6,7,8,9,10,11),数组(0.1956128039688559,0.06863606797951556,0.11302128590305296,0.091986700351889,0.03430651625283274,0.05975817050022879,0.06929766152519388,0.052654922125894,0.0643705211494544,0.160171359046,2207327778))
首先,让我们按重要性对这些功能进行排序:

importanceVector.toArray.zipWithIndex
.map(u.swap)
.sortBy(-uuu.u 2)
.foreach(x=>println(x._1+“->”+x._2))
// 0 -> 0.1956128039688559
// 9 -> 0.1601713590349946
// 2 -> 0.11302128590305296
// 3 -> 0.091986700351889
// 6 -> 0.06929766152519388
// 1 -> 0.06863606797951556
// 8 -> 0.06437052114945474
// 5 -> 0.05975817050022879
// 11 -> 0.057751258970832206
// 7 -> 0.052654922125615934
// 4 -> 0.03430651625283274
// 10 -> 0.0324327322375338
这是什么意思?


这意味着您的第一个功能(索引0)是最重要的功能,权重约为0.19,而您的第十一个功能(索引10)是您的模型中最不重要的功能。

补充上一个答案:

我面临的一个问题是以csv的形式转储结果(featureName,Importance)

 val featureMetadata = predictions.schema("features").metadata
这是此元数据的json结构:

{
"ml_attr": {
              "attrs":
                  {"numeric":[{idx:I,name:N},...],
                   "nominal":[{vals:V,idx:I,name:N},...]},
                   "num_attrs":#Attr
                   }
            }
}            
提取重要性的代码:

val attrs =featureMetadata.getMetadata("ml_attr").getMetadata("attrs")
val f: (Metadata) => (Long,String) = (m => (m.getLong("idx"), m.getString("name")))
val nominalFeatures= attrs.getMetadataArray("nominal").map(f)
val numericFeatures = attrs.getMetadataArray("numeric").map(f)
val features = (numericFeatures ++ nominalFeatures).sortBy(_._1)

val fImportance = pipeline.stages.filter(_.uid.startsWith("rfc")).head.asInstanceOf[RandomForestClassificationModel].featureImportances.toArray.zip(features).map(x=>(x._2._2,x._1)).sortBy(-_._2)

//Save It now
sc.parallelize(fImportance.toSeq, 1).map(x => s"${x._1},${x._2}").saveAsTextFile(fPath)

非常好,详细的回答,谢谢!我在做多类分类-4类,有没有一种方法可以计算每个类的特征重要性?现在看来似乎不是这样。@other15,我的第一个想法是为你的4个类中的每一个训练一个二进制分类器。然后,您将拥有每个功能的重要性。我知道,这不是个好主意,但应该行得通。这不是个好办法。您考虑的是一种强烈的启发性说法,即分类对于每个分类器都是正确的,但情况可能并非如此。如果数据不平衡,你的结果将毫无意义。我将在那里开始搜索。谢谢