背景/问题
我正在尝试使用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"
答案 0 :(得分:4)
SVM背后的优化算法具有三次(O(n ^ 3))复杂度,假设成本相对较高(C)和高维特征空间(d = 40的多项式核意味着~1600维特征空间)。我不会称之为“收敛问题”,因为3000多个样本可能需要一段时间来训练这样的模型,这是正常的。事实上,对于某些子集,您实现更快的收敛是非常丰富的特征投影的效果(RBF内核也会发生这种情况) - 这是一种常见的现象,即使是来自UCI库的非常简单的数据也是如此。正如评论中所提到的,设置“verbose = True”可能会为您提供有关优化过程的其他信息 - 它将输出迭代次数,支持向量数量(SV数量越多,SVM过度拟合越多,可以是收敛缓慢的原因。
答案 1 :(得分:0)
我还要添加@lejlot的答案,标准化输入变量(居中和缩放到单位方差或重新缩放到某个范围,如[0,1]或[-1,1])可以使优化问题更容易并加快收敛速度。
通过查看您的数据,似乎某些功能的最小值和最大值明显大于其他功能。也许MinMaxScaler可以提供帮助。一般来看preprocessing doc。