为什么我不能使用SVM和KNN预测新数据?

时间:2018-12-15 04:21:59

标签: python machine-learning scikit-learn svm knn

我是机器学习的新手,我刚刚通过sklearn学习了KNN和SVM。如何使用SVM或KNN预测新数据?我都试图做出预测。仅当数据已知时,它们才能做出良好的预测。但是,当我尝试预测新数据时,它们给出了错误的预测。

这是我的代码:

import numpy as np
from sklearn import svm

x=np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]], dtype=np.float64)
y=np.array([2,3,4,5,6,7,8,9,10,11,12], dtype=np.float64)

clf = svm.SVC(kernel='linear')
clf.fit(x, y)
print(clf.predict([[20]]))
print(clf.score(x, y))

0utput:

[12.]
1.0

只要要预测的数据在x_train范围内,此代码即可进行良好的预测。但是,当我尝试预测例如20或范围x_train以上的任何值时,输出将始终为12,这是y的最后一个元素。我不知道我在代码中做错了什么。

2 个答案:

答案 0 :(得分:3)

该代码的行为符合支持向量机的数学描述。

您必须了解算法如何解释您的数据。您有11个数据点,并且为每个数据点赋予不同的 class 。 SVM最终将数字线基本上分为11个部分(对于您定义的11个 classes ):

data = [(x, clf.predict([[x]])[0]) for x in np.linspace(1, 20, 300)] plt.scatter([p[0] for p in data], [p[1] for p in data]) plt.show()

SVM classes

AILearning的答案告诉您如何解决给定的玩具问题,但请确保您还了解为什么您的代码没有按照您的想象做。对于任何有限的示例集,都有无数个适合数据的函数。您的根本问题是混淆了回归和分类。从它的声音来看,您想要一个简单的回归模型以从数据点外推拟合函数,但是您的 code 用于分类模型。

答案 1 :(得分:2)

您必须使用回归模型而不是分类模型。对于基于svm的回归,请使用svm.SVR()

import numpy as np
from sklearn import svm

x=np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]], dtype=np.float64)
y=np.array([2,3,4,5,6,7,8,9,10,11,12], dtype=np.float64)

clf = svm.SVR(kernel='linear')
clf.fit(x, y)
print(clf.predict([[50]]))
print(clf.score(x, y))

输出:

[50.12]
0.9996