Python解析参数的三种方法

今天我们分享的主要目的就是通过在 Python 中使用命令行和配置文件来提高代码的效率

Let’s go!

我们以机器学习当中的调参过程来进行实践,有三种方式可供选择。第一个选项是使用 argparse,它是一个流行的 Python 模块,专门用于命令行解析;另一种方法是读取 JSON 文件,我们可以在其中放置所有超参数;第三种也是鲜为人知的方法是使用 YAML 文件!好奇吗,让我们开始吧!

在这里插入图片描述

先决条件

在下面的代码中,我将使用 Visual Studio Code,这是一个非常高效的集成 Python 开发环境。这个工具的美妙之处在于它通过安装扩展支持每种编程语言,集成终端并允许同时处理大量 Python 脚本和 Jupyter 笔记本

数据集,使用的是 Kaggle 上的共享自行车数据集,可以在这里下载或者在文末获取

https://www.kaggle.com/datasets/lakshmi25npathi/bike-sharing-dataset

使用 argparse

在这里插入图片描述
就像上图所示,我们有一个标准的结构来组织我们的小项目:

  • 包含我们数据集的名为 data 的文件夹
  • train.py 文件
  • 用于指定超参数的 options.py 文件

首先,我们可以创建一个文件 train.py,在其中我们有导入数据、在训练数据上训练模型并在测试集上对其进行评估的基本程序:

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_errorfrom options import train_optionsdf = pd.read_csv('data\hour.csv')
print(df.head())
opt = train_options()X=df.drop(['instant','dteday','atemp','casual','registered','cnt'],axis=1).values
y =df['cnt'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)if opt.normalize == True:scaler = StandardScaler()X = scaler.fit_transform(X)rf = RandomForestRegressor(n_estimators=opt.n_estimators,max_features=opt.max_features,max_depth=opt.max_depth)
model = rf.fit(X_train,y_train)
y_pred = model.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_pred, y_test))
mae = mean_absolute_error(y_pred, y_test)
print("rmse: ",rmse)
print("mae: ",mae)

在代码中,我们还导入了包含在 options.py 文件中的 train_options 函数。后一个文件是一个 Python 文件,我们可以从中更改 train.py 中考虑的超参数:

import argparsedef train_options():parser = argparse.ArgumentParser()parser.add_argument("--normalize", default=True, type=bool, help='maximum depth')parser.add_argument("--n_estimators", default=100, type=int, help='number of estimators')parser.add_argument("--max_features", default=6, type=int, help='maximum of features',)parser.add_argument("--max_depth", default=5, type=int,help='maximum depth')opt = parser.parse_args()return opt

在这个例子中,我们使用了 argparse 库,它在解析命令行参数时非常流行。首先,我们初始化解析器,然后,我们可以添加我们想要访问的参数。

这是运行代码的示例:

python train.py

在这里插入图片描述
要更改超参数的默认值,有两种方法。第一个选项是在 options.py 文件中设置不同的默认值。另一种选择是从命令行传递超参数值:

python train.py --n_estimators 200

我们需要指定要更改的超参数的名称和相应的值。

python train.py --n_estimators 200 --max_depth 7
使用 JSON 文件

在这里插入图片描述
和前面一样,我们可以保持类似的文件结构。在这种情况下,我们将 options.py 文件替换为 JSON 文件。换句话说,我们想在 JSON 文件中指定超参数的值并将它们传递给 train.py 文件。与 argparse 库相比,JSON 文件可以是一种快速且直观的替代方案,它利用键值对来存储数据。下面我们创建一个 options.json 文件,其中包含我们稍后需要传递给其他代码的数据。

{
"normalize":true,
"n_estimators":100,
"max_features":6,
"max_depth":5 
}

如上所见,它与 Python 字典非常相似。但是与字典不同的是,它包含文本/字符串格式的数据。此外,还有一些语法略有不同的常见数据类型。例如,布尔值是 false/true,而 Python 识别 False/True。JSON 中其他可能的值是数组,它们用方括号表示为 Python 列表。

在 Python 中使用 JSON 数据的美妙之处在于,它可以通过 load 方法转换成 Python 字典:

f = open("options.json", "rb")
parameters = json.load(f)

要访问特定项目,我们只需要在方括号内引用它的键名:

