spark-ml 规范化器丢失元数据

Posted

技术标签:

【中文标题】spark-ml 规范化器丢失元数据【英文标题】:spark-ml normalizer loses metadata 【发布时间】:2017-08-15 09:23:43 【问题描述】:

我在 PySpark 中使用了一个具有分类特征的数据集,这些特征被索引和 one-hot 编码。拟合管道后,我使用特征列的元数据提取编码特征。当我在管道中包含规范器时,我会丢失分类特征的元数据。请参见下面的示例:

train.show()
+-----+---+----+----+
|admit|gre| gpa|rank|
+-----+---+----+----+
|  0.0|380|3.61|   3|
|  1.0|660|3.67|   3|
|  1.0|800| 4.0|   1|
|  1.0|640|3.19|   4|
|  0.0|520|2.93|   4|
+-----+---+----+----+

from pyspark.ml.feature import StringIndexer, OneHotEncoder, VectorAssembler, Normalizer
#indexer for categorical features
rank_indexer = StringIndexer(inputCol = 'rank', outputCol = 'rank_ind', handleInvalid="skip")
#encoder for categorical features
rank_encoder = OneHotEncoder(inputCol = 'rank_ind', outputCol = 'rank_enc')
# assembler
assembler = VectorAssembler(inputCols=['gre','gpa','rank_enc'], outputCol="featuresVect")
# Create the normalizer
normalizer = Normalizer(inputCol="featuresVect", outputCol="features", p=1.0)

stages = [rank_indexer] + [rank_encoder] + [assembler] + [normalizer]

from pyspark.ml import Pipeline
final_pipeline = Pipeline(
    stages = stages
)

pipelineModel = final_pipeline.fit(train)
data = pipelineModel.transform(train)

data.schema['features'].metadata

## empty dictionary

## excluding the normalizer results in this metadata:
u'ml_attr': u'attrs': u'binary': [u'idx': 2, u'name': u'rank_enc_2',
    u'idx': 3, u'name': u'rank_enc_3',
    u'idx': 4, u'name': u'rank_enc_4'],
   u'numeric': [u'idx': 0, u'name': u'gre', u'idx': 1, u'name': u'gpa'],
  u'num_attrs': 5

这是正常行为吗?如何在不丢失此元数据的情况下包含规范化器?

【问题讨论】:

【参考方案1】:

在我看来,首先对 One-hot 编码数据使用 Normalizer 没有多大意义。在 Spark 中,OHE 可用于两种类型的模型:

多项朴素贝叶斯。 线性模型。

在第一种情况下,归一化会使特征完全无用(多项模型只能充分利用二元特征)。在第二种情况下,模型的解释几乎是不可能的。

即使您忽略上述规范化数据也不能再被解释为二进制特征,因此丢弃元数据似乎是一种有效的行为。

与Why does StandardScaler not attach metadata to the output column?相关

【讨论】:

以上是关于spark-ml 规范化器丢失元数据的主要内容,如果未能解决你的问题,请参考以下文章

自制方法装饰器擦除所有元数据,我该如何解决?

Pandas 列上的元数据丢失

vbscript 以安全的方式从页面获取属性或元数据(因此,如果元数据不存在,则不会丢失)。在这个例子中,我们是替换

一则关于控制文件全部丢失后如何重新编目RMAN元数据的简单实验

官方标准- 交通运输领域元数据标准规范

与 UIActivitiViewController 共享图像(UIImage)的 PHAsset 丢失元数据(Exif 等)