sklearn超参数选择

本篇文章主要介绍在sklearn中采用GridSearchCV和RandomizedSearchCV进行超参数选择。

一、超参数介绍:
1,超参数:在模型训练中,有些参数不能通过对数据进行学习得到,这种参数叫做超参数。比如,神经网络的层数,每层的神经元数量等。

2,超参数的重要性: 在做参数数的选择时计算量是很大的,为了节省开销,我们可以对模型的超参数进行分类,分为:重要,次重要,不重要。这种分类方法很直观,也是个人分类观点。具体得到重要程度可以通过改变该超参数观察对模型的影响程度。

二、超参数的网格搜索: 网格搜索就是提前设置参数的可以选取的值,然后在对于每个选择情况下训练,选取最好的情况。适合数据量小的时候。

GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化(按重要程度进行坐标下降)。

from sklearn.model_selection import GridSearchCV
from sklearn import svm,datasets
def gs():
    def gs():
    iris = datasets.load_iris()
    parameters = {'kernel':('rbf','linear'),'C':(1,2,3)}#超参数选择空间
    svr = svm.SVC()

    clf = GridSearchCV(svr,parameters)

    clf.fit(iris.data,iris.target)
    print(clf.best_estimator_)#最好的模型
    print(clf.best_score_)#最好模型的得分
    print(clf.best_params_)#最好模型的参数

三、随机搜索: 就是给定参数可以选择的分布,然后在分布中随机搜索一些参数进行训练,适合在数据量很大的时候。
RandomizedSearchCV模型训练后的结果cv_results_ 包含我们每次随机搜索参数得到的模型信息。

import numpy as np
from time import time
from scipy.stats import randint as sp_randint
from sklearn.model_selection import RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.ensemble import RandomForestClassifier

def report(results, n_top=3):#搜索结果展示
    for i in range(1, n_top + 1):
        candidates = np.flatnonzero(results['rank_test_score'] == i)
        for candidate in candidates:#可能有名次并列的模型
            print("Model with rank:{0}".format(i))
            print("Mean validation score:{0:.3f}(std:{1:.3f})".format(
                results['mean_test_score'][candidate],
                results['std_test_score'][candidate]))
            print("Parameters:{0}".format(results['params'][candidate]))
            print("")

def rs():
    digis = load_digits()
    X, y = digis.data, digis.target

    clf = RandomForestClassifier(n_estimators=20)
    # 设置想要优化的超参数以及他们的取值分布
    param_dist = {"max_depth": [3, None],
                  "max_features": sp_randint(1, 11),
                  "min_samples_split": sp_randint(2, 11),
                  "min_samples_leaf": sp_randint(1, 11),
                  "bootstrap": [True, False],
                  "criterion": ['gini', 'entropy']
                  }#同样需要设置参数空间,不同的是有的参数是一个分布
    # 开启超参数空间的随机搜索
    n_iter_search = 20#随机搜索的次数,也就是建立了多少个模型
    random_search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=n_iter_search)
    start = time()
    random_search.fit(X, y)
    print("RandomizedSearchCV took %.3f seconds for %d candidates"
          "parameter settings." % ((time() - start), n_iter_search))
    report(random_search.cv_results_)#cv_results_里面包括每次迭代得到的模型信息,常用信息:rank_test_score(模型得分排名,可能有并列)、mean_test_score(模型的测试得分)、params(模型的参数)

四、工程中的超参数选择:
1,这里给出一点经验:在实践中,我们一般根据超参数的重要程度,对重要和次重要的参数先进行优化。具体优化的过程中并不是纯粹采用网格和随机,而是采用一种迭代的思想进行:现在一个大的范围里面进行粗粒度的网格或者随机搜索,然后在表现良好的区域内进行更加细粒度的网格或者随机搜索。具体迭代次数,达到你想要的结果为止。

2,以网格搜索举个例子,我们对超参数a进行选择,开始根据经验a的取值范围在[1,100]中:
第一次迭代(网格):a的取值可以(1,20,40,60,80,100)中搜索,发现a在[40,60]范围的结果最好
第二次迭代(网格):a的取值可以(40,45,50,55,60)中搜索,发现a在[45,50]范围的结果最好
重复,直到满意。

3,每次跌打的过程可以是网格搜索,也可以随机搜索。

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值