нормализатор spark-ml теряет метаданные

Я использую набор данных с категориальными функциями в PySpark, которые индексируются и кодируются одним горячим способом. После установки конвейера я извлекаю закодированные функции, используя метаданные столбца функций. Когда я включаю нормализатор в свой конвейер, я теряю метаданные своих категориальных функций. См. пример ниже:

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}}

Это нормальное поведение? Как я могу включить нормализатор без потери этих метаданных?


person Cheryl    schedule 15.08.2017    source источник


Ответы (1)


На мой взгляд, нет особого смысла использовать Normalizer в первую очередь для данных, закодированных в горячем режиме. В Spark OHE полезен для моделей двух типов:

  • Полиномиальный наивный байесовский метод.
  • Линейные модели.

В первом случае нормализация сделает признаки совершенно бесполезными (полиномиальная модель может полностью использовать только бинарные признаки). Во втором случае это сделает интерпретацию модели практически невозможной.

Даже если вы игнорируете приведенные выше нормализованные данные, они больше не могут интерпретироваться как бинарные функции, поэтому отказ от метаданных кажется допустимым поведением.

Связано с Почему StandardScaler не прикрепляет метаданные к выходному столбцу?

person zero323    schedule 15.08.2017