【问题标题】:Unable to train pySpark SVM, labeled point issue无法训练 pySpark SVM,标记点问题
【发布时间】:2017-03-14 21:18:46
【问题描述】:

我正在尝试将火花数据框转换为标记点。 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 版

【问题讨论】:

  • 您好,您能具体说明您运行的是哪个 Spark 版本吗?

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


【解决方案1】:

如果不查看您的数据,我无法确定,但SVMWithSGD 的一个常见问题来自标签。

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

你能检查一下吗?

希望对你有帮助, 点滴


编辑(查看数据后):

下摆。让我们回到基础:SVM(粗略地)“学习如何将数据分成两个类”(这不是很正式,但让我们暂时搁置一下)。话虽如此,您的数据集必须是:X 形状矩阵 n x Dn 行数,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

【讨论】:

  • 谢谢你。我添加了数据的屏幕截图。那么这意味着在尝试创建标记点时,最后一列应该是第一列?
  • 标签(其值为 0 或 1)必须被视为您要拆分数据的“类别”。所以你必须有一列只有 0 或 1。例如,如果我构建我的电影数据集,我可以设置一个列“我喜欢它吗?”如果我喜欢这部电影,label=1,如果我不喜欢,label=0,然后训练我的 SVM 来预测我应该喜欢哪部电影。
  • 是的,我的错。我在实施中错了。我没有注意到。我会修复它,看看它是否有效
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 2015-05-04
  • 2015-07-25
  • 2012-11-03
  • 2015-04-18
  • 2015-01-22
  • 2012-06-27
相关资源
最近更新 更多