如何将多个列组合成Spark中的一个向量值列?

时间:2017-06-14 15:08:20

标签: apache-spark pyspark apache-spark-mllib

我刚开始使用Spark的MLlib。我想训练一个简单的模型(例如逻辑回归)。我的期望是我需要"告诉"在模型中使用哪个列作为目标以及将哪些列视为要素。

但是,看起来应该只有一个包含要素的列(包含向量作为值的列)。

所以,我的问题是:如何构建这样的向量值列?我尝试了以下(但它不起作用):

df = df.withColumn('feat_vec', [df['_c0'], df['_c1'], df['_c1'], df['_c3'], df['_c4']])

ADDED

我也试过这个:

from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(inputCols=['_c0', '_c1', '_c2', '_c3', '_c4'], outputCol='feat_vec')
df = assembler.transform(df)

结果我收到以下错误消息:

pyspark.sql.utils.IllegalArgumentException: u'Data type StringType is not supported.'

1 个答案:

答案 0 :(得分:3)

使用VectorAssembler是可行的方法。在linalg.Vector中,您只能拥有Double个值。您需要在Pipeline中添加StringIndexer + OneHotEncoder。然后,您可以在新生成的列

上使用汇编程序

E.G。 (来自链接)

from pyspark.ml.feature import OneHotEncoder, StringIndexer

df = spark.createDataFrame([
  (0, "a"),
  (1, "b"),
  (2, "c"),
  (3, "a"),
  (4, "a"),
  (5, "c")
], ["id", "category"])

stringIndexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
model = stringIndexer.fit(df)
indexed = model.transform(df)

encoder = OneHotEncoder(inputCol="categoryIndex", outputCol="categoryVec")
encoded = encoder.transform(indexed)
encoded.show()

P.S。请查看Pipelines