【问题标题】:SVC not resolving on MNISTSVC 无法解决 MNIST
【发布时间】:2020-03-10 13:49:49
【问题描述】:

我正在使用以下代码分解 MNIST 并运行 SVM:

mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
svm_clf = SVC()
svm_clf.fit(X_train, y_train)

昨晚我让它跑了。三个小时过去了,还是没有解决。

我收到了未来的警告

FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.
  "avoid this warning.", FutureWarning)

但我无法想象不设置伽玛会以这种方式影响它。

我在 Jupyter 5.7.8 中运行 Python 3.6.7。

【问题讨论】:

  • SVM 训练速度很慢,而且你也有太多的样本要训练,首先尝试将训练规模减少到 5000-10000 左右,然后测试准确度,然后你可以在另一批 5k 样本上进行训练.该警告与训练时间无关。
  • 这可能与伽玛无关。绝对让它变得如此缓慢的一件事是,SVM 根据定义是一个二元分类器。当您将它与多个类一起使用时,Scikit-Learn 会为每一对类训练一个模型(我相信 2^10)。所以它很长,因为你正在训练几十个分类器。此外,您没有使用 LinearSVC,因此非线性速度要慢一千倍。
  • 我对伽玛的看法是这样的,但我想我会包括该信息以防万一。今天早上我在一个有一定功率和 GPU 的 Colab 笔记本上再次尝试了它。我不太确定它是否有帮助。 ....我对这个东西比较陌生——3 小时对于图像数据的二进制分类器来说是合理的时间?
  • 如果您使用 sklearn 训练模型,在 GPU 上使用 Colab 运行将无济于事,因为默认情况下 sklearn 模型仅在 CPU 上运行。二元分类器的训练时间取决于您使用的算法类型,速度和准确性之间总是需要权衡取舍。您可以尝试决策树、神经网络等。它们可能会在更短的时间内进行训练。
  • 正如@techytushar 所说,先尝试将样本减少到 100,看看它是否正常工作或卡住,然后如果一切正常,则进一步增加。

标签: python scikit-learn jupyter-notebook svm mnist


【解决方案1】:

确实,没有解决办法。随着训练向量数量的增加,训练时间也会增加。

参考:https://scikit-learn.org/stable/modules/svm.html#complexity

仅作记录,支持向量机非常适合解决这些问题(请参阅此处:https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html),但是当数据集很大时,它们会变得很慢。


编辑 1:在 sklearn website 中有这个:

该实现基于 libsvm。拟合时间至少可以缩放 与样本数量成二次方关系,超出范围可能不切实际 数以万计的样本。对于大型数据集,请考虑使用 sklearn.linear_model.LinearSVC 或 sklearn.linear_model.SGDClassifier 相反,可能在 sklearn.kernel_approximation.Nystroem 变压器。

【讨论】:

  • 这是否表明使用 SVM 作为多类通常是不明智的?
  • 没有。支持向量机是解决多类问题的好工具。问题是当你有一个巨大的数据集时。然后它们变得非常缓慢。
  • 行业在训练时间/数据集大小的准确性方面是否存在特别的平衡?换句话说,一般来说,是否存在数据科学的最佳实践,即建议 SVM 克服的障碍?
  • 在我看来没有。但是,您将使用哪种型号是您的决定。解决问题的更好方法是使用 K-Folds,它会自然地将数据分成更小的批次。
  • 换句话说,类似于cross_val_predict(SVC(), X_train, y_train, cv=5)?
猜你喜欢
  • 2018-06-15
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2016-03-30
  • 2018-04-21
相关资源
最近更新 更多