Python 为什么scikit学习SVM.SVC()非常慢?

Python 为什么scikit学习SVM.SVC()非常慢?,python,scikit-learn,svm,Python,Scikit Learn,Svm,我尝试使用SVM分类器来训练一个大约有100k个样本的数据,但我发现它非常慢,甚至在两小时后也没有响应。当数据集有大约1k个样本时,我可以立即得到结果。我还尝试了SGDClassizer和naïve bayes,速度非常快,我在几分钟内就得到了结果。你能解释一下这种现象吗?关于SVM学习的概述 sklearn的SVC中默认使用非线性核的SVM训练,其复杂性大约为:O(n_样本^2*n_特征)。这适用于内部使用的,它是sklearn中针对此类问题的核心解算器 当不使用内核并且使用(基于)或时,这种

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

关于SVM学习的概述 sklearn的SVC中默认使用非线性核的SVM训练,其复杂性大约为:
O(n_样本^2*n_特征)
。这适用于内部使用的,它是sklearn中针对此类问题的核心解算器

当不使用内核并且使用(基于)或时,这种情况会发生很大变化

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

1k = 1000^2 = 1.000.000 steps = Time X
100k = 100.000^2 = 10.000.000.000 steps = Time X * 10000 !!!
这只是一个近似值,可能更糟或更差(例如,设置缓存大小;以牺牲内存换取速度提高)

Scikit了解具体备注 情况也可能更加复杂,因为scikit所学的东西在监狱里为我们所做。上述结论对于经典的2类支持向量机是有效的。如果你有机会尝试学习一些多类数据;scikit learn将自动使用OneVsRest或OneVsAll方法来实现这一点(因为核心SVM算法不支持这一点)。阅读scikit学习文档以理解此部分

同样的警告也适用于生成概率:SVM不会自然生成最终预测的概率。因此,要使用这些(由参数激活的)scikit学习,将使用一个称为的大量交叉验证过程,这也将花费大量时间

Scikit学习文档 因为sklearn有一个最好的文档,所以这些文档中通常有一个很好的部分来解释类似的内容():


因此,对于拥有大量数据的用户来说,scikit learn不是最佳选择。我也来过这个问题。800K个例子,我花了2个小时。@GoingMyWay,那么还有更快的选择吗?@GoingMyWay我认为这是对答案的误解。带核的SVM算法的时间复杂度是一个普遍事实,与您使用的软件包无关。这是使用SVM模型的固有特性,无论是来自sklearn还是R中的什么。除非您知道一种优化SVM参数的算法,该算法神奇地改进了这一点,并且还没有在sklearn中实现,否则使用另一个包将不会获得任何好处。关于SVC,再次强调,“一对一”或替代方案是使用多个类的SVM所需要做的事情。@GoingMyWay听起来您的问题可能是您认为将SVM与内核一起使用太慢,但这不是sklearn的问题。sklearn只是实现了算法,如果算法在您的案例中表现不佳,那是因为您选择了错误的算法。我很想知道,在你发表评论之后,你是否能够找到没有在回答中提到的缺点的东西。对于第一个过程(甚至可能是最终解决方案,取决于您的问题),线性可能是您想要的,这将节省大量时间。我个人希望让用户指定内核参数,而不是使用默认参数,但有人反对这一点,我对该库的开发没有影响。另请参见: