20210324_23期_集成学习(上)_Task04_回归模型的评估及超参数调优

四、回归模型的评估及超参数调优

图1


来源

Datewhle23期__集成学习(上) :
https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning
作者:李祖贤、薛传雨、赵可、杨毅远、陈琰钰

论坛地址:
http://datawhale.club/t/topic/1574


1 模型调参

  • 前几部分内容是对模型算法本身进行改进,如L2正则化加入L2正则项牺牲无偏性降低方差,亦通过优化参数来提升性能,而对于正则项中的参数 λ \lambda λ,其无法通过最小二乘法或者梯度下降法等最优化算法优化

1.1 参数(parameters)和超参数(hyperparameters)

  • 参数(模型内置) : 就是模型可以根据数据可以自动学习出的变量。比如,深度学习的权重,偏差等,如参数w一样,使用最小二乘法或者梯度下降法等最优化算法优化出来的。

  • 其特征:

    • 进行预测时需要参数。
    • 它参数定义了可使用的模型
    • 参数是从数据估计或获悉的。
    • 参数通常不由编程者手动设置
    • 参数通常被保存为学习模型的一部分
    • 参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出 。
  • 超参数(模型外置): 超参数是在建立模型时用于控制算法行为的参数。这些参数不能从常规训练过程中获得。在对模型进行训练之前,需要对它们进行赋值。模型超参数是模型外部的配置,其值不能从数据估计得到。,如:学习速率,迭代次数,层数,每层神经元的个数等等。

  • 其特征:

    • 模型超参数常应用于估计模型参数的过程中。
    • 模型超参数通常由实践者直接指定
    • 模型超参数通常可以使用启发式方法来设置。
    • 模型超参数通常根据给定的预测建模问题而调整


  • 参数和超参联系:当针对特定问题调整机器学习算法时,例如在使用网格搜索或随机搜索时,你将调整模型或命令的超参数,以发现一个可以使模型预测最熟练的模型参数。许多模型中重要的参数无法直接从数据中估计得到。例如,在K近邻分类模型中…这种类型的模型参数被称为调整参数,因为没有可用的分析公式来为其计算一个合适的值。
  • 参数和超参区分:模型超参数通常被称为模型参数,这种叫法很容易让人产生误解。解决这个问题的一个很好的经验法则如下:如果你必须手动指定一个“模型参数”,那么它可能就是一个模型超参数。

1.2 调参(超参)方法

包括:

  • 传统的手工调参
  • 网格搜索
  • 随机搜索
  • 贝叶斯搜索
1.2.1 手工调参
  • 通过训练算法手动检查随机超参数集,并选择符合我们目标的最佳参数集。
  • 缺点:是不断试错的过程非常的耗时,没办法确保得到最佳的参数组合。
1.2.2 网格搜索(GridSearchCV)
  • 网格搜索是一种基本的超参数调优技术。它类似于手动调优,为网格中指定的所有给定超参数值的每个排列构建模型,评估并选择最佳模型.
  • 如KNN模型中两个超参数k_value =[2,3,4,5,6,7,8,9,10]algorithm =[' auto ', ' ball_tree ', ' kd_tree ', ' brute '],在这个例子中,它总共构建了9*4 = 36不同的模型

网格搜索可通过 sklearnGridSearchCVbest_params_ best_score_实现

1.2.3 随机搜索(RandomSearchCV)
  • 随机搜索从超参数空间中随机选择参数组合,参数由n_iter给定的固定迭代次数的情况下选择。实验证明,随机搜索的结果优于网格搜索。
  • 网格搜索相比,这有两个主要优点
    • 可以独立于参数数量和可能的值来选择计算成本。
    • 添加不影响性能的参数不会降低效率。
      在这里插入图片描述
  • 缺点:随机搜索的问题是它不能保证给出最好的参数组合。
1.2.4. 贝叶斯搜索
  • 贝叶斯优化属于一类优化算法,称为基于序列模型的优化(SMBO)算法。这些算法使用先前对损失f的观察结果,以确定下一个(最优)点来抽样f。该算法大致可以概括如下。

    • 使用先前评估的点X1*:n*,计算损失f的后验期望
    • 在新的点X的抽样损失f,从而最大化f的期望的某些方法。该方法指定f域的哪些区域最适于抽样。
  • 重复这些步骤,直到满足某些收敛准则。
    在这里插入图片描述* 通过BayesSearchCV bayesian-optimization实现

2 实例

Pipeline可用于将多个估计器链接为一个。这很有用,因为在处理数据时通常会有固定的步骤顺序,例如特征选择,归一化和分类。Pipeline在这里有多种用途:

  • 方便和封装:只需调用一次fit并在数据上进行一次predict即可拟合整个估计器序列。
  • 联合参数选择:可以一次对Pipeline中所有估计器的参数进行网格搜索(grid search )。
  • 安全性:通过确保使用相同的样本来训练转换器和预测器,Pipeline有助于避免在交叉验证中将测试数据的统计信息泄漏到经过训练的模型中。

  • SVR构建–
# SVR管道简化+10折交叉验证
from sklearn.svm import SVR
from sklearn.pipline import make_pipeline  # 管道简化学习过程
from sklearn.preprocessing import StandardScaler    #SVR需要标准化
from sklearn.model_selection import GridSearchCV # 网格搜索
from sklearn.model_selection import cross_val_scorce  # k折交叉验证
from sklearn import datasets  #数据集
import numpy as np
boston = datasets.load_boston()
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),SVR()) #管道
scorel = cross_val_score(estimator=pipe_SVR,X = X,
                        y = y,scoring = 'r2',cv = 10) #10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(scorel)),np.std(scorel)))
CV accuracy: 0.187 +/- 0.649

2.1 网格搜索+通道

#网格搜索调参
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"]},  # 线性核函数  超参数C 字典形式  双下划线
              {"svr__C":param_range,"svr__gamma":param_range,   # RBF核函数  超参数C和gamma
               "svr__kernel":["rbf"]}]
gs = GridSearchCV(estimator=pipe_svr,
                 param_grid = param_grid,
                 scoring = 'r2',
                 cv = 10)
gs = gs.fit(X,y)
print("网格分数:",gs.best_score_)
print("网格搜索参数组合:\n",gs.best_params_)
网格分数: 0.6081303070817479
网格搜索参数组合:
 {'svr__C': 1000.0, 'svr__gamma': 0.001, 'svr__kernel': 'rbf'}

2.2 随机搜索+通道

#随机搜索
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)

rs = rs.fit(X,y)
print("随机得分:",rs.best_score_)
print("随机参数组合:\n",rs.best_params_)
随机得分: 0.30110052905714274
随机参数组合:
 {'svr__C': 1.3587735808488324, 'svr__gamma': 0.5207223802134955, 'svr__kernel': 'linear'}

2.3 贝叶斯

  • 贝叶斯参数设置没弄对 ,待续

参考资料

  1. https://cloud.tencent.com/developer/article/1701823机器学习模型调参指南(附代码)
  2. https://cloud.tencent.com/developer/article/1005660参数和超参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值