【发布时间】:2019-06-17 20:52:17
【问题描述】:
我正在尝试使用列名来绘制随机森林分类器的特征重要性。我正在使用 Spark 2.3.2 和 Pyspark。
输入 X 是句子,我使用 tfidf (HashingTF + IDF) + StringIndexer 来生成特征向量。
我已将所有阶段都包含在管道中。
regexTokenizer = RegexTokenizer(gaps=False, \
inputCol= raw_data_col, \
outputCol= "words", \
pattern="[a-zA-Z_]+", \
toLowercase=True, \
minTokenLength=minimum_token_size)
hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=number_of_feature)
idf = IDF(inputCol="rawFeatures", outputCol= feature_vec_col)
indexer = StringIndexer(inputCol= label_col_name, outputCol= label_vec_name)
converter = IndexToString(inputCol='prediction', outputCol="original_label", labels=indexer.fit(df).labels)
feature_pipeline = Pipeline(stages=[regexTokenizer, hashingTF, idf, indexer])
estimator = RandomForestClassifier(labelCol=label_col, featuresCol=features_col, numTrees=100)
pipeline = Pipeline(stages=[feature_pipeline, estimator, converter])
model = pipeline.fit(df)
将特征重要性生成为
rdc = model.stages[-2]
print (rdc.featureImportances)
到目前为止一切顺利,但是当我尝试使用this 和this 中的示例将特征重要性映射到特征列时,问题如下
attrs = sorted((attr["idx"], attr["name"]) for attr in (chain(*df_pred.schema["featurescol"].metadata["ml_attr"]["attrs"].values())))
[(name, rdc.featureImportances[idx])
for idx, name in attrs
if dtModel_1.featureImportances[idx]]
我在 ml_attr 上得到关键错误
KeyError: 'ml_attr'
打印的字典,
print (df_pred.schema["featurescol"].metadata)
它是空的{}
对我做错了什么有什么想法吗?如何获取列名称的特征重要性。
谢谢
【问题讨论】:
标签: python apache-spark pyspark random-forest