模型优化调参方法介绍(Python代码)

news/2024/11/24 3:43:26/

模型算法在机器学习和深度学习中都发挥着自己的作用,但往往训练出来的模型效果不佳或稳定性不强,就需要对模型进行调优。一般来说,会从以下几个角度来优化模型。

1.优化数据维度

在需要对原始需求进行理解、准确定义好坏样本的前提下,充分优化数据,丰富数据维度才能提高模型的效果,毕竟数据决定模型的上限,而模型仅是逼近这个上限。

  • 丰富数据资源,引入更多的三方数据加入到模型训练中
  • 优化特征组合生成新的变量,不同维度的特征交叉衍生、对数转换、指数转换、标准化等。

2.模型参数调优

目前主流的参数优化方法如下几种:

  1. 手动调参 Manual adjustment
  2. 网格搜索 Grid Search
  3. 随机搜索Random Search
  4. 贝叶斯优化 Bayesian Optimization
  5. 进化算法优化 Evolutionary Algorithms
  6. 基于元学习的参数优化 Meta Learning
  7. 基于迁移学习的参数优化 Transfer Learning

3.代码示例

3.1.手动调参
max_dep = list(range(3, 7))
splits = list(range(5, 11, 5))
scores = []
best_comb = []
kfold = KFold(n_splits=5)# tunning
for m in max_dep:for n in splits:rf = RandomForestClassifier(n_estimators=1000,criterion='gini',max_depth=m,min_samples_split=n)results = cross_val_score(rf, train_x, train_y, cv=kfold)print(f'Score:{round(results.mean(),4)} , max_depth = {m} , min_samples_split = {n}')scores.append(results.mean())best_comb.append((m, n))best_param = best_comb[scores.index(max(scores))]
print(f'\nThe Best Score : {max(scores)}')
print(f"['max_depth': {best_param[0]}, 'min_samples_split': {best_param[1]}]")

在这里插入图片描述

  • 优点:
    (1)简单方便,灵活
  • 缺点:
    (1)没办法确保得到最佳的参数组合
3.2 网格搜索

网格搜索是一种基本的超参数调优技术。它类似于手动调优,为网格中指定的所有给定超参数值的每个排列构建模型,评估并选择最佳模型。考虑上面的例子,其中两个超参数 max_depth =[3,4,5,6] & min_samples_split =[5,10],在这个例子中,它总共构建了4*2 = 8不同的模型。

from sklearn.model_selection import GridSearchCVdef grid_search(model, param, x, y):grid = GridSearchCV(rf, grid_param, cv=5)grid.fit(train_x, train_y)print('best parameter combination\n', grid.best_params_)print('score achieved with best parameter combination\n', grid.best_score_)print('all combinations of hyperparameters\n', grid.cv_results_['params'])print('average scores of cross-validation\n', grid.cv_results_['mean_test_score'])return grid.best_params_grid_param = {'max_depth': list(range(3, 7)),'min_samples_split': [5, 10]}
# tuning
grid_search(rf, grid_param, train_x, train_y)

在这里插入图片描述

  • 优点:
    (1)能够把所有给定超参数值排列组合,寻找到最佳参数
  • 缺点:
    (2)由于所有的组合都需学习,并且交叉验证,所以训练的非常慢。
    (3)调参过程中未考虑之前的参数信息
    (4)参数设置不合理,易得到局部最优
3.3 随机搜索

使用随机搜索代替网格搜索的动机是,在许多情况下,所有的超参数可能不是同等重要的。随机搜索从超参数空间中随机选择参数组合,参数由n_iter给定的固定迭代次数的情况下选择。实验证明,随机搜索的结果优于网格搜索。

from sklearn.model_selection import RandomizedSearchCVdef random_search(model, param, x, y):rand_search = RandomizedSearchCV(model, param, cv=5, n_iter=10)rand_search.fit(x, y)print('best parameter combination\n', rand_search.best_params_)print('score achieved with best parameter combination\n', rand_search.best_score_)print('all combinations of hyperparameters\n', rand_search.cv_results_['params'])print('average scores of cross-validation\n', rand_search.cv_results_['mean_test_score'])return rand_search.best_params_rscv_param = {'max_depth': list(range(3, 7)),'min_samples_split': [5, 10]}
# tuning
random_search(rf, rscv_param, train_x, train_y)

