1

背景/问题

我正在尝试使用 Scikit-learn 创建一个 SVM。我有一个训练集(这里是它的链接https://dl.dropboxusercontent.com/u/9876125/training_patients.txt),我加载它然后用来训练 SVM。训练集长 3600 行。当我使用所有 3600 个元组时,SVM 永远不会完成训练......但是当我只使用前 3594 个元组时,它会在一分钟内完成训练。我尝试过使用各种不同大小的训练集,但同样的事情还在继续发生……取决于我使用 SVM 的元组数量,要么训练得非常快,要么永远不会完成。这使我得出结论,SVM 难以根据数据收敛到答案。

我关于这是一个收敛问题的假设是否正确?如果是这样,解决方案是什么?如果不是,还有什么问题?

代码

import pylab as pl  # @UnresolvedImport
from sklearn.datasets import load_svmlight_file

print(doc)
import numpy as np
from sklearn import svm, datasets


print "loading training setn"
X_train, y_train = load_svmlight_file("training_patients.txt")


h = .02  # step size in the mesh
C = 1.0  # SVM regularization parameter


print "creating svmn"
poly_svc = svm.SVC(kernel='poly', cache_size=600, degree=40, C=C).fit(X_train, y_train)


print "all done"
4

2 回答 2

4

SVM 背后的优化算法具有三次 (O(n^3)) 复杂度,假设相对较高的成本 (C) 和高维特征空间(d=40 的多项式内核意味着约 1600 维特征空间)。我不会将此称为“收敛问题”,因为对于超过 3000 个样本,训练这样的模型可能需要一段时间,这很正常。事实上,对于某些子集,您实现更快的收敛是非常丰富的特征投影的效果(RBF 内核也会发生同样的情况)——这是一种普遍现象,即使对于来自 UCI 库的非常简单的数据也是如此。正如评论中提到的,设置“verbose=True”可能会为您提供有关优化过程的其他信息 - 它会输出迭代次数、支持向量的数量(SV 的数量越高,SVM 过度拟合越多,

于 2013-10-23T05:57:54.260 回答
0

我还想在@lejlot 的回答中添加标准化输入变量(居中和缩放到单位方差或重新缩放到某个范围,例如 [0, 1] 或 [-1, 1])可以使优化问题更容易并加快速度收敛也是如此。

通过查看您的数据,似乎某些特征的最小值和最大值明显大于其他特征。也许MinMaxScaler可以提供帮助。总体上看一下预处理文档

于 2013-10-23T07:51:44.913 回答