超参数调优之网格搜索

1. 背景&预备知识

近期小编写程序的时候,遇到了实验次数非常多的情况(事实上,一篇好的paper通常都是要经过非常多次的实验),比如说有10种不同的输入变量组合,要在10个城市上用4种模型进行建模,这样就有4 * 10 * 8 = 320种组合。如果每一种情况我们都进行手工调优的话,那将花费极大的时间和精力,而且手动调优并不一定能得到满意的效果。今天小编就同大家一起学习一下参数调优中的网格搜索方法,以便更好地解决上述问题。

什么是超参数?

超参数是在训练模型之前就要设置的参数,而不是通过训练得到的参数。举个例子来说,神经网络的隐层数和每层的节点数就是超参数,因为其需要在模型训练前就设定好。而两层神经元之间的权重就不是超参数,因为其随着每一轮迭代而不断更新。

什么是网格搜索?

网格搜索是一种常见的参数调优方法,其根本目的是通过遍历不同的超参数组合,达到模型最优化的效果。比如支持向量机中使用rbf核的情况下,C的调优范围设置为[1, 10, 100],gamma的范围设置为[0.001, 0.0001],那么超参数就有3 * 2 = 6种组合,网格搜索就是遍历这六种组合,找到其中模型表现最好的超参数的值。当然,因为网格搜索是基于遍历的思想,所以当参数空间比较大的时候,模型表现好的同时会牺牲很多的训练时间,所以也会有随机搜索的方法,后续我们会慢慢讲到~

什么是k折交叉验证?

把数据集分成K份,每个子集互不相交且大小相同,依次从K份中选出1份作为验证集,其余K-1份作为训练集,这样进行K次单独的模型训练和验证,最后将K次验证结果取平均值,作为此模型的验证误差。

为什么要划分验证集,直接用测试集调优不行吗?

如果根据测试集上的模型表现来选取超参数的话,可能会得到过度拟合于测试集的超参数,模型泛化能力会降低。如果借助验证集进行超参数选取,并在测试集上测试模型表现的话就能防止上述问题。

2. sklearn中的网格搜索方法

使用常见的机器学习模型时,我们通常会选用sklearn这个库(深度学习时一般不用sklearn,会用keras、pytorch、tensorflow)。

使用网格搜索时,我们需要先从sklearn中调用GridSearchCV这个类。

from sklearn.model_selection import GridSearchCV, KFold

class sklearn.model_selection.GridSearchCV(estimator, param_grid,  scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs', error_score=nan, return_train_score=False)

GridSearchCV中的参数如下:

  • estimator:可以理解为一个模型框架吧,比如说用支持向量回归就是svr(),多层感知机就是MLPRegressor(),随机森林就是RandomForestRegressor(),当然这里也可以是一些其他的分类器。

  • param_grid:这里一般以字典或者列表形式传入,内容是参数名+参数空间,比如 'C': [1,3,5,7,9,15,20,25,30,40,50,100,200]

  • cv:交叉验证方法,这里通常选用k折交叉验证

  • scoring:测试集中评估交叉验证模型性能的策略

3. 网格搜索程序实现

随机森林

# 调用随机森林回复器、网格搜索和k折交叉验证类 
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV, KFold

# 设置需要调优的超参数 (可以通过RandomForestRegressor().get_params()查看有哪些超参数)
parameters = {'max_depth': range(1, 20),
              'n_estimators': range(1, 20)}

# 调用10折交叉验证
kfold = KFold(n_splits=10)

# 设置estimator
forest = RandomForestRegressor()

# 训练集上进行网格搜索
grid = GridSearchCV(forest, parameters, scoring='r2', cv=kfold)
grid = grid.fit(x_train, y_train)

# 查看最优参数
reg = grid.best_estimator_
print('best score: %f'%grid.best_score_)
print('best parameters:')
for key in parameters.keys():
    print('%s: %d'%(key, reg.get_params()[key]))

print('test score: %f'%reg.score(x_test, y_test))

# 将最优参数传入estimator,获取最优模型
forest = RandomForestRegressor(max_depth=reg.get_params()['max_depth'], n_estimators=reg.get_params()['n_estimators'])

支持向量回归(除了模型其余程序都是类似的)

from sklearn.svm import SVR
param_grid = [
  {'kernel': ['linear'], 'C': [1,3,5,7,9,15,20,25,30,40,50,100,200]},
  {'kernel': ['rbf'], 'C': [1,3,5,7,9,15,20,25,30,40,50,100,200], 'gamma': [0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009]},
]

kfold = KFold(n_splits=10)
svr = SVR()
grid = GridSearchCV(svr, parameters, scoring='r2', cv=kfold)
grid = grid.fit(x_train, y_train)

神经网络(除了模型其余程序都是类似的)

from sklearn.neural_network import MLPRegressor
parameters = {'hidden_layer_sizes': [(4,4),(5,5),(6,6),(7,7),(8,8),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8)]}
kfold = KFold(n_splits=10)
ann = MLPRegressor(solver='lbfgs', alpha=0.5, activation='relu', max_iter=2000)
grid = GridSearchCV(ann, parameters, scoring='r2', cv=kfold)
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
传统SVM模型网格搜索法是一种用于SVM模型参数调优的方法。它通过在预先定义的参数组合网格中进行交叉验证来选择最优参数,以提高SVM模型的性能。该方法的主要步骤如下: 1. 首先,我们需要定义SVM模型中需要调优的参数。通常包括核函数类型、惩罚参数C和Gamma等。将这些参数的候选值组成一个参数网格。 2. 然后,通过交叉验证来评估不同参数组合下的模型性能。交叉验证将数据集分成K个折(通常为5或10),每次选择其中一部分为验证集,其余部分为训练集。 3. 接下来,对于每个参数组合,在每个交叉验证折上训练SVM模型,并使用验证集评估该参数组合下的模型性能。通常使用准确率、精确率、召回率或F1-score等指标来评估模型性能。 4. 根据评估指标,选择性能最好的参数组合作为SVM模型的最优参数。 5. 最后,使用最优参数重新在整个数据集上训练SVM模型,并进行测试验证,以评估模型的最终性能。 传统SVM模型网格搜索法的优点是简单易用,对于小规模数据集有较好的表现。然而,对于大规模数据集或者参数较多的情况下,网格搜索法的计算复杂度较高,会导致搜索时间过长。此外,该方法只能搜索预定义参数网格中的参数组合,可能会忽略一些边缘的参数取值,限制了搜索范围。 为了解决这些问题,研究者已经提出了一些改进方法,如随机搜索、贝叶斯优化等,以提高参数搜索的效率和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xifenglie123321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值