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_
属性が表示されません。これはどこにありますか?
バージョン> 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})
私はあなたを失望させなければなりませんが、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 計算アルゴリズム用)
機能の重要性は、Spark 1.5。 解決されたJIRAの問題を参照)に実装されています。 機能の重要性のベクターは、
val importances: Vector = model.featureImportances
私はこれが今うまくいくと信じています。あなたは呼び出すことができます:
from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier()
model = rf.fit(data)
print model.featureImportances
RandomForestClassifierでフィットを実行すると、目的のfeatureImportancesが計算されたRandomForestClassificationModelが返されます。これが役に立てば幸いです:)
前述のように、機能の重要性は実装されていません。
多分これはあなたのために役立つかもしれません: https://github.com/wxhC3SC6OPm8M1HXboMy/spark-ml/blob/master/FeatureSelection.scala