我正在尝试使用 Python 在 Spark 中创建一个“功能”列,以便机器学习库使用。但是,我在生成“特征”列的 VectorAssembler 中遇到了包括数值和分类变量在内的问题。
cat_cols = ["cat_1", "cat_2", "cat_3"]
num_cols = ["num_1", "num_2", "num_3", "num_4"]
indexers = [StringIndexer(inputCol = c, outputCol="{0}_indexed".format(c)) for c in cat_cols]
encoders = [StringIndexer(inputCol = indexer.getOutputCol(), outputCol = "{0}_encoded".format(indexer.getOutputCol()))
for indexer in indexers]
assembler = VectorAssembler(inputCols = [encoder.getOutputCol() for encoder in encoders], outputCol = "features")
pipeline = Pipeline(stages = indexers + encoders + [assembler])
df = pipeline.fit(df).transform(df)
到目前为止构建的管道可以创建一个仅包含分类变量的“特征”列,但我不知道如何扩展它以使“特征”列同时包含分类变量和数值变量。
请注意,我使用的是 Spark 2.3 和 Python 3。
我找到了一种方法,但我不确定这是否是实现我想要的最有效方法。
cat_cols = ["cat_1", "cat_2", "cat_3"]
num_cols = ["num_1", "num_2", "num_3", "num_4"]
indexers = [StringIndexer(inputCol = c, outputCol="{0}_indexed".format(c)) for c in cat_cols]
encoders = [StringIndexer(inputCol = indexer.getOutputCol(), outputCol = "{0}_encoded".format(indexer.getOutputCol()))
for indexer in indexers]
assemblerCat = VectorAssembler(inputCols = [encoder.getOutputCol() for encoder in encoders], outputCol = "cat")
pipelineCat = Pipeline(stages = indexers + encoders + [assemblerCat])
df = pipelineCat.fit(df).transform(df)
assemblerNum = VectorAssembler(inputCols = num_cols, outputCol = "num")
pipelineNum = Pipeline(stages = [assemblerNum])
df = pipelineNum.fit(df).transform(df)
assembler = VectorAssembler(inputCols = ["cat", "num"], outputCol = "features")
pipeline = Pipeline(stages = [assembler])
df = pipeline.fit(df).transform(df)
本质上,我正在为分类变量创建一个管道,为数字变量创建一个管道,然后我将它们合并以创建一个包含两者的单个“特征”列。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句