【问题标题】:Trouble Training SVM (scikit-learn package)故障训练 SVM(scikit-learn 包)
【发布时间】:2013-10-31 20:42:59
【问题描述】:

背景/问题

我正在尝试使用 Scikit-learn 创建一个 SVM。我有一个训练集(这里是它的链接https://dl.dropboxusercontent.com/u/9876125/training_patients.txt),我加载它然后用来训练 SVM。训练集长 3600 行。当我使用所有 3600 个元组时,SVM 永远不会完成训练......但是当我只使用前 3594 个元组时,它会在一分钟内完成训练。我尝试过使用各种不同大小的训练集,但同样的事情还在继续发生……取决于我使用 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"

【问题讨论】:

  • 尝试将SVC 设置为verbose=1。它不会告诉你太多,但它可能会暗示它是否仍在做任何事情。 (另请注意,在最坏的情况下,使用 SVC 进行 SVM 训练可能需要立方时间。)
  • 正如@FredFoo 建议的那样,您可以通过设置verbose=1 来查看模型的训练是否继续,如果它一直持续下去,您可以通过将max_iter 设置为合理的数量来限制最大迭代次数。跨度>

标签: python scikit-learn svm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    通过查看您的数据,似乎某些特征的最小值和最大值明显大于其他特征。也许MinMaxScaler 可以提供帮助。大致看一下preprocessing doc

    【讨论】:

    • 实际上,将“挤压”到单位间隔不是一种好的技术,它很简单,但在统计上是有问题的。它主要用于克服潜在的偏见,这似乎不会在这里发生(因为这些差异非常小)。更合理(并且在统计上合理)的方法是对均值 = 0 和标准 = 1 进行归一化(可以在这里完成,我没有计算这些统计数据,但数据似乎分布良好)。
    猜你喜欢
    • 2017-04-16
    • 2013-05-25
    • 2013-07-30
    • 1970-01-01
    • 2020-01-04
    • 2013-04-14
    • 2016-11-26
    • 2015-05-04
    • 2016-02-05
    相关资源
    最近更新 更多