【问题标题】:How to combine several columns into one vector-valued column in Spark? [duplicate]如何在 Spark 中将多列合并为一个向量值列? [复制]
【发布时间】:2017-06-14 15:08:19
【问题描述】:

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

但是,看起来应该只有一列包含特征(一列包含向量作为值)。

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

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

添加

我也试过这个:

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.'

【问题讨论】:

  • 我认为你搞错了。看看here
  • 在这里查看我对 VectorAssembler 的回答:stackoverflow.com/questions/43355341/spark-pipeline-error/…
  • 我不确定这是@TDrabas 的问题
  • VectorAssembler 的问题正是我所指出的:一个(或多个)元素或 RDD 行是字符串。您可以在此之前使用 OneHotEncoder 或以某种方式将字符串编码为数字。如果你想建立一个有监督的模型,比如逻辑回归,我建议把它放到 LabeledPoint 中。

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


【解决方案1】:

使用VectorAssembler 是要走的路。在 linalg.Vector 中,您只能有 Double 值。您需要在您的Pipeline 中添加StringIndexer + OneHotEncoder。然后你可以在新生成的列上使用汇编器

例如(来自链接)

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()

附:请看Pipelines

【讨论】:

  • 从您的回答中我学到了一些有用的东西(基本上是如何在 Spark 中进行热编码),但它没有为我的问题提供答案。我没有分类特征。我拥有的特征是数字的(尽管它们被表示为字符串)。
  • 也许我误解了这个问题。但是,如果您的特征是数字的并且只有 String 类型,您不能在将它们传递给 VectorAssembler 之前将它们转换为 Double 吗?您能否在问题中添加一些示例数据?
  • 你是对的。这就是 VectorAssembler 不起作用的原因。首先,我不知道这些值是字符串。其次,我不知道它们必须是 double 还是 float。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 2018-07-28
  • 2016-01-10
相关资源
最近更新 更多