当前位置: 首页 > web >正文

Python机器学习模型中添加日志记录器

文章目录

  • 1. 日志记录器的主要作用
  • 2. 日志记录器的主要流程实现
    • 2.0 日志记录器完整工作流程
    • 2.1 创建日志记录器
    • 2.2 创建控制台处理器
    • 2.3 创建控制台处理器
    • 2.4 总结
    • 2.5 附加:日志级别体系
  • 3. 案例应用

每天学点不会的东西!
今天看到别人代码里面有配置日志记录器的,感觉很厉害的样子,于是我也学一学。

1. 日志记录器的主要作用

日志记录器是Python logging 模块的核心组件,它是应用程序日志系统的入口点,负责捕获、处理和分发日志消息。日志记录器在软件开发中扮演着关键角色,特别是在需要追踪程序行为、调试问题和监控系统运行状态时。
1. 事件记录
捕获应用程序运行过程中的关键事件
记录用户操作、系统状态变化等
跟踪数据流和处理流程
2. 问题诊断
提供程序运行时的上下文信息
帮助重现和定位bug
记录异常堆栈跟踪
3. 性能监控
记录函数执行时间
追踪资源使用情况(内存、CPU等)
监控系统吞吐量和响应时间
4. 审计追踪
满足合规性要求
记录关键业务操作
提供操作历史追溯
5. 行为分析
收集用户行为数据
分析系统使用模式
支持业务决策

2. 日志记录器的主要流程实现

2.0 日志记录器完整工作流程

在这里插入图片描述

2.1 创建日志记录器

logger = logging.getLogger("LinearRegression")
logger.setLevel(log_level)

getLogger(“LinearRegression”):

  • 创建一个名为"LinearRegression"的日志记录器实例
  • 使用命名记录器可以区分不同模块的日志
  • 相同名称的调用会返回同一个记录器实例(避免重复创建)

setLevel(log_level):

  • 设置记录器处理的最低日志级别(如DEBUG/INFO/WARNING)
  • 决定哪些级别的日志会被记录器接收和处理
  • 示例:设为logging.INFO时,DEBUG级别的日志会被忽略

2.2 创建控制台处理器

file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setLevel(log_level)

FileHandler(log_file):

  • 创建文件输出处理器,将日志写入指定文件
  • encoding="utf-8"确保中文等特殊字符正确保存

setLevel(log_level):

  • 设置此处理器处理的最低日志级别
  • 可以独立于记录器级别设置(实现不同输出目标的不同日志级别)

2.3 创建控制台处理器

console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)

StreamHandler():

  • 创建控制台输出处理器,将日志打印到标准输出(通常是终端)
  • 不需要指定文件路径
    setLevel(log_level):
  • 设置控制台输出的日志级别
  • 可单独设置为更高或更低级别(如开发时用DEBUG,生产用INFO)

2.4 总结

在这里插入图片描述

2.5 附加:日志级别体系

Python 的 logging 模块定义了 6 个标准级别(数值从小到大,级别从低到高):

logger.debug("详细调试信息")  # 级别10
logger.info("常规操作信息")   # 级别20
logger.warning("潜在问题警告") # 级别30
logger.error("严重错误")     # 级别40
logger.critical("致命错误")  # 级别50

在这里插入图片描述

3. 案例应用

通过对机器学习中一个简单模型线性回归的训练过程进行追踪,形成日志记录,下面是整个的代码帮助理解上述内容。

