PySpark& MLLib:随机森林特征重要性

时间:2015-03-10 19:01:44

标签: apache-spark pyspark random-forest apache-spark-mllib

我试图提取我使用PySpark训练过的随机森林对象的要素重要性。但是,我没有在文档中的任何地方看到这样做的示例,也不是RandomForestModel的方法。

如何从PySpark中的RandomForestModel回归量或分类器中提取要素重要性?

以下是文档中提供的示例代码,以便我们开始使用;但是,没有提到其中的特征重要性。

from pyspark.mllib.tree import RandomForest
from pyspark.mllib.util import MLUtils

# Load and parse the data file into an RDD of LabeledPoint.
data = MLUtils.loadLibSVMFile(sc, 'data/mllib/sample_libsvm_data.txt')
# Split the data into training and test sets (30% held out for testing)
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# Train a RandomForest model.
#  Empty categoricalFeaturesInfo indicates all features are continuous.
#  Note: Use larger numTrees in practice.
#  Setting featureSubsetStrategy="auto" lets the algorithm choose.
model = RandomForest.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo={},
                                     numTrees=3, featureSubsetStrategy="auto",
                                     impurity='gini', maxDepth=4, maxBins=32)

我没有看到model.__featureImportances_属性可用 - 我在哪里可以找到它?

6 个答案:

答案 0 :(得分:11)

版本更新> 2.0.0

从版本2.0.0开始,正如您所见,here,随机森林可以使用FeatureImportances。

事实上,您可以找到here

  

DataFrame API支持两种主要的树集合算法:随机森林和梯度提升树(GBT)。两者都使用spark.ml决策树作为基础模型。

     

用户可以在MLlib Ensemble指南中找到有关整体算法的更多信息。   在本节中,我们将演示用于集合的DataFrame API。

     

此API与原始MLlib合奏API之间的主要区别在于:

     
      
  • 支持DataFrames和ML Pipelines
  •   
  • 分类与回归的分离
  •   
  • 使用DataFrame元数据来区分连续和分类功能
  •   
  • 随机森林的更多功能:估计特征重要性,以及每个类别(a.k.a.类条件概率)的预测概率。
  •   

如果您想拥有功能重要性值,则必须使用 ml 包,而不是 mllib ,并使用数据帧。

下面是一个示例,您可以找到here

# IMPORT
>>> import numpy
>>> from numpy import allclose
>>> from pyspark.ml.linalg import Vectors
>>> from pyspark.ml.feature import StringIndexer
>>> from pyspark.ml.classification import RandomForestClassifier

# PREPARE DATA
>>> df = spark.createDataFrame([
...     (1.0, Vectors.dense(1.0)),
...     (0.0, Vectors.sparse(1, [], []))], ["label", "features"])
>>> stringIndexer = StringIndexer(inputCol="label", outputCol="indexed")
>>> si_model = stringIndexer.fit(df)
>>> td = si_model.transform(df)

# BUILD THE MODEL
>>> rf = RandomForestClassifier(numTrees=3, maxDepth=2, labelCol="indexed", seed=42)
>>> model = rf.fit(td)

# FEATURE IMPORTANCES
>>> model.featureImportances
SparseVector(1, {0: 1.0}) 

答案 1 :(得分:5)

我不得不让你失望,但是在MLFib实现的RandomForest中的特征重要性没有被计算出来,所以除了通过自己实现计算之外你无法从任何地方获取它们。

以下是如何找到它的:

您在https://github.com/apache/spark/blob/branch-1.3/python/pyspark/mllib/tree.py

调用函数RandomForest.trainClassifier deinfed

它需要callMLlibFunc("trainRandomForestModel", ...),这是对Scala函数RandomForest.trainClassifierRandomForest.trainRegressor(取决于算法)的调用,它会返回RandomForestModel个对象。

此对象在https://github.com/apache/spark/blob/branch-1.3/mllib/src/main/scala/org/apache/spark/mllib/tree/model/treeEnsembleModels.scala中描述,并且正在扩展在同一源文件中定义的TreeEnsembleModel。不幸的是,这个类只存储算法(回归或分类),树本身,树的相对权重和组合策略(总和,平均,投票)。遗憾的是,它不存储要素重要性,甚至不计算它们(有关计算算法,请参阅https://github.com/apache/spark/blob/branch-1.3/mllib/src/main/scala/org/apache/spark/mllib/tree/RandomForest.scala

答案 2 :(得分:2)

功能重要性现在在Spark 1.5中实现。 See resolved JIRA issue.您可以通过以下方式获取功能导入向量:

val importances: Vector = model.featureImportances

答案 3 :(得分:1)

我相信这现在有效。你可以打电话:

from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier()
model = rf.fit(data)
print model.featureImportances

在RandomForestClassifier上运行拟合会返回一个RandomForestClassificationModel,它具有所需的featureImportances计算结果。我希望这有助于:)

答案 4 :(得分:1)

现在似乎在 Spark ML 中有一种直接的方法可以做到这一点。见https://kb.databricks.com/machine-learning/extract-feature-info.html

这是关键代码:

pipeline = Pipeline(stages=[indexer, assembler, decision_tree)
DTmodel = pipeline.fit(train)
va = dtModel.stages[-2]
tree = DTmodel.stages[-1]

display(tree) #visualize the decision tree model
print(tree.toDebugString) #print the nodes of the decision tree model

list(zip(va.getInputCols(), tree.featureImportances))

答案 5 :(得分:0)

如上所述,未实现功能重要性。

这可能对您有用:https://github.com/wxhC3SC6OPm8M1HXboMy/spark-ml/blob/master/FeatureSelection.scala