麻烦训练 SVM(scikit-learn 包)



背景/问题

我正在尝试使用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"

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

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

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

相关内容

  • 没有找到相关文章

最新更新