import logging
import numpy as np
import os
from datetime import datetime
import warnings
warnings.filterwarnings("ignore")class LinearRegression:def __init__(self, learning_rate=0.01, n_iter=1000, log_level=logging.INFO):self.learning_rate = learning_rateself.n_iter = n_iterself.logger = self.setup_logger(log_level)def setup_logger(self, log_level):"""配置并返回日志记录器"""# 创建日志目录log_dir = r"E:\stuay\日志"# os.mkdirs(log_dir) #  两种方式其实都可以os.makedirs(log_dir,exist_ok=True)# 生成带时间戳的日志文件名timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")print(timestamp)log_file = os.path.join(log_dir, f"linear_regression_{timestamp}.log")print(log_file)# 创建日志记录器logger = logging.getLogger("LinearRegression")logger.setLevel(log_level)# 创建文件处理器:用于将日志消息写入到指定的文件中file_handler = logging.FileHandler(log_file, encoding="utf-8")file_handler.setLevel(log_level)# 创建控制台处理器:用于将日志消息输出到控制台console_handler = logging.StreamHandler()console_handler.setLevel(log_level)# 设置日志格式fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"formatter = logging.Formatter(fmt, datefmt="%Y-%m-%d %H:%M:%S")file_handler.setFormatter(formatter)console_handler.setFormatter(formatter)# 添加处理器:将处理器添加到记录器logger.addHandler(file_handler)# logger.addHandler(console_handler) # 注销掉,不会在控制台显示return loggerdef fit(self, X, y):"""训练线性回归模型"""# 添加偏置项X = np.c_[np.ones((X.shape[0], 1)), X]# 初始化参数self.theta = np.random.randn(X.shape[1], 1)# 记录训练开始信息self.logger.info("Starting linear regression training")self.logger.info(f"Training parameters: learning_rate={self.learning_rate}, iterations={self.n_iter}")self.logger.info(f"Dataset shape: {X.shape[0]} samples, {X.shape[1]-1} features")# 训练循环for iteration in range(self.n_iter):# 计算预测和误差predictions = X.dot(self.theta)errors = predictions - y.reshape(-1, 1)# 计算梯度并更新参数gradients = 2 / len(X) * X.T.dot(errors)self.theta -= self.learning_rate * gradients# 计算损失loss = np.mean(errors**2)# 定期记录进度if iteration % 100 == 0 or iteration == self.n_iter - 1:self.logger.debug(f"Iteration {iteration:4d}/{self.n_iter} - Loss: {loss:.6f}")# 训练完成记录self.logger.info("Training completed")self.logger.info(f"Final parameters: {self.theta.flatten()}")self.logger.info(f"Final loss: {loss:.6f}")return selfdef predict(self, X):"""使用训练好的模型进行预测"""X = np.c_[np.ones((X.shape[0], 1)), X]return X.dot(self.theta)# 示例使用
if __name__ == "__main__":# 生成样本数据np.random.seed(611)X = 2 * np.random.rand(1000, 1)y = 4 + 3 * X + np.random.randn(1000, 1)# 创建并训练模型model = LinearRegression(learning_rate=0.1, n_iter=500)model.fit(X, y)# 进行预测X_new = np.array([[0], [2]])predictions = model.predict(X_new)model.logger.info(f"Predictions for {X_new.flatten()}: {predictions.flatten()}")

生成了两个log_file,形如下图。
在这里插入图片描述
分别打开这两个,里面的内容可与代码中的去进行对应。
在这里插入图片描述
在这里插入图片描述

业精于勤荒于嬉,行成于思毁于随。哈哈哈

http://www.xdnf.cn/news/13625.html

相关文章:

  • ubuntu install vncserver
  • (46)课68:查看索引 SHOW INDEX FROM 表名;删除索引 DROP INDEX index_name ON 表名;
  • VOSK 离线中文语音识别实战:精准转文字、格式避坑全解析
  • 6.11 note
  • sessionStorage.setItem
  • Kivy的Button类的学习
  • 【AGI-Eval实测】Claude 4 网页生成、游戏开发场景深度实测:发布会宣传与真实效果相差几何?
  • JAVA(Day3)
  • 简单实现shardingSphere + MybatisPlus分库分表2025
  • 分子亚型 (by deepseek)
  • Linux5.10内核stmmac驱动框架深度解析
  • 【CUDA】block复用与kWaveNums
  • 10.Mkb、Mb 和 Mbps
  • C# ConcurrentDictionary 中获取指定范围的元素
  • 安卓中草药宝典 V2.6上千种中草药知识学习
  • STM32学习之不同FLASH的芯片启动文件选择规则
  • 场外期权看涨如果跌了本金还在不在?
  • 如何防止任务在多个项目中重复执行
  • C++面试(5)-----删除链表中指定值的节点
  • Python从入门到荒废-无网络Linux系统安装matplotlib
  • 电路板的 “双面绣”:猎板双色油墨如何重塑电子制造新范式
  • 人工智能AI
  • Unity3D Mono与IL2CPP区别详解
  • 关于主流电商官方API接口采集有哪些优势?
  • jpeg与 Mjpeg数据格式有什么区别
  • 大模型笔记_模型微调
  • Maven 之 打包项目时没有使用本地仓库依赖问题
  • 企业如何高效构建BI团队,解锁数据价值新高地?
  • 摩擦非线性随动电机位置误差控制系统
  • C# OAuth2密码模式接口鉴权