gpt4 book ai didi

python - 为什么 scikit-learn SVM.SVC() 非常慢?

转载 作者:IT老高 更新时间:2023-10-28 20:45:37 45 4
gpt4 key购买 nike

我尝试使用 SVM 分类器来训练大约 10 万个样本的数据,但我发现它非常慢,甚至在两个小时后也没有响应。当数据集有大约 1k 个样本时,我可以立即得到结果。我还尝试了 SGDClassifier 和 naïvebayes,它们的速度非常快,我在几分钟内就得到了结果。你能解释一下这个现象吗?

最佳答案

关于 SVM 学习的一般说明

使用非线性内核的 SVM 训练(这是 sklearn 的 SVC 中的默认设置)在复杂性方面大约是:O(n_samples^2 * n_features) link to some question with this approximation given by one of sklearn's devs .这适用于 SMO-algorithmlibsvm 内使用,这是 sklearn 中针对此类问题的核心求解器。

当不使用内核并且使用 sklearn.svm.LinearSVC 时,这会发生很大变化(基于 liblinear )或 sklearn.linear_model.SGDClassifier .

所以我们可以做一些数学运算来近似 1k 和 100k 样本之间的时间差:

1k = 1000^2 = 1.000.000 steps = Time X
100k = 100.000^2 = 10.000.000.000 steps = Time X * 10000 !!!

这只是一个近似值,可能更糟或更糟(例如,设置缓存大小;以内存换取速度增益)!

Scikit-learn 具体说明

情况也可能要复杂得多,因为 scikit-learn 在 jail 里为我们做了很多好事。以上对经典的 2 类 SVM 有效。如果您有机会尝试学习一些多类数据; scikit-learn 将自动使用 OneVsRest 或 OneVsAll 方法来执行此操作(因为核心 SVM 算法不支持此操作)。阅读 scikit-learns 文档以了解这部分内容。

同样的警告也适用于生成概率:SVM 不会自然地为最终预测生成概率。因此,要使用这些(由参数激活),scikit-learn 使用称为 Platt scaling 的重交叉验证程序。这也需要很多时间!

Scikit-learn 文档

因为 sklearn 拥有最好的文档之一,这些文档中通常有很好的部分来解释类似的内容 (link):

enter image description here

关于python - 为什么 scikit-learn SVM.SVC() 非常慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077432/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com