我愿意使用SVM来预测sklearn的IRIS数据集的类。使用WEKA,我可以使用LibSVM获得100%的预测。在Pyton中,LibSVM似乎是在SVR中实现的。因此,我尝试使用SVR,但得到的结果不是类(0、1、2),而是数字(回归结果)。

如果我使用与WEKA LibSVM相同的参数执行此代码:

import numpy
from sklearn import svm, datasets

# import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target
model = svm.libsvm.fit(kernel = 'rbf', svm_type=0, X=iris.data,
Y=iris.target.astype(numpy.float64), C=10, gamma = 10, epsilon = 0.01,     coef0=0, random_seed=0)
pred = svm.libsvm.predict(iris.data, *model)
pred = pred.astype(numpy.int)
print(pred)


我得到以下结果:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 2 2 2 1 2 2 2 2
 2 2 1 2 2 2 2 2 1 2 1 2 1 2 2 1 1 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 2 2
 2 1]


而WEKA可能会生成[ 0, ..., 0, 1, ... 1, 2, ..., 2]。我想知道为什么使用相同的参数无法获得相同的结果?

最佳答案

您要使用SVC,而不是SVR,或使用其他SVM classifiers中的一个选项。

您有什么约束迫使您专门使用libsvm?您还可以不使用liblinear吗?但是我不确定这是否重要,因为支持向量分类器是从抽象基类BaseLibSVM继承的,这意味着SVC在默认情况下也将使用libsvm。

您也可以根据需要使用svm.libsvm子软件包。在那里,即使输入数据被视为float64,默认模式为C_SVC,这意味着它将将float目标值视为类标签,而预测将作为类标签。

关于python - 带有虹膜数据集的sklearn C-SVC以获取类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48772565/

10-12 19:29