我正在尝试查找我的决策树的特征信息。更具体地说,如果 183 出现在我的树可视化中,我希望能够分辨出它是什么。我尝试过 dtModel.getInputCol() 但收到以下错误。
AttributeError: 'DecisionTreeClassificationModel' object has no attribute 'getInputCol'
这是我当前的代码:
from pyspark.ml.classification import DecisionTreeClassifier
# Create initial Decision Tree Model
dt = DecisionTreeClassifier(labelCol="label", featuresCol="features", maxDepth=3)
# Train model with Training Data
dtModel = dt.fit(trainingData)
display(dtModel)
如果您可以提供帮助或需要更多信息,请告诉我。谢谢你。
请参阅取自 Spark doc 的示例(我尝试使名称与您的代码一致,尤其是
featuresCol="features"
)。
我假设你有一些像这样的代码(在你在问题中发布的代码之前):
featureIndexer = VectorIndexer(inputCol="inputFeatures", outputCol="features", maxCategories=4).fit(data)
在此步骤之后,您将
"features"
作为索引功能,然后将其提供给 DecisionTreeClassifier
(如您发布的代码):
# Train a DecisionTree model.
dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="features")
你要找的是上面的
inputFeatures
,这是被索引之前的原始特征。如果您想打印它,只需执行以下操作:
sc.parallelize(inputFeatures, 1).saveAsTextFile("absolute_path")
使用管道来调用其
.transform()
方法。
通过您的评论,您通过
trainingData
为 DecisionTreeClassifier()
做好了准备。嵌入 VectorAssembler()
中,通过其 Pipeline
方法获得您想要的好东西。.transform()
使用
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml import Pipeline
vec_assembler = VectorAssembler(inputCols = ["c1", "c2"], outputCol = 'features')
dtModel = DecisionTreeClassifier(labelCol = 'label', maxDepth = 3)
pipeline = Pipeline(stages = [vec_assembler, dtModel])
pipeline_model = pipeline.fit(trainingData)
trainingData_transformed = pipeline_model.transform(trainingData) # <-- Abracadabra!
查看其新列。此外,还有元数据。挖掘以获取列索引的字典。尝试一下
display(trainingData_transformed)
看到类似的东西
feature_map = trainingData_transformed.schema['features'].metadata['ml_attr']['attrs']
feature_map
如果您还在
{'numeric': [{'idx': 0, 'name': 'c1'}, {'idx': 1, 'name': 'c2'}]}
中添加了
feature_map
,则 StringIndexer
字典将具有更多结构,但您可以从这里获取它。您的情况中的 pipeline
应具有类似于 feature_map
的条目。