在这里插入图片描述

  • 优点:
    (1)随机把所有给定超参数值排列组合,寻找到最佳参数
  • 缺点:
    (1)不能保证给出最好的参数组合,易得到局部最优
3.4 贝叶斯搜索

贝叶斯优化属于一类优化算法,称为基于序列模型的优化(SMBO)算法。这些算法使用先前对损失f的观察结果,以确定下一个(最优)点来抽样f。主要步骤概括如下:
(1)使用先前评估的点X1*:n*,计算损失f的后验期望。
(2)在新的点X的抽样损失f,从而最大化f的期望的某些方法。该方法指定f域的哪些区域最适于抽样。
(3)重复这些步骤,直到满足某些收敛准则。

from skopt import BayesSearchCVdef bayes_search(model, param, x, y):bay_search = BayesSearchCV(model, param, n_iter=30)bay_search.fit(x, y)print('best parameter combination\n', bay_search.best_params_)print('score achieved with best parameter combination\n', bay_search.best_score_)print('all combinations of hyperparameters\n', bay_search.cv_results_['params'])print('average scores of cross-validation\n', bay_search.cv_results_['mean_test_score'])return bay_search.best_params_bayes_param = {'max_depth': list(range(3, 7)),'min_samples_split': [5, 10]}
# tuning
bayes_search(rf, bayes_param, train_x, train_y)

在这里插入图片描述

  • 优点:
    (1)调参过程中考虑了之前的参数信息,不断地更新先验信息
    (2)迭代次数少,训练速度快
    (3)对非凸问题依然稳健的效果
  • 缺点:
    (1)对参数很敏感,易低估不确定性
    (2)要在2维或3维的搜索空间中得到一个好的代理曲面需要十几个样本,增加搜索空间的维数需要更多的样本。

http://www.ppmy.cn/news/1001446.html

相关文章

tomcat和nginx的日志记录请求时间

当系统卡顿时候,我们需要分析时间花费在哪个缓解。项目的后端接口可以记录一些时间,此外,在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户,请求时间,响应时间的数据,可以提供更多的信息以便于排…

二叉树的中序遍历 LeetCode热题100

题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 思路 递归,按左中右的顺序添加节点。 利用栈先进后出的特性模拟递归。 代码 /**递归写法* Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left…

Linux 查看磁盘空间

1 查看当前目录的总大小 :du -sh ps:du(disk usage) 2 查看某个目录的总大小:du -sh 目录名 du后面可以跟的参数含义: -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。-h &#xff…

亚马逊引流方式有哪些

亚马逊引流是指将潜在的买家从其他渠道引导到亚马逊平台上购买产品。以下是一些常见的亚马逊引流方式: 1、社交媒体营销:通过社交媒体平台如Facebook、Instagram、Twitter等发布有关你产品的信息、广告和优惠活动。吸引潜在客户点击链接,直接…

Windows——降权启动程序

作者:小 琛 欢迎转载,请标明出处 应用场景:运行的程序本身为管理员权限,此时需要启动一个新的程序,该程序需要以普通权限启动。 思路: 使用 CreateProcessAsUser 或 CreateProcessWithLogonW 等函数创建一个…

vscode添加自定义的用户代码片段

在vscode中添加代码片段 选择“新建全局代码片段文件,然后输入文件名(随便输入) 然后会生成文件,安装文件中的Example就可以添加代码片段 里面各个字段的含义: "Print to console:代码片段的名称&…

Vue axios + Vue使用

相对于原生的阿贾克斯,axios提供的方法使用起来会更加的简便,之前网络数据获取到了,如何和vue一起使用呢? 网络应用的核心就是data中的数据一部分是通过网络获取到的。所以在方法当中发起网络请求,在响应回来之后将服…

Springboot整合activiti5,达梦数据库,mybatis中间件

Springboot整合activiti5,达梦数据库,mybatis中间件 问题现象解决方案 问题现象 由于工作流引擎不支持达梦数据库以及国产中间件,所以我们引入的时候会报错,这个时候就需要去改造代码和配置文件。各种文档和资料查找一天&#xf…