我是Spark的新手,我正在尝试使用Spark ML库。我来自Scikit-learn,我觉得有点迷失方向。
这是我的DataFrame:
+------------+------------+---------+--------+---------+
|DOLocationID|PULocationID|DayOfWeek|TimeSlot|Frequency|
+------------+------------+---------+--------+---------+
| 15| 81| 1| "TS4"| 402|
| 266| 67| 4| "TS4"| 813|
+------------+------------+---------+--------+---------+
我想根据其他功能预测DOLocationID。
DOLocationID,PULocationID,DayOfWeek和TimeSlot是分类数据,因此我使用StringIndexer()和OneHotEncoder()来获取以下内容:
+-----------------+-----------------+---------------+--------------+---------+
| DOLocationVector| PULocationVector|DayOfWeekVector|TimeSlotVector|Frequency|
+-----------------+-----------------+---------------+--------------+---------+
| (289,[98],[1.0])|(289,[273],[1.0])| (6,[0],[1.0])| (5,[0],[1.0])| 402|
|(289,[260],[1.0])|(289,[138],[1.0])| (6,[5],[1.0])| (5,[0],[1.0])| 813|
+-----------------+-----------------+---------------+--------------+---------+
此时我使用了VectorAssembler来获取我的特征向量:
assembler = VectorAssembler(inputCols=["PULocationVector", "DayOfWeekVector", "TimeSlotVector", "Frequency"],
outputCol="features")
output = assembler.transform(df)
df = output.select("DOLocationVector", "features")
这就是结果:
+-----------------+--------------------+
| DOLocationVector| features|
+-----------------+--------------------+
| (289,[98],[1.0])|(301,[273,289,295...|
|(289,[260],[1.0])|(301,[138,294,295...|
+-----------------+--------------------+
现在我已经准备好训练模型了:
train_data, test_data = df.randomSplit([.8,.2],seed=1234)
lr = LogisticRegression(labelCol="DOLocationVector", maxIter=10, regParam=0.3, elasticNetParam=0.8)
logisticModel = lr.fit(train_data)
但是发布了以下错误:
Py4JJavaError:调用o1436.fit时发生错误。 : java.lang.IllegalArgumentException:要求失败:列 DOLocationVector必须是NumericType类型,但实际上是类型 org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7。 [...]
我试图在文档或网络上找到一些东西,但可能我错了。所以问题是:
我可以预测稀疏矢量吗?如果是的话,我错在哪里?我错过了什么?如果没有,我有其他选择吗?
提前谢谢。