web-dev-qa-db-ja.com

PySparkと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_属性が表示されません。これはどこにありますか?

14
Bryan

バージョン> 2.0.0の更新

バージョン2.0.0以降、ご覧のとおり here ですが、FeatureImportancesはランダムフォレストで使用できます。

実際、あなたは here を見つけることができます:

DataFrame APIは、ランダムフォレストとグラデーションブーストツリー(GBT)の2つの主要なツリーアンサンブルアルゴリズムをサポートしています。どちらもベースモデルとしてspark.mlデシジョンツリーを使用します。

アンサンブルアルゴリズムの詳細については、MLlib Ensembleガイドをご覧ください。このセクションでは、アンサンブル用のDataFrame APIを示します。

このAPIと元のMLlibアンサンブルAPIの主な違いは次のとおりです。

  • データフレームとMLパイプラインのサポート
  • 分類と回帰の分離
  • dataFrameメタデータを使用して、継続的機能とカテゴリー的機能を区別する
  • ランダムフォレストのより多くの機能:機能の重要性の推定値、および分類のための各クラスの予測確率(別名クラス条件付き確率)。

機能の重要度の値が必要な場合は、mllibではなくmlパッケージを使用して、データフレームを使用する必要があります。

以下は 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}) 
15
titiro89

私はあなたを失望させなければなりませんが、RandomForestのMLlib実装における機能の重要性は計算されていないので、自分で計算を実装することを除いて、どこからでもそれらを取得することはできません。

確認方法は次のとおりです。

ここで関数_RandomForest.trainClassifier_の定義を解除します https://github.com/Apache/spark/blob/branch-1.3/python/pyspark/mllib/tree.py

これはcallMLlibFunc("trainRandomForestModel", ...)を呼び出します。これはScala function _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 計算アルゴリズム用)

6
0x0FFF

機能の重要性は、Spark 1.5。 解決されたJIRAの問題を参照)に実装されています。 機能の重要性のベクターは、

val importances: Vector = model.featureImportances
2
j_houg

私はこれが今うまくいくと信じています。あなたは呼び出すことができます:

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

RandomForestClassifierでフィットを実行すると、目的のfeatureImportancesが計算されたRandomForestClassificationModelが返されます。これが役に立てば幸いです:)

2
nbertagnolli

前述のように、機能の重要性は実装されていません。

多分これはあなたのために役立つかもしれません: https://github.com/wxhC3SC6OPm8M1HXboMy/spark-ml/blob/master/FeatureSelection.scala

0
JoseM LM