2017-08-15 18 views
1

私は、PySparkのカテゴリ機能を持つデータセットを使用しています。パイプラインをフィッティングした後、フィーチャー列のメタデータを使用してエンコードされたフィーチャーを抽出します。パイプラインにノーマライザを含めると、私のカテゴリ機能のメタデータが失われます。以下の例を参照してください。spark-ml normalizerがメタデータを失う

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

それが最初の場所でワンホット符号化データにNormalizerを使用するようにあまり意味がありません。 Sparkでは、OHEは2つのタイプのモデルに役立ちます。

  • 多項式Naive Bayes。
  • リニアモデル。

正規化では、フィーチャは完全に役に立たなくなります(多項式モデルは、バイナリフィーチャのみを完全に利用できます)。後者の場合、不可能に近いモデルの解釈を行います。

あなたは上記の正規化されたデータはもうバイナリ機能として解釈することはできません無視したとしても、そのためのメタデータを破棄することは、有効な行動のようです。

Why does StandardScaler not attach metadata to the output column?

関連する問題