在PySpark中有没有办法执行特征选择,但是保留或获取回原始特征索引/描述的映射?
例如:
CountVectorizer
(col ="功能")。 ChiSqSelector
选择前1000个功能(col =" selectedFeatures)。如何获取与前1000个功能相对应的原始要素字符串(或者甚至只是原始&#34中的这些所选要素的相应索引;以及第2步中的#34; col)?
答案 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
并将selectedFeatures
与vocabulary
进行比较:
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}}