机器学习Sklearn——核函数参数的选取、硬间隔和软间隔、重要参数C

13 篇文章 1 订阅
10 篇文章 1 订阅

目录

1 核函数参数的选取

1.1 rbf调节gamma——绘制学习曲线

1.2 poly调节三个参数——网格搜索

2 软间隔和硬间隔

 2.1 重要参数C


1 核函数参数的选取

Kernel的参数我们上次就已经讲解过了:

机器学习Sklearn——核函数、核函数在不同数据集上的表现、核函数的优势和缺点_chelsea_tongtong的博客-CSDN博客

在知道如何选取核函数之外,我们还要观察一下除了Kernel以外的核函数相关的参数 ,对于线性核函数,kernel是唯一能影响他的参数,但是对于其他三种非线性核函数,他们还受到参数gamma ,degree,coef0的影响,其中多项式核函数受到三个参数的影响,而高斯径向基受到gamma的影响。

   从核函数的公式来说,很难界定每个参数如何影响SVM。核函数本身不是单调的,所以我们想推导核函数的参数变化如何影响核函数从而影响预测函数,从而影响决策边界,是很困难的。

所以想探究这些参数变化如何影响核函数,可以用学习曲线或者网格搜索来帮助我们查找最佳参数组合。

  我们此次依旧使用乳腺癌数据集。

1.1 rbf调节gamma——绘制学习曲线

score = []
gamma_range = np.logspace(-10,1,50) # 对数刻度上均匀间隔的数字,从-10到1取五十个等间隔的对数
for i in gamma_range:
    clf = SVC(kernel='rbf', gamma=i, cache_size=1000).fit(x_train, y_train)
    score.append(clf.score(x_test,y_test))
    
print(max(score), gamma_range[score.index(max(score))])
plt.plot(gamma_range, score)
plt.show()

 我们可以通过多次调整gammam_range来观察结果,发现97.661%是rbf的极限。

1.2 poly调节三个参数——网格搜索

对于多项式核函数来说,一切就没有那么容易了,因为三个参数共同作用在一个数学公式上影响它的效果。因此,我们使用网格搜索来共同调整三个对多项式核函数有影响的参数。

rom 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)
 
param_grid = dict(gamma = gamma_range
                  ,coef0 = coef0_range)
cv = StratifiedShuffleSplit(n_splits=5, test_size=0.3, random_state=420)#将数据分为5份,5份数据中测试集占30%
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(time()-time0)

我们发现整体的分数是0.96959,可以发现虽然调整参数比没有调整参数之前的分数高。但是依然没有超过线性核函数rbf的结果。所以说当初选择核函数,你就别挣扎了。直接用线性核函数和rbf就行。

2 软间隔和硬间隔

硬间隔:完全分类准确,其损失函数不存在;其损失值为0;只要找出两个异类正中间的那个平面。决策边界单纯的寻找最大边际。

软间隔:当两组数据几乎是线性可分的,但决策边界在训练集上存在较少的训练误差,这两种数据被称为存在“软间隔”。

 【机器学习系列】之SVM硬间隔和软间隔_張張張張的博客-CSDN博客_svm软间隔硬间隔

 2.1 重要参数C

松弛系数的惩罚力度由我们的参数C来控制。参数C用来权衡“训练样本的正确分类”与“决策函数的边际最大化”。

#调线性核函数
score = []
C_range = np.linspace(0.01,30,50)
for i in C_range:
    clf = SVC(kernel="linear",C=i,cache_size=5000).fit(Xtrain,Ytrain)
    score.append(clf.score(Xtest,Ytest))
print(max(score), C_range[score.index(max(score))])
plt.plot(C_range,score)
plt.show()
 
#换rbf
score = []
C_range = np.linspace(0.01,30,50)
for i in C_range:
    clf = SVC(kernel="rbf",C=i,gamma = 0.012742749857031322,cache_size=5000).fit(Xtrain,Ytrain)
    score.append(clf.score(Xtest,Ytest))
    
print(max(score), C_range[score.index(max(score))])
plt.plot(C_range,score)
plt.show()
 
#进一步细化
score = []
C_range = np.linspace(5,7,50)
for i in C_range:
    clf = SVC(kernel="rbf",C=i,gamma = 
0.012742749857031322,cache_size=5000).fit(Xtrain,Ytrain)
    score.append(clf.score(Xtest,Ytest))
    
print(max(score), C_range[score.index(max(score))])
plt.plot(C_range,score)
plt.show()

以下三幅图就是惩罚力度C的学习曲线

线性核函数

0.9766081871345029 1.2340816326530613

rbf

                       0.9824561403508771 6.130408163265306

 rbf进一步细化:                           
                      0.9824561403508771 5.938775510204081

针对sklearn中的乳腺癌数据集,使用SVC作为算法模型,进行调参,最优的参数组合为:

核函数                 gamma        C
   RBF   0.0120679264063932645.938775510204081

 

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值