if parameters["normalize"] == True:scaler = StandardScaler()X = scaler.fit_transform(X)
rf=RandomForestRegressor(n_estimators=parameters["n_estimators"],max_features=parameters["max_features"],max_depth=parameters["max_depth"],random_state=42)
model = rf.fit(X_train,y_train)
y_pred = model.predict(X_test)
使用 YAML 文件

在这里插入图片描述
最后一种选择是利用 YAML 的潜力。与 JSON 文件一样,我们将 Python 代码中的 YAML 文件作为字典读取,以访问超参数的值。YAML 是一种人类可读的数据表示语言,其中层次结构使用双空格字符表示,而不是像 JSON 文件中的括号。下面我们展示 options.yaml 文件将包含的内容:

normalize: True 
n_estimators: 100
max_features: 6
max_depth: 5

在 train.py 中,我们打开 options.yaml 文件,该文件将始终使用 load 方法转换为 Python 字典,这一次是从 yaml 库中导入的:

import yaml
f = open('options.yaml','rb')
parameters = yaml.load(f, Loader=yaml.FullLoader)

和前面一样,我们可以使用字典所需的语法访问超参数的值。

最后的想法

配置文件的编译速度非常快,而 argparse 则需要为我们要添加的每个参数编写一行代码。

所以我们应该根据自己的不同情况来选择最为合适的方式

例如,如果我们需要为参数添加注释,JSON 是不合适的,因为它不允许注释,而 YAML 和 argparse 可能非常适合。

总结

外行对于程序员的认知很单一,也有很多刻板印象,但不管如何,作为测试人员的我们,自己一定要正视自己。如果我们连自嘲和自卑都分不清楚了,那发展也就仅限如此了。

所以,尽早规划自己,朝目标发展,才是上策之道,而不是怨天尤人,等到 30 岁后再去焦虑。

在企业你如果不想成为“工具人”,就不要停下成长的步伐,打造属于自己的独特价值,具备不可替代的稀缺属性,这样才能不被淘汰,也能够在遭遇变化时,随自己所愿进行选择。

下面是你需要的资料吗!

↓↓

图片

 ❤学习安排上❤

 如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,请及时加入群:1150305204,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题

安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后&#xff0c;有个隐患详情见下文 Spring Boot集成 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2…

在线表白网页制作源码,无需数据库,自带网站会员付费

源码介绍 通过在线表白&#xff0c;人们可以以一种浪漫的方式表达自己的感情&#xff0c;只需要填写一些基本信息&#xff0c;就能自动生成精美的表白页面。 为了增加网站的收入&#xff0c;用户可以购买网站会员&#xff0c;以使用指定的网页制作模板。 这个系统无需数据库…

计算机网络 —— 物理层

物理层 2.1 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流。 物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本层的协议和服务&#xff0c;而不必考虑网络具体的传输媒体是什么 2.2 物理层下…

pyqtgraph 教程

pyqtgraph 教程 简介 PyQtGraph 是一个用于科学和工程数据可视化的开源库&#xff0c;基于 PyQt 和 NumPy 构建而成。它提供了丰富的绘图工具和交互功能&#xff0c;可以用于创建高性能的实时数据图表、图像显示和信号处理应用。 以下是 PyQtGraph 的一些特点和功能&#xf…

python 多线程 守护线程

daemon线程&#xff1a;守护线程&#xff0c;优先级别最低&#xff0c;一般为其它线程提供服务。通常&#xff0c;daemon线程体是一个无限循环。如果所有的非daemon线程(主线程以及子线程&#xff09;都结束了&#xff0c;daemon线程自动就会终止。t.daemon 属性&#xff0c;设…

大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…

Hyperledger Fabric 权限策略和访问控制

访问控制是区块链网络十分重要的功能&#xff0c;负责控制某个身份在某个场景下是否允许采取某个操作&#xff08;如读写某个资源&#xff09;。 常见的访问控制模型包括强制访问控制&#xff08;Mandatory Access Control&#xff09;、自主访问控制&#xff08;Discretionar…

代码随想录算法训练营第21天 |530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接&#xff1a;530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 提示&#xff1a;树中至少有 2 个节点。 &#x1f4a1;解题思路 题目中…

UE5 将类修改目录

有个需求&#xff0c;需要修改ue里面类的位置&#xff0c;默认在Public类下面&#xff0c;我想创建一个二级目录&#xff0c;将所有的类分好位置&#xff0c;方便查看。 上图为创建一个类所在的默认位置。 接下来&#xff0c;将其移动到一个新的目录中。 首先在资源管理器中找…

