为什么我的Spark SVM始终预测相同的标签?

时间:2015-10-29 20:40:21

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

我无法让我的SVM预测0和1以及我期望它的位置。似乎在我训练它并给它更多的数据之后,它总是想要预测1或0,但是它将预测所有1或0和所有0,并且从不混合两者。我想知道你们其中一个人是否可以告诉我我做错了什么。

我已经搜索过" svm总是预测相同的价值"和类似的问题一样,对于我们这些刚接触机器学习的人来说,这似乎很常见。我很害怕,但我不理解我遇到过的答案。

所以我从这开始,它或多或少有效:

from pyspark.mllib.regression import LabeledPoint
cooked_rdd = sc.parallelize([LabeledPoint(0, [0]), LabeledPoint(1, [1])])
from pyspark.mllib.classification import SVMWithSGD
model = SVMWithSGD.train(cooked_rdd)

我说"或多或少"因为

model.predict([0])
Out[47]: 0

是我所期待的,而且......

model.predict([1])
Out[48]: 1

也是我所期待的,但是......

model.predict([0.000001])
Out[49]: 1

绝对不是我的预期。我认为无论造成什么都是我问题的根源。

在这里,我从烹饪数据开始......

def cook_data():
  x = random()
  y = random()
  dice = 0.25 + (random() * 0.5)
  if x**2 + y**2 > dice:
    category = 0
  else:
    category = 1
  return LabeledPoint(category, [x, y])

cooked_data = []
for i in range(0,5000):
  cooked_data.append(cook_data())

......我得到了一堆美丽的点。当我绘制它们时,我会得到一个有点混乱区域的分区,但是任何幼儿园的学生都可以画一条线来分开它们。那么为什么当我尝试画一条线来分开它们时呢?

cooked_rdd = sc.parallelize(cooked_data)
training, testing = cooked_rdd.randomSplit([0.9, 0.1], seed = 1)
model = SVMWithSGD.train(training)
prediction_and_label = testing.map(lambda p : (model.predict(p.features), p.label))

......我只能把它们归为一组,而不是两组? (下面是一个列表,显示了SVM预测的元组,答案应该是什么。)

prediction_and_label.collect()
Out[54]: 
[(0, 1.0),
 (0, 0.0),
 (0, 0.0),
 (0, 1.0),
 (0, 0.0),
 (0, 0.0),
 (0, 1.0),
 (0, 0.0),
 (0, 1.0),
 (0, 1.0),
...

等等。它只会猜测0,当应该有一个非常明显的分区时,它应该开始猜测1.有谁能告诉我我做错了什么?谢谢你的帮助。

编辑:我认为这不是规模问题,正如其他一些有类似问题的帖子所建议的那样。我尝试将所有内容乘以100,我仍然遇到同样的问题。我也试着玩我如何计算我的"骰子"变量,但我所能做的就是将SVM的猜测从所有0改为所有1。

2 个答案:

答案 0 :(得分:4)

我弄清楚为什么它总是预测所有的1或全0。我需要添加这一行:

model.setThreshold(0.5)

修复了它。我在使用

之后想出来了
model.clearThreshold()

clearThreshold,然后预测测试数据,告诉我计算机预测到的是浮点数,而不仅仅是我最终想要的二进制0或1。我可以看到SVM正在做出我认为是违反直觉的舍入决定。通过使用setThreshold,我现在能够获得更好的结果。

答案 1 :(得分:0)

SVM通常是一个非常依赖于调优的模型,如果参数选择不当,就会出现这种退化行为。我建议从一个更简单的分类模型类型开始,如逻辑回归或决策树/随机森林,并首先使其工作,以确保你有正确的周围代码。

一旦设置完毕,如果您仍想深入了解SVM,您可以使用交叉验证的网格搜索来找到模型和模型的更好参数。数据集。关于如何做到这一点的详细信息不仅仅是一个Stack Overflow的答案,但网上有很多关于它的好读物。