一、网格搜索

1. 超参数的定义

在机器学习中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。

比如在使用梯度下降法的神经网络中,学习率alpha就是一个超参数。

通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。

2.什么是网格搜索

了解了超参数的定义,网格搜索就可以很容易理解。

简单来讲,网格搜索是一种调参手段,一般是调超参数。它利用的是一种十分简单暴力的方法:穷举搜索。在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。当然这里候选的参数还是要人为地给出。

比如在SVC模型中我们有C和gamma两个超参数。它们的候选集如下:

在这里插入图片描述
我们看到不同的参数组合形成了一张表,每一格子代表了一组参数。遍历所有格子的参数的过程就是网格搜索,这正是网格搜索名字的来源。

3.网格搜索实现

基于网格搜索的简单逻辑,我们可以很容易实现,并找到最好的超参数。

####   grid search start
best_score = 0
for gamma in [0.001,0.01,0.1,1,10,100]:
    for C in [0.001,0.01,0.1,1,10,100]:
        svm = SVC(gamma=gamma,C=C)#对于每种参数可能的组合,进行一次训练;
        svm.fit(X_train,y_train)
        score = svm.score(X_test,y_test)
        if score > best_score:#找到表现最好的参数
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
####   grid search end

事实上,在sklearn里面实现了网格搜索的模块,我们使用时可以直接调用。这也是考虑到当参数较多时,需要写多个for,较为累赘。

下面是一个使用网格搜索找到Lasso回归的最好的参数的例子。

from sklearn.linear_model import Lasso
from sklearn.model_selection import GridSearchCV
parameters= {'alpha':[0.0001,0.0009,0.001,0.002,0.003,0.01,0.1,1,10,100]}

lasso=Lasso()
lasso_reg=GridSearchCV(lasso, param_grid=parameters, scoring='neg_mean_squared_error', cv=15)
lasso_reg.fit(x_train,y_train)

print('The best value of Alpha is: ',lasso_reg.best_params_)

GridSearchCV的各参数解释如下:

GridSearchCV(
  estimator,  #估计器,即模型
  param_grid,  #参数网格
  scoring=None, #评分方法
  n_jobs=None,  #并行的作业数,不常用
  refit=True,  是否refit最优参数的estimator
  cv=None,   设定几折交叉验证,None的话采用5折交叉验证
  verbose=0,  是否显示处理过程的信息,数值越高,信息越多
  pre_dispatch=‘2*n_jobs’,  控制并行期间分派的作业数量执行。减少这个数字可以有效地避免分配更多作业时内存消耗激增,比cpu能处理的还要多。
  error_score=np.nan,  当错误发生时的评分
  return_train_score=False 如果为“False”,“cv_results_”属性将不包括训练分数。计算训练分数是为了了解不同的参数设置如何影响过拟合/不拟合的权衡。然而,计算训练集上的分数可能会有很高的计算成本,并且不需要严格地选择能产生最佳泛化性能的参数。 )

最后我们可以通过lasso_reg.best_params_查看最好的参数。

二、交叉验证 Cross Validation

事实上,GridSearchCV中的CV就是指的是Cross Validation,即交叉验证。

那什么是交叉验证呢?

1.简单的交叉验证

简单的交叉验证就是将训练数据进一步划分为训练集和验证集,使用验证集调整模型的超参数和用于对模型能力进行初步的评估。
在这里插入图片描述

值得注意的是调整模型的超参数这一个作用,在网格搜索的交叉验证没有体现。这里验证集的作用是进行评估。

那一般什么情况下可以用交叉验证调整模型的超参数?
 一般来讲调整模型的超参数是在确定了一组初始参数后,在训练过程中人工的去调整。
 一般在训练时,几个epochs结束后会跑一次验证集看看效果。(注意epochs的个数,验证得太频繁会影响训练速度)
 这样做的第一个好处是,可以及时发现模型或者参数的问题,比如mAP不增长或者增长很慢等情况,这时可以及时终止训练,重新调参或者调整模型,而不需要等到训练结束。一般来讲,我们会隔一段时间保存神经网络的参数,称之为checkpoints,当我们中止训练后重新开始的时候,可以从checkpoints中恢复网络的权重,并且以根据验证集的情况进行调整后的超参数进行训练。
 另外一个好处是验证模型的泛化能力,如果在验证集上的效果比训练集上差很多,就该考虑模型是否过拟合了。当察觉到有过拟合的倾向是,我们可以停止训练,这种策略称之为早停(Early Stopping)。同时,还可以通过验证集对比不同的模型。在一般的神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;

关于训练集、验证集、测试集:详见这里

简单交叉验证的优缺点:
(1)优点:
 处理简单,只需随机把原始数据分为两组即可

(2)缺点:
 但没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,得到的结果并不具有说服性。

2.多折交叉验证

上面我们提到5折交叉验证,下面介绍它是怎样的交叉验证。

K折交叉验证(K-fold Cross Validation, K-CV)
在这里插入图片描述
将原始训练集均分为K组,让每一个子集都做一次验证集,其余的K-1个子集作为训练集。这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2。

3.留一交叉验证(Leave-One-Out Cross Validation, LOO-CV)

在数据缺乏的情况下使用,如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,故LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。

LOO-CV的优缺点
(1)优点:
 i.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
 ii.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

(2)缺点:
 i.计算成本高,需要建立的模型数量与原始数据样本数量相同。当数据集较大时几乎不能使用。

三、参考资料

【1】https://blog.csdn.net/weixin_40475450/article/details/80578943
【2】https://www.jianshu.com/p/55b9f2ea283b

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