使用网格搜索(GridSearchCV)自动调参

使用网格搜索(GridSearchCV)自动调参

描述

调参对于提高模型的性能十分重要。在尝试调参之前首先要理解参数的含义,然后根据具体的任务和数据集来进行,一方面依靠经验,另一方面可以依靠自动调参来实现。

Scikit-learn 中提供了网格搜索(GridSearchCV)工具进行自动调参,该工具自动尝试预定义的参数值列表,并具有交叉验证功能,最终找到最佳的参数组合。

本任务的主要实践内容:

1、 使用手工枚举来调参

2、 利用GridSearchCV自动调参

添加链接描述

环境

  • 操作系统:Windows10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	  0.24.2
    

分析

本任务采用SVM算法对鸢尾花数据集进行建模,实践调参过程。任务涉及以下环节:

1)使用手工枚举来确定最佳参数组合

2)拆分出验证集进行调参

3)使用GridSearchCV进行自动调参,确定最佳参数组合

实施

步骤1、使用手工枚举进行调参

首先使用支持向量机(SVM)建立鸢尾花分类模型,模型主要参数为gamma和C,我们使用循环枚举的方式进行调参,具体过程为:

1、定义gamma和C两个参数的取值列表

2、定义循环,使用不同的参数组合创建模型并评估成绩

3、取最佳成绩的参数组合

from sklearn.svm import SVC 
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris 

iris = load_iris() # 加载数据
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0) 
 
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).fit(X_train, y_train) 
        score = svm.score(X_test, y_test) # 在测试集上评估SVC
        # 如果得到了更高的分数,则保存该分数和对应的参数         
        if score > best_score:             
            best_score = score             
            best_parameters = {'C': C, 'gamma': gamma} 
 
print("Best score: {:.2f}".format(best_score))  # 输出最佳成绩
print("Best parameters: {}".format(best_parameters)) # 输出最佳参数组合

输出结果:

Best score: 0.97
Best parameters: {'C': 100, 'gamma': 0.001}

可以看到,最佳成绩为97%,最佳组合为 {‘C’: 100, ‘gamma’: 0.001}

步骤2、拆分出验证集用于调参

如果模型调参在测试集上进行,就不能保证测试的客观性(相当于练习题与考试题不分),因此调参时需要拆分出独立的验证集,在验证集上调参,而测试集专门用于最终测试,即测试集不参与训练和调参过程。

2.1 拆分方法:

# 首先,将数据拆分为(训练+验证集)与测试集 
X_train_valid, X_test, y_train_valid, y_test = train_test_split(iris.data, iris.target, random_state=0) 

# 然后,将(训练+验证集)拆分为训练集与验证集 
X_train, X_valid, y_train, y_valid = train_test_split(X_train_valid, y_train_valid, random_state=1) 

2.2 拆分出验证集后,在验证集上进行调参,代码如下:

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).fit(X_train, y_train) 
        score = svm.score(X_valid, y_valid) # 注意!这里改为在验证集上评估模型    
        if score > best_score:             
            best_score = score             
            best_parameters = {'C': C, 'gamma': gamma} 

print("Training_set size: {} , Validation_set size: {} , Test_set size: {}"
      .format(X_train.shape[0], X_valid.shape[0], X_test.shape[0])) 

# 利用调参得到的最佳参数组合,在(训练+验证集)上重新构建一个模型,并在测试集上进行评估 
svm = SVC(**best_parameters) 
svm.fit(X_train_valid, y_train_valid) 
test_score = svm.score(X_test, y_test) # 测试集只用做最终评估,不参与调参,保证测试的客观性

print("Best score on validation_set: {:.2f}".format(best_score)) 
print("Best parameters: ", best_parameters) 
print("Test_set score with best parameters: {:.2f}".format(test_score)) # 输出测试成绩

输出结果:

Training_set size: 84 , Validation_set size: 28 , Test_set size: 38
Best score on validation_set: 0.96
Best parameters:  {'C': 10, 'gamma': 0.001}
Test_set score with best parameters: 0.92

强调:在机器学习中,测试集只做测试用,不参与训练与调参,以保证测试的客观性。

步骤3、使用网格搜索(GridSearchCV)自动调参

GridSearchCV整合了自动调参和交叉验证功能,相对于手工枚举更加高效。

from sklearn.model_selection import GridSearchCV # 引入网格搜索类

# 定义参数列表
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1, 1, 10, 100]} 

# 定义GridSearchCV对象,注意参数
# 参数1-模型
# 参数2-参数列表
# 参数3-交叉验证次数(网格搜索具有交叉验证功能)
grid_search = GridSearchCV(SVC(), param_grid, cv=10)

# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
grid_search.fit(X_train, y_train) # 将训练数据交给GridSearchCV对象

# 输出最佳参数组合及最佳成绩(利用.best_params_和.best_score_属性)
print("Best parameters: {}".format(grid_search.best_params_)) 
print("Best cross-validation score: {:.2f}".format(grid_search.best_score_))

输出结果:

Best parameters: {'C': 10, 'gamma': 0.1}
Best cross-validation score: 0.98

说明:需要掌握GridSearchCV的参数及两个重要属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/10540.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

研究生,但是一直在摆烂学不进去

好的,我来为您创作一首歌曲,希望能够帮助您每天保持自律,专注学习。 《自律之歌》 第1节: 每天都要努力 学习不停歇 独自一人也要坚持 不放弃自己的梦想 读文献 写论文 我们不停探索 穷孩子的荣耀 就在不远处等候 合唱&#xf…

仿京东放大镜效果的实现

