1 超参数优化


调参即超参数优化,是指从超参数空间中选择一组合适的超参数,以权衡好模型的偏差(bias)和方差(variance),从而提高模型效果及性能。常用的调参方法有:

  • 人工手动调参
  • 网格/随机搜索(Grid / Random Search)
  • 贝叶斯优化(Bayesian Optimization)

注:超参数 vs 模型参数差异
超参数是控制模型学习过程的(如网络层数、学习率);
模型参数是通过模型训练学习后得到的(如网络最终学习到的权重值)。

2 人工调参

手动调参需要结合数据情况及算法的理解,优化调参的优先顺序及参数的经验值。

不同模型手动调参思路会有差异,如随机森林是一种bagging集成的方法,参数主要有n_estimators(子树的数量)、max_depth(树的最大生长深度)、max_leaf_nodes(最大叶节点数)等。(此外其他参数不展开说明)
对于n_estimators:通常越大效果越好。参数越大,则参与决策的子树越多,可以消除子树间的随机误差且增加预测的准度,以此降低方差与偏差。
对于max_depth或max_leaf_nodes:通常对效果是先增后减的。取值越大则子树复杂度越高,偏差越低但方差越大。

3 网格/随机搜索

  • 网格搜索(grid search),是超参数优化的传统方法,是对超参数组合的子集进行穷举搜索,找到表现最佳的超参数子集。
  • 随机搜索(random search),是对超参数组合的子集简单地做固定次数的随机搜索,找到表现最佳的超参数子集。对于规模较大的参数空间,采用随机搜索往往效率更高。
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier# 选择模型
model = RandomForestClassifier()
# 参数搜索空间
param_grid = {'max_depth': np.arange(1, 20, 1),'n_estimators': np.arange(1, 50, 10),'max_leaf_nodes': np.arange(2, 100, 10)}
# 网格搜索模型参数
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='f1_micro')
grid_search.fit(x, y)
print(grid_search.best_params_)
print(grid_search.best_score_)
print(grid_search.best_estimator_)
# 随机搜索模型参数
rd_search = RandomizedSearchCV(model, param_grid, n_iter=200, cv=5, scoring='f1_micro')
rd_search.fit(x, y)
print(rd_search.best_params_)
print(rd_search.best_score_)
print(rd_search.best_estimator_)

4 贝叶斯优化

贝叶斯优化(Bayesian Optimization)与网格/随机搜索最大的不同,在于考虑了历史调参的信息,使得调参更有效率。(高维参数空间下,贝叶斯优化复杂度较高,效果会近似随机搜索。)

4.1 算法简介

贝叶斯优化思想简单可归纳为两部分:

  • 高斯过程(GP):以历史的调参信息(Observation)去学习目标函数的后验分布(Target)的过程。

  • 采集函数(AC): 由学习的目标函数进行采样评估,分为两种过程: 1、开采过程:在最可能出现全局最优解的参数区域进行采样评估。 2、勘探过程:兼顾不确定性大的参数区域的采样评估,避免陷入局部最优。

4.2 算法流程

for循环n次迭代:采集函数依据学习的目标函数(或初始化)给出下个开采极值点 Xn+1;评估Xn+1得到Yn+1;加入新的Xn+1、Yn+1数据样本,并更新高斯过程模型;

"""
随机森林分类Iris使用贝叶斯优化调参
"""
import numpy as np
from hyperopt import hp, tpe, Trials, STATUS_OK, Trials, anneal
from functools import partial
from hyperopt.fmin import fmin
from sklearn.metrics import f1_score
from sklearn.ensemble import RandomForestClassifierdef model_metrics(model, x, y):""" 评估指标 """yhat = model.predict(x)return  f1_score(y, yhat,average='micro')def bayes_fmin(train_x, test_x, train_y, test_y, eval_iters=50):"""bayes优化超参数eval_iters:迭代次数"""def factory(params):"""定义优化的目标函数"""fit_params = {'max_depth':int(params['max_depth']),'n_estimators':int(params['n_estimators']),'max_leaf_nodes': int(params['max_leaf_nodes'])}# 选择模型model = RandomForestClassifier(**fit_params)model.fit(train_x, train_y)# 最小化测试集(- f1score)为目标train_metric = model_metrics(model, train_x, train_y)test_metric = model_metrics(model, test_x, test_y)loss = - test_metricreturn {"loss": loss, "status":STATUS_OK}# 参数空间space = {'max_depth': hp.quniform('max_depth', 1, 20, 1),'n_estimators': hp.quniform('n_estimators', 2, 50, 1), 'max_leaf_nodes': hp.quniform('max_leaf_nodes', 2, 100, 1)}# bayes优化搜索参数best_params = fmin(factory, space, algo=partial(anneal.suggest,), max_evals=eval_iters, trials=Trials(),return_argmin=True)# 参数转为整型best_params["max_depth"] = int(best_params["max_depth"])best_params["max_leaf_nodes"] = int(best_params["max_leaf_nodes"])best_params["n_estimators"] = int(best_params["n_estimators"])return best_params#  搜索最优参数
best_params = bayes_fmin(train_x, test_x, train_y, test_y, 100)
print(best_params)

