PySpark功能选择和可解释性

时间:2017-12-14 23:22:15

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

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

例如:

  1. 我有一个原始要素字符串的StringArray列(col = " rawFeatures&#34)。
  2. 我已使用将它们转换为数字计数 CountVectorizer(col ="功能")。
  3. 然后我运行ChiSqSelector 选择前1000个功能(col =" selectedFeatures)。
  4. 如何获取与前1000个功能相对应的原始要素字符串(或者甚至只是原始&#34中的这些所选要素的相应索引;以及第2步中的#34; col)?

1 个答案:

答案 0 :(得分:5)

可以使用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}}