仿京东放大镜 (1) 整个案例可以分为三个功能模块 (2) 鼠标经过小图片盒子, 黄色的遮挡层 和 大图片盒子显示,离开隐藏2个盒子功能 (3)黄色的遮挡层跟随鼠标功能。 (4&…

Dapr微服务

** 一、Dapr是什么 ** 官方解释:Dapr (Distributed Application Runtime)是一个可移植的、事件驱动的运行时 可移植:指与软件从某一环境转移到另一环境下的难易程度。事件驱动:调用与被调用方解耦 自己理解:Dapr为任何语言编写…

【通过Cpython3.9源码看看列表到底是咋回事】

列表结构 typedef struct {PyObject_VAR_HEAD/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */PyObject **ob_item;/* ob_item contains space for allocated elements. The number* currently in use is ob_size.* Invariants:* 0 < ob_siz…

Matlab论文插图绘制模板第85期—模值赋色的箭头图

在之前的文章中&#xff0c;分享了Matlab箭头图的绘制模板&#xff1a; 进一步&#xff0c;如果我们想对每一个箭头赋上颜色&#xff0c;以更加直观地表示其模值的大小&#xff0c;该怎么操作呢&#xff1f; 那么&#xff0c;来看一下模值赋色的箭头图的绘制模板。 先来看一下…

老胡的周刊(第086期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目MochiDiffusion[2]在 MacOS 上运行原生的 Stab…

游戏解密之常见网络游戏同步方式分析

一、为什么需要有同步呢&#xff1f; 同步机制是用来维护游戏的一致性&#xff0c;通俗的说就是虚拟世界中的事实&#xff1b;比如在CF中&#xff0c;大家的PING都很高&#xff0c;A和B两个玩家同时发现了对方&#xff0c;并向对方开火&#xff0c;如果没有很好的同步机制&…

【学习笔记】滑动窗口

acwing.滑动窗口https://www.acwing.com/problem/content/156/ 给定一个大小为 n≤106≤106 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; …

【博学谷学习记录】超强总结,用心分享 | 架构师 MySql扩容学习总结

文章目录1. 停机方案2.停写方案3.日志方案4.双写方案&#xff08;中小型数据&#xff09;5.平滑2N方案&#xff08;大数据量&#xff09;1. 停机方案 发布公告 为了进行数据的重新拆分&#xff0c;在停止服务之前&#xff0c;我们需要提前通知用户&#xff0c;比如&#xff1a…

他98年的,我真的玩不过他...

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

MySQL 分布式数据库实现:无需修改代码,轻松实现分布式能力

这个项目做什么 ShardingSphere-Proxy&#xff0c;可以让用户像使用原生数据库一样使用 Apache ShardingSphere。 了解一项技术的开始&#xff0c;一般从官网开始。先来看一看官网对 ShardingSphere-Proxy 的定义是什么样的&#xff1a; 定位为透明化的数据库代理端&#xff…

springboot学习2

一、spring boot自动装配原理 pom.xml spring-boot-dependencies 核心依赖在父工程中 在写或者引入一些spring boot依赖的时候&#xff0c;不需要指定版本&#xff0c;因为有这些版本仓库启动器 <dependency><groupId>org.springframework.boot</groupId>&…

会画画的海龟,Python Turtle库详解(27)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 介绍下Python的turtle库&#xff0c;这是一个可以画画的库&#xff0c;非常适合小孩子在屏幕上画画。 先学习基础知…

第08章_面向对象编程(高级)

第08章_面向对象编程(高级) 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 关键字&#xff1a;static 回顾类中的实例变量&#xff08;即非static的成员变量&#xff09; c…

虚拟化技术:实现资源高效利用和灵活管理的利器

虚拟化技术是一种通过软件或硬件手段&#xff0c;将物理资源抽象化&#xff0c;从而创建虚拟资源的技术。这种技术可以应用于计算、存储、网络等领域&#xff0c;通过将物理资源划分为多个虚拟资源&#xff0c;使得多个应用程序或用户可以共享同一组物理资源&#xff0c;从而提…

Linux 进程管理之四大名捕

一、四大名捕 四大名捕&#xff0c;最初出现于温瑞安创作的武侠小说&#xff0c;是朝廷中正义力量诸葛小花的四大徒弟&#xff0c;四人各怀绝技&#xff0c;分别是轻功暗器高手 “无情”、内功卓越的高手“铁手”、腿功惊人的“追命” 和剑法一流的“冷血”。 本文四大名捕由…

关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

目录 一、商品数据API接口列表 二、商品详情数据API调用代码item_get 三、获取sku详细信息item_sku 四、获得淘宝商品评论item_review 五、数据说明文档 进入 一、商品数据API接口列表 二、商品详情数据API调用代码item_get <?php// 请求示例 url 默认请求参数已经URL…

集合-LinkedList

LinkedList LinkedList的概述 LinkedList的底层使用双向链表实现。 链表是一种线性数据结构&#xff0c;其中每个元素都是一个单独的对象&#xff0c;包含一个指向列表中下一个节点的引用。 它可以用于实现各种抽象数据类型&#xff0c;例如列表、堆栈、队列等。 LinkedLis…

Carla仿真二:Carla多视图切换代码详解

文章目录前言一、Carla多视图切换效果二、Camera安装坐标系1、Carla.Location2、Carla.Rotation三、接口及代码详解1、接口介绍2、生成上帝视图代码3、生成Camera视图代码四、完整代码前言 1、Carla提供了大量的Python API接口&#xff0c;用户可以通过查找文档实现各类功能&a…

无限制翻译软件-中英互译字数无限

翻译软件是我们工作及学习中必不可少的工具&#xff0c;然而许多翻译软件在使用时常常会出现字数限制的问题,这使得用户在处理长文本和大量文本时变得十分麻烦。如果你也遇到了类似的问题&#xff0c;那么哪个翻译软件不限制字数将为您带来全新的翻译体验。 以下是我们的哪个翻…