apache-spark - PySpark 特征选择和可解释性

标签 apache-spark pyspark apache-spark-sql apache-spark-mllib apache-spark-ml

PySpark 有没有办法执行特征选择,但保留或获得映射回原始特征索引/描述?

例如:

  • 我有一个原始特征字符串的 StringArray 列(col =
    “原始特征”)。
  • 我已经使用它们将它们转换为数字计数CountVectorizer (col =“功能”)。
  • 然后我运行了 ChiSqSelector选择前 1000 个特征 (col = "selectedFeatures)。

  • 如何获得与前 1000 个特征相对应的原始特征字符串(甚至只是步骤 2 中原始“特征”列中这些选定特征的相应索引)?

    最佳答案

    可以使用 fitted 追溯此信息。 Transformers .与 Pipeline像这个:

    from pyspark.ml.feature import *
    from pyspark.ml import Pipeline
    import numpy as np
    
    data = spark.createDataFrame(
        [(1, ["spark", "foo", "bar"]), (0, ["kafka", "bar", "foo"])],
        ("label", "rawFeatures"))
    
    model = Pipeline(stages = [
        CountVectorizer(inputCol="rawFeatures", outputCol="features"),
        ChiSqSelector(outputCol="selectedFeatures", numTopFeatures=2)
    ]).fit(data)
    

    您可以提取Transformers :

    vectorizer, chisq = model.stages
    

    并比较 selectedFeaturesvocabulary :

    np.array(vectorizer.vocabulary)[chisq.selectedFeatures]
    

    array(['spark', 'kafka'], dtype='<U5')
    

    不幸的是这个组合Transformers不保留标签元数据:

    features_meta, selected_features_meta = (f.metadata for f in model
        .transform(data).select("features", "selectedFeatures")
        .schema
        .fields)
    
    features_meta
    

    {}
    

    selected_features_meta
    

    {'ml_attr': {'attrs': {'nominal': [{'idx': 0}, {'idx': 1}]}, 'num_attrs': 2}}
    

    关于apache-spark - PySpark 特征选择和可解释性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47823613/

    相关文章:

    java - 如何将特定代码段从 Spark 1.6.2 转换为 Spark 2.2.0?

    apache-spark - Spark 数据帧分组到列表中

    python - 在个人计算机上加载 PipelineModel 时出现 ValueError

    scala - Spark 对分隔数据进行排序

    apache-spark - 如何让 Apache Zeppelin 笔记本在第一份工作中运行得更快

    apache-spark - 从 JavaRDD<Row> 创建的 Spark DataFrame 将所有列数据复制到第一列

    apache-spark - 为什么 7 个分区由 Spark 确定?

    python - 创建 step spark python, amazon hadoop

    python - PySpark DecisionTree 模型的精度和召回率与手动结果存在差异

    dataframe - 根据基于另一个数据框的值在 pyspark 数据框中创建一列