为啥它只适用于在 SVM 分类器中设置 kernel:'rbf'?
Posted
技术标签:
【中文标题】为啥它只适用于在 SVM 分类器中设置 kernel:\'rbf\'?【英文标题】:Why it's only working with setting kernel: 'rbf' in SVM Classifier?为什么它只适用于在 SVM 分类器中设置 kernel:'rbf'? 【发布时间】:2018-12-23 08:34:34 【问题描述】: from sklearn.model_selection import GridSearchCV
from sklearn import svm
params_svm =
'kernel' : ['linear','rbf','poly'],
'C' : [0.1,0.5,1,10,100],
'gamma' : [0.001,0.01,0.1,1,10]
svm_clf = svm.SVC()
estimator_svm = GridSearchCV(svm_clf,param_grid=params_svm,cv=4,verbose=1,scoring='accuracy')
estimator_svm.fit(data,labels)
print(estimator_svm.best_params_)
estimator_svm.best_score_
/*
data.shape is (891,9)
labels.shape is (891) both are numeric 2-D and 1-D arrays.
*/
当我将 GridSearchCV 与 rbf 一起使用时,它会在 2.7 秒内提供最佳参数组合..! 但是当我单独列出包含任何“poly”或“linear”或“rbf”的内核列表时,产生输出需要很长时间,即即使在 15-20 分钟后也不给出输出,这意味着我做错了。我是机器学习(监督)的新手。我无法在编码中找到任何错误...我不知道幕后出了什么问题!
谁能给我解释一下,我做错了什么
【问题讨论】:
请注意,具有“线性”内核的 SVM 不需要 gamma 参数 - 所以可能是因为 GridSearchCV 足够聪明,不会为线性模型循环 Gamma,因此它运行得更快?您是否也尝试过简单地手动循环参数以确保每次迭代都正确运行? 【参考方案1】:不,根据您的代码,您没有做错任何事情。这里有很多因素在起作用
SVC 是一个复杂的分类器,需要计算数据集中每对点之间的距离。复杂度也因内核不同而不同。我不确定,但我认为 rbf 内核是 O((no_of_samples)^2 * n_features)
,而线性内核是 O(n_samples*n_features)
。所以,并不是因为rbf kernel
在 15 分钟内工作,那么线性内核也会在类似的时间内工作。
此外,所花费的时间很大程度上取决于数据集和其中存在的数据模式。例如一个 rbf 内核可能会快速收敛,比如 C = 0.5
,但多项式内核可能需要更多时间才能收敛到相同的 C 值。
另外,不使用缓存会增加很多运行时间。在this answer,作者提到它可能会增加到O(n_samples^3 *n_features)。
这是官方文档from sklearn about SVM complexity。有关使用 SVM 的实用技巧,请参阅 this section。
您可以将 verbose
设置为 True 以查看您的分类器的进度及其训练方式。
参考文献
GridSearchCV goes to endless execution using SVC Computational complexity of SVM Official Documentation of SVM for scikit-learn【讨论】:
Kk 谢谢...!但是如果它的时间复杂度是 O(n_samples * n_features) 比 rbf 内核简单,为什么它会在线性/多 svc 内核中花费更多时间! 我不确定,也许它与数据有关......我的意思是因为数据不是线性可分的,所以线性内核需要很多时间。如果此答案解决了您的问题,请您投票并将其标记为正确的答案:-) 正如我在第三点中提到的,没有缓存,复杂性会增加,所以我的情况也是如此。虽然不看数据集我不能肯定。以上是关于为啥它只适用于在 SVM 分类器中设置 kernel:'rbf'?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 scikit-learn SVM 分类器交叉验证这么慢?