私は、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}}
これは正常な動作ですか?このメタデータを失うことなくノーマライザを含めるにはどうすればよいですか?私の意見で