Android - CrashHandler 全局异常捕获器

官网介绍如下&#xff1a;Thread.UncaughtExceptionHandler (Java Platform SE 8 ) 用于线程因未捕获异常而突然终止时调用的处理程序接口。当线程由于未捕获异常而即将终止时&#xff0c;Java虚拟机将使用thread . getuncaughtexceptionhandler()查询该线程的UncaughtExceptio…

模集 - 240105 - 模集期末速成

TAG - 模集、期末、速成 模集、期末、速成 模集、期末、速成 // – 高数帮 - 期末速成 – //阈值电压晶体管工作区及其判断方法电路公式//体效应沟长调制效应亚阈值效应…// – 阶段考核1 – //集成电路的优势与特点&#xff1a;体积小、速度快、功耗低、电路中以晶体管为主&a…

docker jenkins NB: JAVA_HOME should point to a JDK not a JRE

jenkins java编译错误&#xff1a; 3.5.4/conf/settings.xml The JAVA_HOME environment variable is not defined correctly This environment variable is needed to run this program NB: JAVA_HOME should point to a JDK not a JRE Build step ‘Invoke top-level Maven t…

软件测试|MySQL主键自增详解:实现高效标识与数据管理

简介 在MySQL数据库中&#xff0c;主键自增是一种常见的技术&#xff0c;用于自动为表中的主键字段生成唯一的递增值。本文将深入讨论MySQL主键自增的原理、用途、使用方法&#xff0c;以及在实践中的注意事项和最佳实践。 主键自增 主键自增的原理 主键自增是通过使用AUTO…

【PostgreSQL在线创建索引(CIC)功能的锁分析以及使用注意】

前一篇文章提到了普通创建索引会阻塞DML操作 PostgreSQL创建索引的锁分析和使用注意 而PostgreSQL里可以使用create index concurrently 在线创建索引(CIC)功能&#xff0c;降低创建索引在表上申请的锁的级别&#xff0c;ShareUpdateExclusiveLock级别的锁和RowExclusiveLock…

【Linux系统编程二十七】:线程的互斥与同步(互斥锁的使用与应用)

【Linux系统编程二十七】&#xff1a;线程的互斥与同步(互斥锁的使用与应用&#xff09; 一.问题:数据不一致(混乱/不安全)1.多线程并发计算不安全2.将数据加载到寄存器的本质 二.解决方法--互斥锁三.互斥锁的概念与接口1.定义锁2.加锁/解锁 四.互斥锁实现原理与应用1.原理&…

[redis] redis主从复制,哨兵模式和集群

一、redis的高可用 1.1 redis高可用的概念 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-&#xff08;宕机时间&#xff09;/&#xff08;宕机时…

subversion httpd

通过http访问模式部署SVN的操作步骤如下&#xff1a; 步骤一&#xff1a;安装SVN 步骤二&#xff1a;安装Apache 步骤三&#xff1a;安装mod_dav_svn 步骤四&#xff1a;配置SVN 步骤五&#xff1a;配置Apache 步骤六&#xff1a;浏览器测试访问 步骤一&#xff1a;安装SVN 1.…

Linux网络配置概述

目录 一.查看网络配置 1.ifconfig 2.ip a 3.hostname 4.route 5.netstat和ss &#xff08;1&#xff09;netstat &#xff08;2&#xff09;ss &#xff08;3&#xff09;区别 6.ping 7.traceroute 8.nslookup 9.dig 二.网卡配置 三.域名解析配置文件 1.文件所…

GEE python登录重大更新—— ee.Initialize()初始验证过程更新

最近GEE python进行了更新,因此原始的登录代码将无法使用,所以这里我们看一下通常会报出的错误,这里需要我们将我们运行的projection具体的名称写入进去,也就是GEE中你再JavaScript界面中运行的项目名称,相较与之前我们需要进行验证码的copy,这里直接可以通过项目的写入来…

Linux限制用户可用硬盘空间

为了防止某个用户占用大量资源导致其他用户无法正常使用&#xff0c;一般会对单个用户可占用资源进行限制。就磁盘限额&#xff0c;XFS文件系统原生支持目录级别的限制。ext文件系统不支持目录限制&#xff0c;曲线方式是限制用户的总占用空间。 本文介绍使用quota程序限制用户…