J'essaie d'extraire les caractéristiques d'un objet forestier aléatoire que j'ai formé à l'aide de PySpark. Cependant, je ne vois pas d'exemple de cette opération dans la documentation, ni d'une méthode de RandomForestModel.
Comment puis-je extraire les importances de caractéristiques d'un régresseur ou d'un classifieur RandomForestModel
dans PySpark?
Voici l'exemple de code fourni dans la documentation pour nous aider à démarrer; cependant, il n’y est fait aucune mention de l’importance des fonctionnalités.
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)
Je ne vois pas d'attribut model.__featureImportances_
disponible - où puis-je le trouver?
UPDATE pour la version> 2.0.0
A partir de la version 2.0.0, comme vous pouvez le constater ici , FeatureImportances est disponible pour Random Forest.
En fait, vous pouvez trouver ici que:
L'API DataFrame prend en charge deux principaux algorithmes d'ensembles d'arbres: les forêts aléatoires et les arbres à gradient (GBT). Les deux utilisent des arbres de décision spark.ml comme modèles de base.
Les utilisateurs peuvent trouver plus d'informations sur les algorithmes d'ensemble dans le guide MLlib Ensemble. Dans cette section, nous présentons l'API DataFrame pour les ensembles.
Les principales différences entre cette API et l'API originale des ensembles MLlib sont les suivantes:
- support pour les DataFrames et les Pipelines ML
- séparation de la classification par rapport à la régression
- utilisation des métadonnées DataFrame pour distinguer les caractéristiques continues et catégorielles
- plus de fonctionnalités pour les forêts aléatoires: estimations de l'importance des caractéristiques , ainsi que la probabilité prédite de chaque classe (probabilités conditionnelles de classe) pour la classification.
Si vous souhaitez avoir des valeurs Importance de la fonctionnalité, vous devez utiliser le package ml, et non mllib, et utiliser des images de données.
Vous trouverez ci-dessous un exemple où vous pouvez trouver 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})
Je dois vous décevoir, mais l'importance des fonctionnalités dans l'implémentation MLlib de RandomForest n'est tout simplement pas calculée, vous ne pouvez donc pas les obtenir de n'importe où, sauf en implémentant leur calcul par vous-même.
Voici comment le savoir:
Vous appelez une fonction RandomForest.trainClassifier
définie ici https://github.com/Apache/spark/blob/branch-1.3/python/pyspark/mllib/tree.py
Il appelle callMLlibFunc("trainRandomForestModel", ...)
, qui est un appel à la fonction Scala RandomForest.trainClassifier
ou RandomForest.trainRegressor
(selon l'algo), qui vous renvoie l'objet RandomForestModel
.
Cet objet est décrit dans https://github.com/Apache/spark/blob/branch-1.3/mllib/src/main/scala/org/Apache/spark/mllib/tree/model/treeEnsembleModels.scala et étend TreeEnsembleModel
défini dans le même fichier source. Et malheureusement, cette classe ne stocke que les algorithmes (régression ou classification), les arbres eux-mêmes, les poids relatifs des arbres et la stratégie combinée (somme, moyenne, vote). Il ne stocke malheureusement pas les importances des fonctionnalités et ne les calcule même pas (voir https://github.com/Apache/spark/blob/branch-1.3/mllib/src/main/scala/org/Apache/spark /mllib/tree/RandomForest.scala pour l’algorithme de calcul)
L'importance des fonctionnalités est désormais implémentée dans Spark 1.5. Voir le problème résolu JIRA. Vous pouvez obtenir un vecteur d'importantes fonctionnalités avec:
val importances: Vector = model.featureImportances
Je crois que cela fonctionne maintenant. Tu peux appeler:
from pyspark.ml.classification import RandomForestClassifier
rf = RandomForestClassifier()
model = rf.fit(data)
print model.featureImportances
Un ajustement en cours d'exécution sur un RandomForestClassifier renvoie un RandomForestClassificationModel qui a les caractéristiques souhaitées calculées. J'espère que ca aide : )
Comme indiqué, l’importance des fonctionnalités n’est pas implémentée.
Cela peut peut-être vous être utile: https://github.com/wxhC3SC6OPm8M1HXboMy/spark-ml/blob/master/FeatureSelection.scala