在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性差得多
Posted
技术标签:
【中文标题】在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性差得多【英文标题】:Much worse performance with RBF kernel than linear in SVM in python scikit-learn 【发布时间】:2016-04-12 15:35:24 【问题描述】:我正在使用 SVM 执行一些机器学习任务。我怀疑数据是非线性的,所以我还包括了 RBF 内核。我发现带有 RBF 内核的 SVM 比线性 SVM 差得多。我想知道我的分类器参数规范是否有问题。
我的代码如下:
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
svm1 = LinearSVC() # performs the best, similar to logistic regression results which is expected
svm2 = LinearSVC(class_weight="auto") # performs somewhat worse than svm1
svm3 = SVC(kernel='rbf', random_state=0, C=1.0, cache_size=4000, class_weight='balanced') # performs way worse than svm1; takes the longest processing time
svm4 = SVC(kernel='rbf', random_state=0, C=1.0, cache_size=4000) # this is the WORST of all, the classifier simply picks the majority class
【问题讨论】:
【参考方案1】:使用 RBF 尝试调整您的 C
和 gamma
参数。 Scikit-learn 的网格搜索将为您提供帮助。
下面是一个让您入门的示例:
svc = SVC(...)
params = "C":[0.1, 1, 10], "gamma": [0.1, 0.01, 0.001]
grid_search = GridSearchCV(svc, params)
grid_search.fit(X,y)
【讨论】:
你是对的,通过转动 C 和 gamma,性能得到了极大的提升。我想知道 SVM(具有非线性内核)的性能是否不比具有线性内核的 SVM 好,这是否意味着这些类是线性可分的? 尝试调整你的线性支持向量机。线性没有伽玛,只有 C。你可能会惊讶在高维空间中什么变成线性可分的。 在高维空间中,线性 svm 通常做得更好。低维空间,RBF 做得更好。 在高维中,你的意思是特征的数量,对吧?您能否解释或参考为什么在高维中线性 svm 做得更好?不应该是维度越多,使用直线/平面越难分离吗? 是的。我所说的维度是指特征的数量。在高维空间中,点之间的距离变得不那么有意义,这就是内核不那么有意义的原因。见en.wikipedia.org/wiki/Curse_of_dimensionality。同样在更高维空间中,创建线性决策边界通常会变得更容易。【参考方案2】:以下论文是 SVM 用户的一个很好的指南。
支持向量分类实用指南 http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf
简而言之,要让 SVM 正确执行,三点必不可少。
(1) 特征准备(特征缩放、特征分类) (2) 参数调优(粗粒度和细粒度交叉验证) (3) 内核选择(#features 与 #instances)(3) 的基本思想是如果#features >> #instances 则选择线性核。使用较小的#instances,具有非线性内核的 SVM 很容易过拟合。
【讨论】:
以上是关于在 python scikit-learn 中,RBF 内核的性能比 SVM 中的线性差得多的主要内容,如果未能解决你的问题,请参考以下文章
将 PMML 模型导入 Python (Scikit-learn)
k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?
有没有办法在 Python 中为具有多个分类的随机森林制作部分依赖图(使用 scikit-learn)?