怎么将随机森林的特征重要性和特征名对应上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么将随机森林的特征重要性和特征名对应上相关的知识,希望对你有一定的参考价值。

参考技术A 你用的是python吗?还是其他软件?
以python中的算法为例(假设训练集是个3X3的矩阵),导入的训练集中特征的排序假如是A,B,C(矩阵第一列为A,第二为B,第三为C),假设结果产生的重要性给出的数据为[0.2 0.3 0.5],那么对应的A重要性为0.2,B:0.3, C:0.5
参考技术B 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。 数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。

带有列名的pyspark随机森林分类器特征重要性

【中文标题】带有列名的pyspark随机森林分类器特征重要性【英文标题】:pyspark random forest classifier feature importance with column names 【发布时间】: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)

它是空的

对我做错了什么有什么想法吗?如何获取列名称的特征重要性。

谢谢

【问题讨论】:

【参考方案1】:

我无法解决空元数据问题,但要使用列名映射随机森林分类器的特征重要性 - 我通过以下代码得到它:

feature_importances = model.stages[-2].featureImportances
feature_imp_array = feature_importances.toArray()

feat_imp_list = []
for feature, importance in zip(tf_model.vocabulary, feature_imp_array):
    feat_imp_list.append((feature, importance))

feat_imp_list = sorted(feat_imp_list, key=(lambda x: x[1]), reverse=True)

top_features = feat_imp_list[0:50]

【讨论】:

以上是关于怎么将随机森林的特征重要性和特征名对应上的主要内容,如果未能解决你的问题,请参考以下文章

利用随机森林对特征重要性进行评估

随机森林如何评估特征重要性

特征筛选(随机森林)

随机森林进行特征重要性度量的详细说明

R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异)

带有列名的pyspark随机森林分类器特征重要性