详解支持向量机-选取与核函数相关的参数:degree & gamma & coef0菜菜的sklearn课堂笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解支持向量机-选取与核函数相关的参数:degree & gamma & coef0菜菜的sklearn课堂笔记相关的知识,希望对你有一定的参考价值。
之前的表格
输入 | 含义 | 解决问题 | 核函数表达式 | 参数gamma | 参数degree | 参数coef0 |
---|---|---|---|---|---|---|
linear | 线性核 | 线性 | $K(x,y)=x^Ty=x \\cdot y$ | 无 | 无 | 无 |
poly | 多项式核 | 偏线性 | $K(x,y)=(\\gamma(x \\cdot y)+r)^d$ | 有 | 有 | 有 |
sigmoid | 双曲正切核 | 非线性 | $K(x,y)=\\tanh(\\gamma (x \\cdot y)+r)$ | 有 | 无 | 有 |
rbf | 高斯径向基 | 偏非线性 | $K(x,y)=e^-\\gamma|x-y|^2,\\gamma>0$ | 有 | 无 | 无 |
对于线性核函数,"kernel"是唯一能够影响它的参数,但是对于其他三种非线性核函数,他们还受到参数gamma,degree以及coef0的影响。 参数gamma就是表达式中的$\\gamma$,degree就是多项式核函数的次数$d$,参数coef0就是常数项$r$。其中,高斯径向量核函数受到gamma的影响,而多项式核函数受到三个参数的影响
参数 | 含义 |
---|---|
degree | 整数,可不填,默认3<br>多项式核函数的次数,如果核函数没有该参数将被忽略 |
gamma | 浮点数,可不填,默认auto<br>核函数的系数,仅在参数Kernel的选项为rbf,poly,sigmoid的时候有效<br>输入auto,自动使用$\\beginaligned \\frac1n_features\\endaligned$作为gamma的取值<br>输入scale,则使用$\\beginaligned \\frac1n_feature\\times X.std()\\endaligned$作为gamma的取值<br>输入auto_deprecated,则表示没有传递明确的gamma值(不推荐使用) |
coef0 | 浮点数,可不填,默认=0.0<br>核函数中的常数项,它只在参数Kernel为poly和sigmoid的时候有效 |
但从核函数的公式来看,我们其实很难去界定具体每个参数如何影响了SVM的表现。当gamma的符号变化,或者degree的大小变化时,核函数本身甚至都不是永远单调的。所以如果我们想要彻底地理解这三个参数,我们要先推导出它们如何影响核函数地变化,再找出核函数的变化如何影响了我们的预测函数(可能改变我们的核变化所在的维度),再判断出决策边界随着预测函数的改变发生了怎样的变化。无论是从数学的角度来说还是从实践的角度来说,这个过程太复杂也太低效。所以,我们往往避免去真正探究这些参数如何影响了我们的核函数,而直接使用学习曲线或者网格搜索来帮助我们查找最佳的参数组合。 对于高斯径向基核函数,调整gamma的方式其实比较容易,那就是画学习曲线。我们来试试看高斯径向基核函数rbf的参数gamma在乳腺癌数据集上的表现:
score = []
gamma_range = np.logspace(-10,1,50)
for i in gamma_range:
clf = SVC(kernel="rbf",gamma=i,cache_size=5000).fit(Xtrain,Ytrain)
score.append(clf.score(Xtest,Ytest))
print(max(score),gamma_range[score.index(max(score))])
---
0.9766081871345029 0.012067926406393264
plt.plot(gamma_range,score)
plt.show()
通过学习曲线,很容就找出了rbf的最佳gamma值。但我们观察到,这其实与线性核函数的准确率一模一样之前的准确率。我们可以多次调整gamma_range来观察结果,可以发现97.6608应该是rbf核函数的极限了。 但对于多项式核函数来说,因为三个参数共同作用在一个数学公式上影响它的效果,因此我们往往使用网格搜索来共同调整三个对多项式核函数有影响的参数。依然使用乳腺癌数据集。
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.model_selection import GridSearchCV
time0 = time()
gamma_range = np.logspace(-10,1,20)
coef0_range = np.linspace(0,5,10) # coef不接收负数
# 因为我们已经知道多项式核函数的degree为1,因此不需要进行网格搜索
param_grid = dict(gamma = gamma_range
,coef0 = coef0_range)
cv = StratifiedShuffleSplit(n_splits=5,test_size=0.3,random_state=420)
# n_splits:将数据集分5次
# test_size:测试集大小
grid = GridSearchCV(SVC(kernel="poly",degree=1,cache_size=5000)
,param_grid=param_grid
,cv=cv
)
grid.fit(X,y)
print("The best parameters are %s with a score of %0.5f" % (grid.best_params_,grid.best_score_))
print(datetime.datetime.fromtimestamp(time() - time0).strftime("%M:%S:%f"))
---
The best parameters are coef0: 0.0, gamma: 0.18329807108324375 with a score of 0.96959
00:07:456977
可以发现,网格搜索为我们返回的整体分数是0.96959,虽然比调参前略有提高,但依然没有超过线性核函数核和rbf的结果。可见,如果最初选择核函数的时候,你就发现多项式的结果不如rbf和线性核函数,那就不要挣扎了,试试看调整rbf或者直接使用线性。
以上是关于详解支持向量机-选取与核函数相关的参数:degree & gamma & coef0菜菜的sklearn课堂笔记的主要内容,如果未能解决你的问题,请参考以下文章