spark-ml normalizer丢失了元数据

时间:2017-08-15 09:23:43

标签: apache-spark pyspark metadata apache-spark-ml normalize

我在PySpark中使用具有分类特征的数据集,这些数据集已编制索引并进行单热编码。在拟合管道之后,我使用features列的元数据提取编码的特征。当我在管道中包含规范化器时,我丢失了我的分类功能的元数据。见下面的例子:

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 个答案:

答案 0 :(得分:1)

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

  • Multinomial Naive Bayes。
  • 线性模型。

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

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

Why does StandardScaler not attach metadata to the output column?

相关