我是机器学习的新手,我刚刚通过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的最后一个元素。我不知道我在代码中做错了什么。
答案 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()
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