16

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

如何从RandomForestModelPySpark 中的回归器或分类器中提取特征重要性?

这是文档中提供的示例代码,可帮助我们入门;但是,其中没有提及特征重要性。

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_可用的属性——我在哪里可以找到这个?

4

5 回答 5

16

更新版本 > 2.0.0

从 2.0.0 版本开始,您可以在此处看到,FeatureImportances 可用于随机森林。

事实上,你可以在这里找到:

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

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

此 API 与原始 MLlib 集成 API 之间的主要区别是:

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

如果你想拥有特征重要性值,你必须使用ml包,而不是mllib,并使用数据框。

下面是一个示例,您可以在此处找到:

# 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}) 
于 2017-06-24T15:48:24.750 回答
6

我不得不让你失望,但是 RandomForest 的 MLlib 实现中的特征重要性是没有计算的,所以你不能从任何地方得到它们,除非你自己实现它们的计算。

以下是如何找到它:

你在这里调用一个RandomForest.trainClassifierdeinfed函数https://github.com/apache/spark/blob/branch-1.3/python/pyspark/mllib/tree.py

它调用 for 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用于计算算法)

于 2015-03-13T10:55:36.017 回答
3

特征重要性现在在 Spark 1.5 中实现。请参阅已解决的 JIRA 问题。您可以通过以下方式获得特征重要性向量:

val importances: Vector = model.featureImportances
于 2015-11-20T03:28:48.367 回答
2

现在看来,在 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))
于 2021-04-06T03:21:15.767 回答
2

我相信这现在有效。您可以致电:

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

在 RandomForestClassifier 上运行 fit 会返回一个 RandomForestClassificationModel,该模型已计算出所需的 featureImportances。我希望这个对你有用 : )

于 2017-01-20T16:34:20.373 回答