我刚开始使用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.'
答案 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