问题 PySpark和MLLib:随机森林特征重要性


我正在尝试提取我使用PySpark训练的随机森林对象的要素重要性。但是,我没有看到在文档中的任何地方执行此操作的示例,也不是RandomForestModel的方法。

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

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

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


13033
2018-03-10 19:01


起源

有没有人对这个问题有更新?现在是否有一个实现模型的PySpark实现.__ featureImportances_? - Pablo O
@PabloO我已经发布了更新的答案 - titiro89


答案:


更新版本> 2.0.0

从版本2.0.0开始,如您所见 这里,FeatureImportances可用于随机森林。

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

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

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

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

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

如果要获得要素重要性值,则必须使用 毫升 包裹,不是 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}) 

9
2018-06-24 15:48





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

以下是如何找到它:

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

它要求 callMLlibFunc("trainRandomForestModel", ...),这是对Scala函数的调用 RandomForest.trainClassifier 要么 RandomForest.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用于计算算法)


3
2018-03-13 10:55



如果您通过自己实现该功能来为MLlib做出贡献,那么您可以参加 sklearn 实现。github.com/scikit-learn/scikit-learn/blob/master/sklearn/... - 方法 feature_importances_ 收集底层树的特征重要性,并通过计算平均值将它们组合在一起。这里的代码 - github.com/scikit-learn/scikit-learn/blob/... - 方法 compute_feature_importances 用于估计单个树的特征重要性 - 0x0FFF
谢谢 - 是的,我们正在尝试类似的东西,但由于我们只有树调试输出(不是每个特征分割的杂质减少),我们只能粗略估计重要性。有没有办法让每个MLLib树分裂的杂质减少? - Bryan
您可以在这里做的唯一事情是通过将估计特征重要性的代码移植到Scala并将此补丁推送到MLlib代码来为MLlib做出贡献。如果没有这个,你的估计只会像你提到的那样粗略。 - 0x0FFF


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

val importances: Vector = model.featureImportances

2
2017-11-20 03:28



这实际上只在Scala方面,还没有在PySpark中。也许是下一个版本。 - j_houg
此外,它只存在于ML实现中而不存在于MLlib中 - Pop


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

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

在RandomForestClassifier上运行拟合会返回一个RandomForestClassificationModel,它具有所需的featureImportances计算值。我希望这个对你有用 : )


1
2018-01-20 16:34





如上所述,未实现特征重要性。

也许这对你有用: https://github.com/wxhC3SC6OPm8M1HXboMy/spark-ml/blob/master/FeatureSelection.scala


0
2018-03-13 16:27