文章首发于算法进阶,公众号阅读原文可访问GitHub源码

一文归纳Ai调参炼丹之法相关推荐

  1. 【机器学习基础】一文归纳AI调参炼丹之法

    1  超参数优化 调参即超参数优化,是指从超参数空间中选择一组合适的超参数,以权衡好模型的偏差(bias)和方差(variance),从而提高模型效果及性能.常用的调参方法有: 人工手动调参 网格/随 ...

  2. 一文掌握模型调参神器:Hyperopt

    hyperopt是一个Python库,主要使用 ①随机搜索算法 ②模拟退火算法 ③TPE算法 来对某个算法模型的最佳参数进行智能搜索,它的全称是Hyperparameter Optimization. ...

  3. AI调参师会被取代吗?对话AutoML初创公司探智立方

    1955 年,约翰·麦卡锡(John McCarthy).马文·闵斯基(Marvin Minsky).克劳德·香农(Claude Shannon)等人聚在一起,为第二年即将召开的具有重要历史意义的&q ...

  4. 各路丹师 调参[炼丹]经验小结

    作者:hzwer 链接:https://www.zhihu.com/question/41631631/answer/859040970 来源:知乎 总结一下在旷视实习两年来的炼丹经验,我主要做了一些 ...

  5. 【机器学习】一文归纳AI数据增强之法

    数据.算法.算力是人工智能发展的三要素.数据决定了Ai模型学习的上限,数据规模越大.质量越高,模型就能够拥有更好的泛化能力.然而在实际工程中,经常有数据量太少(相对模型而言).样本不均衡.很难覆盖全部 ...

  6. 【机器学习基础】一文归纳AI数据增强之法

    数据.算法.算力是人工智能发展的三要素.数据决定了Ai模型学习的上限,数据规模越大.质量越高,模型就能够拥有更好的泛化能力.然而在实际工程中,经常有数据量太少(相对模型而言).样本不均衡.很难覆盖全部 ...

  7. 随机森林算法及贝叶斯优化调参Python实践

    1. 随机森林算法 1.1. 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果. 集成学习模型的常见算 ...

  8. 【PID控制】几种调参方法的比较 (含计算代码)

    ⭐⭐几种整定方法总结(含参数计算代码)⭐⭐ PID 参数整定方法 临界比例度法 (Ziegle-Nichols算法 齐格勒尼科尔斯整定方法) 适用条件 主要原理 PID控制器类型的选择 开环阶跃响应曲 ...

  9. 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...

    来源:凹非寺 机器学习全靠调参?这个思路已经过时了. 谷歌大脑团队发布了一项新研究: 只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务. 这样的网络叫做WANN,权重不可知神经网络. 它 ...

最新文章

  1. java的byte与C#的异同引起的字符处理问题。
  2. 给研发工程师的代码质量利器 | SOFAChannel#5 直播整理
  3. 【亲测】在网页上查找接口,Network--XHR,出来的每个Name都是后台的一个接口
  4. linux文件系统的移植-制作JFFS2文件系统
  5. 后盾网lavarel视频项目---laravel 使用laracasts/flash插件提示信息
  6. 关于Django将数据映射到Html中的操作
  7. php增加数量,php – 更新列数量
  8. CSS设置文字的划线
  9. Windows 钩子的使用
  10. 485通信自动收发电路,历史上最详细的解释
  11. click vue 重复调用_VUE防止多次点击,重复请求
  12. 开课吧:C++语言基础以及应用领域有哪些?
  13. 字符指针变量和字符数组的对比
  14. 2020华为软挑成渝赛区初赛复赛方案分享
  15. 乐森 扫地机器人_扫地机器人到底好用不好用?
  16. 机器学习——需求预测——准确性(误差)统计——MAE、MSE、MAPE、WMAPE
  17. android为什么会用流量,手机流量为什么会偷跑?
  18. Unity 3D模型展示之webGL平台展现
  19. 基于微信小程序付费自习室系统(微信小程序毕业设计)
  20. 八皇后问题(Java代码实现)

热门文章

  1. Poi导出excel文件提示由于一些内容不可读取,Excel无法打开
  2. Centos搭建服务
  3. KerberosSDR新手入门测试
  4. “您希望继续执行吗? [Y/n] y 中止。”
  5. Git用户手册--GitHub
  6. 详细说明VScode设置中文,主题更改,文件图标及字体设置
  7. 二、Eureka之server端集群节点发现,数据同步
  8. java五子棋棋盘_java绘制五子棋棋盘代码示例
  9. 计算广告CTR预估系列(十)--AFM模型理论与实践
  10. 升级云服务器的python3,导致宝塔面板打不开