首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列变换后的Pyspark随机森林特征重要性映射

列变换后的Pyspark随机森林特征重要性映射
EN

Stack Overflow用户
提问于 2018-06-19 22:08:47
回答 3查看 7.9K关注 0票数 4

我试图用列名绘制某些基于树的模型的特性重要性。我用的是火花呢。

因为我也有文本分类变量和数字变量,所以我不得不使用管道方法,这种方法类似于-

  1. 使用字符串索引器对字符串列进行索引
  2. 对所有列使用一个热编码器
  3. 使用向量汇编程序创建包含特征向量的特征列。 步骤1、2、3-的一些来自文档的示例代码 从OneHotEncoderEstimator(inputCol=categoricalCol pyspark.ml OneHotEncoderEstimator、StringIndexer、VectorAssembler categoricalColumns =“工薪阶层”、“教育”、"marital_status“、”职业“、”关系“、”种族“、”性别“、"native_country”阶段= []在管道中的categoricalColumns中的categoricalCol:#分类索引与StringIndexer stringIndexer =StringIndexer= StringIndexer(inputCol=categoricalCol,outputCol=categoricalCol + "Index") # Use OneHotEncoder将分类变量转换为二进制StringIndexer#编码器=“索引”,outputCol=categoricalCol + "classVec")编码器= OneHotEncoderEstimator(inputCols= stringIndexer.getOutputCol(),outputCols=categoricalCol + "classVec") # Add stages。这些不是在这里运行,而是将在稍后全部运行。stages += stringIndexer,编码器numericCols = "age","fnlwgt","education_num","capital_gain","capital_loss","hours_per_week“assemblerInputs =c+ "classVec”,用于categoricalColumns + numericCols汇编程序= VectorAssembler(inputCols=assemblerInputs,outputCol="features") stages +=汇编程序#创建管道。管道=管道(stages=stages)#运行特性转换。#- fit()根据需要计算特性统计数据。#- transform()实际上转换了特性。pipelineModel =pipeline.fit(数据集)数据集=pipelineModel.transform(数据集)
  4. 最后对模型进行训练。 经过训练和评估,我可以使用"model.featureImportances“来获得特征排名,但是我没有得到特征/列名,而只是特征号,如下所示- 打印(38895,38708,38714,38719,38720,38737,38870,38894,0.0742343395738,0.169404823667,0.100485791055,0.0105823115814,0.0134236162982,0.194124862158,0.437744255667) dtModel_1.featureImportances

如何将其映射回初始列名和值?这样我才能策划?**

EN

回答 3

Stack Overflow用户

发布于 2018-06-19 23:43:29

在这里显示提取元数据为user6910411

代码语言:javascript
运行
复制
attrs = sorted(
    (attr["idx"], attr["name"])
    for attr in (
        chain(*dataset.schema["features"].metadata["ml_attr"]["attrs"].values())
    )
) 

并结合特征的重要性:

代码语言:javascript
运行
复制
[
    (name, dtModel_1.featureImportances[idx])
    for idx, name in attrs
    if dtModel_1.featureImportances[idx]
]
票数 13
EN

Stack Overflow用户

发布于 2018-06-20 21:26:08

转换后的数据集元数据具有所需的attributes.Here是一种简单的方法-

  1. 创建熊猫数据(通常特性列表不会很大,因此在存储熊猫DF时没有内存问题) pd.DataFrame(dataset.schema"features".metadata"ml_attr""binary"+dataset.schema"features".metadata"ml_attr""numeric").sort_values("idx") = pandasDF
  2. 然后创建一个广播字典来映射。广播在分布式环境中是必要的。 feature_dict = dict(zip(pandasDF"idx",pandasDF“name”) feature_dict_broad = sc.broadcast(feature_dict)
票数 3
EN

Stack Overflow用户

发布于 2020-09-10 16:14:05

在创建汇编程序时,使用了一个变量列表(assemblerInputs)。顺序保留在“特性”变量中。所以,只需做一个熊猫DataFrame:

代码语言:javascript
运行
复制
features_imp_pd = (
     pd.DataFrame(
       dtModel_1.featureImportances.toArray(), 
       index=assemblerInputs, 
       columns=['importance'])
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50937591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档