无法训练pySpark SVM,标记点问题

时间:2016-11-01 17:12:06

标签: python machine-learning pyspark apache-spark-mllib training-data

我正在尝试将火花Dataframe转换为标记点。 Dataframe名为DF,如下所示:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+
|step1|step2|step3|step4|step5|step6|step7|step8|step9|step10|class|
+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+
|   14|   14|    0|   14|   14|    4|   11|   10|    0|     7|    1|
|   11|   10|   14|    0|   14|   18|   18|   14|    7|     7|    1|
|   14|   14|   14|   14|   14|   14|    7|    0|    7|     0|    1|
|   14|   14|   14|   14|    7|    7|   14|   14|    0|    11|    1|
|   14|   14|   14|   14|   14|   14|   14|    7|   14|     7|    1|
|   14|   14|   14|   14|   14|   14|   14|    0|    7|     7|    1|
|   14|   14|   14|   14|   14|   14|   14|    7|   14|     7|    1|
|   17|   14|    0|    7|    0|    0|   14|    7|    0|     7|    1|
|   14|   14|   14|    7|    7|   14|    7|   14|   14|     7|    1|
|   14|   14|   14|   14|   14|   14|   14|    7|    7|     7|    1|
|    7|   14|   14|   14|   14|    0|   14|    7|    0|    14|    1|
|   14|   14|   14|   14|   14|    0|   14|    7|    7|     7|    1|

根据文档,我要做的是:

(training, test) = DF.randomSplit([0.8,0.2])
print training
def parsePoint(line):
    values = [float(x) for x in line.split(' ')]
    return LabeledPoint(values[0], values[:1])

trainLabeled = training.rdd.map(parsePoint)
model = SVMWithSGD.train(trainLabeled, iterations=100)

但我收到错误:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.runJob.

Spark版本2.0.1

1 个答案:

答案 0 :(得分:1)

我无法确定没有查看您的数据,但SVMWithSGD的常见问题来自标签。

您需要使用LabeledPoint(正如您所做的那样)并确保第一个参数为0.0或1.0。该错误可能来自x[-1]是另一个值(不是0也不是1)。

你能检查一下吗?

希望它有所帮助, pltrdy

编辑(查看数据后):

下摆。让我们回到基础:SVM(粗略地)“学习如何在两个类中分割数据”(这不是很正式,但我们现在就把它拿走)。话虽如此,您的数据集必须是:X形状n x D矩阵(n行数,D个数量)和y矩阵n x 1包含数据标签。标签是二进制的,通常表示为{0, 1}(或{-1, 1},这对数学来说更方便)。 这是一种非常“数学”的方法。通常,您有一个data矩阵,您可以通过“提取”列作为标签在Xy之间进行拆分。 (此列中的所有值必须为0,1)。

话虽如此,长话短说:SVM会将您的数据归类为两个类。

标签(=类,其值为0或1)可以看作用于拆分数据的两个类别。所以你必须有一个只有0或1的列。

例如 如果我构建我的电影数据集,我可以设置一个列“我喜欢吗?” label=1如果我喜欢这部电影,label=0如果我不喜欢,那么训练我的SVM来预测我应该喜欢哪部电影

我在您的数据中没有看到哪个列是标签。如果您有超过2个类,SVM不适合您,您将需要查看多变量分类(这里超出范围,告诉我它是否是您想要的)。

我猜你的目标对你来说并不是很清楚。例如,人们不会使用ID列训练分类,这很少有意义。如果我错了,请解释您对数据的期望。 (您也可以解释列所指的内容)。

pltrdy