DataWhale 集成学习task04--参数调优

本文介绍了如何通过网格搜索和随机搜索优化SVR在波士顿房价数据集上的表现,对比了网格搜索的详细步骤、耗时及随机搜索的随机性,为模型调优提供实用方法。

DataWhale 集成学习task04–参数调优

看到这次的学习内容,高兴坏了,终于不用肝了,哈哈哈哈哈!!!!

前言

本次回归模型调优的课程使用SVR的例子,结合管道来进行,数据集是波士顿房价。
下面是baseline的演示:

# 我们先来对未调参的SVR进行评价: 
from sklearn.svm import SVR     # 引入SVR类
from sklearn.pipeline import make_pipeline   # 引入管道简化学习流程
from sklearn.preprocessing import StandardScaler # 由于SVR基于距离计算,引入对数据进行标准化的类
from sklearn.model_selection import GridSearchCV  # 引入网格搜索调优
from sklearn.model_selection import cross_val_score # 引入K折交叉验证
from sklearn import datasets


boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),
                         SVR())
score1 = cross_val_score(estimator=pipe_SVR,
                         X = X,
                         y = y,
                         scoring = 'r2',
                         cv = 10)       # 10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))
CV accuracy: 0.187 +/- 0.649

0.概述

  1. 参数与超参数
  2. 网格搜索(Grid Search)
  3. 随机搜索(Randomied Search)

1. 参数与超参数

模型参数 ------ 是模型内部的配置变量,其值可以根据数据进行估计。

  • 进行预测时需要参数。
  • 它参数定义了可使用的模型。
  • 参数是从数据估计或获悉的。
  • 参数通常不由编程者手动设置。
  • 参数通常被保存为学习模型的一部分。
  • 参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。

模型超参数 ------ 是模型外部的配置,其值无法从数据中估计,是先验的。

  • 超参数通常用于帮助估计模型参数。
  • 超参数通常由人工指定。
  • 超参数通常可以使用启发式设置。
  • 超参数经常被调整为给定的预测建模问题。

2. 网格搜索(Grid Search)

调用的函数(GridSearchCV):

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html?highlight=gridsearchcv#sklearn.model_selection.GridSearchCV

GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证。网格搜索,搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,是一个训练和比较的过程。

2003年,网格搜索算法被应用于支持向量机(Support Vector Machine,SVM)的参数优化问题。网格搜索是一项模型超参数(即需要预先优化设置而非通过训练得到的参数)优化技术,常用于优化三个或者更少数量的超参数,本质是一种穷举法。对于每个超参数,使用者选择一个较小的有限集去探索。然后,这些超参数笛卡尔乘积得到若干组超参数。网格搜索使用每组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。
在这里插入图片描述
在这里插入图片描述

搜索同样的参数,对比可以发现网格搜索的主要缺点是耗时

所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。

代码演示:

%%time
# 下面我们使用网格搜索来对SVR调参:
from sklearn.pipeline import Pipeline
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),
                     ("svr",SVR())])
param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]
param_grid = [{"svr__C":param_range,"svr__kernel":["linear"]},  # 注意__是指两个下划线,一个下划线会报错的
              {"svr__C":param_range,"svr__gamma":param_range,"svr__kernel":["rbf"]}]
gs = GridSearchCV(estimator=pipe_svr,
                  param_grid = param_grid,
                  scoring = 'r2',
                  cv = 10)       # 10折交叉验证
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)
网格搜索最优得分: 0.6081303070817127
网格搜索最优参数组合:
 {'svr__C': 1000.0, 'svr__gamma': 0.001, 'svr__kernel': 'rbf'}
Wall time: 1min 25s

网格搜索的参数,修改到baseline中:

# sklearn.svm.SVR(*, kernel='rbf', degree=3, gamma='scale', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),
                         SVR(C=1000.0,kernel='rbf',gamma=0.001,epsilon=0.2
                            ))
score1 = cross_val_score(estimator=pipe_SVR,
                         X = X,
                         y = y,
                         scoring = 'r2',
                         cv = 10)       # 10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))

得到的分数:

CV accuracy: 0.610 +/- 0.249

3. 随机搜索(Randomied Search)

调用的函数:

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html?highlight=randomizedsearchcv#sklearn.model_selection.RandomizedSearchCV

随机搜索 (Random Search) 是一组不需要优化问题梯度的数值优化方法,因此RS可以被用于非连续或可微的函数。这种优化方法也被称为直接搜索、无派生或黑盒方法。Bergstra, J., & Bengio, Y。在2012年将随机搜索用于超参数优化中。

算法
使得 f: ℝn→ℝ 为适应度或成本函数,目标就是最小化f。让 x∈ℝn 指候选解的搜索空间。基本的随机搜索算法可以描述为:

  1. 在搜索空间中随机初始化x。
  2. 直到满足终止标准(例如执行的迭代次数,或达到适当的适应度),重复以下步骤:
  • 从给定半径的超球面上取一个新的位置,围绕当前位置x (参见:一个超球面取样 Marsaglia’s technique )。
  • 如果f(y) < f(x)然后通过设置x = y移动到新位置。

在这里插入图片描述

%%time
# 下面我们使用随机搜索来对SVR调参:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform  # 引入均匀分布设置参数
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),
                     ("svr",SVR())])
distributions = dict(svr__C=uniform(loc=1.0, scale=4),    # 构建连续参数的分布
                     svr__kernel=["linear","rbf"],        # 离散参数的集合
                     svr__gamma=uniform(loc=0, scale=4))

rs = RandomizedSearchCV(estimator=pipe_svr,
                        param_distributions = distributions,
                        scoring = 'r2',
                        cv = 10)       # 10折交叉验证
rs = rs.fit(X,y)
print("随机搜索最优得分:",rs.best_score_)
print("随机搜索最优参数组合:\n",rs.best_params_)
随机搜索最优得分: 0.43014407780809927
随机搜索最优参数组合:
 {'svr__C': 1.8660654868941644, 'svr__gamma': 0.022490140414510584, 'svr__kernel': 'rbf'}
Wall time: 3.94 s

随机搜索的参数,修改到baseline中:

# sklearn.svm.SVR(*, kernel='rbf', degree=3, gamma='scale', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),
                         SVR(C=1.8660654868941644,kernel='rbf',gamma=0.022490140414510,epsilon=0.2
                            ))
score1 = cross_val_score(estimator=pipe_SVR,
                         X = X,
                         y = y,
                         scoring = 'r2',
                         cv = 10)       # 10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))

得到的分数:

CV accuracy: 0.432 +/- 0.337

4. 总结

在这里插入图片描述
通过这次的学习,我初步得到如下结论:
当参数量较小且时间资源比较丰富时,参数搜索考虑网格搜索,反之,随机搜索。不过,随机搜索似乎具有不确定性,需要多次搜索才能确定较优值。

参考:
[1].https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning
[2].深度学习(花书)
[3].https://www.cnblogs.com/wj-1314/p/10422159.html
[4].https://www.jiqizhixin.com/graph/technologies/0b250c7d-d9ad-4c03-8503-c0b9e82685a3
[5].https://www.jiqizhixin.com/graph/technologies/c8b3090d-c81e-4141-a4ac-a86e193b3071

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值