【问题标题】:sklearn C-SVC with iris dataset to get classessklearn C-SVC 与 iris 数据集获取类
【发布时间】:2018-07-24 03:54:49
【问题描述】:

我愿意使用 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]。我想知道为什么我不能使用相同的参数得到相同的结果?

【问题讨论】:

    标签: python scikit-learn svm


    【解决方案1】:

    您想使用SVC,而不是SVR,或者从其他SVM classifiers 中进行选择。

    你有什么限制迫使你专门使用 libsvm?你不能也使用 liblinear 吗?不过我不确定这是否重要,因为支持向量分类器继承自抽象基类 BaseLibSVM,这意味着 SVC 默认也将使用 libsvm。

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

    【讨论】:

    • 我担心的是,使用 WEKA 我可以获得 100% 的分类,即预测在类方面给出了与预期类相同的结果。我想在 python 中获得相同的结果。但是使用 SVC 或 SVR 我总是得到一些错误分类的实例。所以我认为它来自于SVC/SVR的实现。但是使用 libsvm 我得到更多错误:使用与 WEKA 相同的参数用于 C、gamma、内核……我得到 14 个错误分类的实例
    • @Jean-MichelRicher 您的评论并不完全清楚。如果您使用的是 SVR(这是一个 回归 模型),那么预测输出将没有意义……它们将是连续统一体的浮点值,并且不会代表类标签。你是通过四舍五入来量化它们吗?另外,您能否在您的问题中发布 SVC(not SVR)代码,就像您使用它一样,以便我们重现错误的示例?
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2020-07-08
    • 2017-07-31
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2017-05-11
    • 2018-07-22
    相关资源
    最近更新 更多