「日拱一码」039 机器学习-训练时间VS精确度

目录

时间-精度权衡曲线(不同模型复杂度)

训练与验证损失对比

帕累托前沿分析(3D) 


在机器学习实践中,理解模型收敛所需时间及其与精度的关系至关重要。下面介绍如何分析模型收敛时间与精度之间的权衡,并找到最佳性价比点。

时间-精度权衡曲线(不同模型复杂度)

# 1. 时间-精度曲线(不同模型复杂度)import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import time
import seaborn as sns# 设置样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
sns.set_palette("viridis")X, y = make_regression(n_samples=10000, n_features=50, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 模拟不同训练策略的结果
def simulate_training(model, max_iter=100):"""模拟训练过程并记录时间和精度"""train_losses = []val_losses = []times = []# 初始模型model.warm_start = Truemodel.n_estimators = 1model.fit(X_train, y_train)start_time = time.time()for i in range(1, max_iter + 1):model.n_estimators = imodel.fit(X_train, y_train)# 记录时间elapsed = time.time() - start_timetimes.append(elapsed)# 记录训练损失train_pred = model.predict(X_train)train_loss = mean_squared_error(y_train, train_pred)train_losses.append(train_loss)# 记录验证损失val_pred = model.predict(X_test)val_loss = mean_squared_error(y_test, val_pred)val_losses.append(val_loss)return np.array(times), np.array(train_losses), np.array(val_losses)model_simple = GradientBoostingRegressor(learning_rate=0.1, max_depth=3, random_state=42)
model_medium = GradientBoostingRegressor(learning_rate=0.05, max_depth=5, random_state=42)
model_complex = GradientBoostingRegressor(learning_rate=0.01, max_depth=8, random_state=42)# 模拟训练过程
times_simple, train_loss_simple, val_loss_simple = simulate_training(model_simple, 100)
times_medium, train_loss_medium, val_loss_medium = simulate_training(model_medium, 100)
times_complex, train_loss_complex, val_loss_complex = simulate_training(model_complex, 100)plt.figure(figsize=(12, 8))
plt.plot(times_simple, val_loss_simple, 'o-', label='简单模型 (depth=3, lr=0.1)', alpha=0.7)
plt.plot(times_medium, val_loss_medium, 's-', label='中等模型 (depth=5, lr=0.05)', alpha=0.7)
plt.plot(times_complex, val_loss_complex, 'd-', label='复杂模型 (depth=8, lr=0.01)', alpha=0.7)# 标记最佳平衡点(最大曲率点)
def find_elbow_point(times, losses):"""找到曲线的拐点(最大曲率点)"""# 计算一阶导数(梯度)grad = np.gradient(losses, times)# 计算二阶导数grad2 = np.gradient(grad, times)# 计算曲率curvature = np.abs(grad2) / (1 + grad ** 2) ** 1.5# 找到最大曲率点(排除前10%的点)exclude_n = max(5, int(len(curvature) * 0.1))max_idx = np.argmax(curvature[exclude_n:-5]) + exclude_nreturn times[max_idx], losses[max_idx]# 标记各模型的最佳点
elbow_time_simple, elbow_loss_simple = find_elbow_point(times_simple, val_loss_simple)
elbow_time_medium, elbow_loss_medium = find_elbow_point(times_medium, val_loss_medium)
elbow_time_complex, elbow_loss_complex = find_elbow_point(times_complex, val_loss_complex)plt.scatter(elbow_time_simple, elbow_loss_simple, s=150, c='red', marker='*', zorder=10)
plt.scatter(elbow_time_medium, elbow_loss_medium, s=150, c='red', marker='*', zorder=10)
plt.scatter(elbow_time_complex, elbow_loss_complex, s=150, c='red', marker='*', zorder=10)plt.annotate('最佳平衡点',(elbow_time_medium, elbow_loss_medium),xytext=(elbow_time_medium + 0.5, elbow_loss_medium + 5),arrowprops=dict(facecolor='red', shrink=0.05, width=2),fontsize=12, color='red')plt.xlabel('训练时间 (秒)', fontsize=12)
plt.ylabel('验证集 MSE', fontsize=12)
plt.title('不同复杂度模型的时间-精度权衡', fontsize=14)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

训练与验证损失对比

# 2. 训练与验证损失对比
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import time
import seaborn as sns# 设置样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
sns.set_palette("viridis")X, y = make_regression(n_samples=10000, n_features=50, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 模拟不同训练策略的结果
def simulate_training(model, max_iter=100):"""模拟训练过程并记录时间和精度"""train_losses = []val_losses = []times = []# 初始模型model.warm_start = Truemodel.n_estimators = 1model.fit(X_train, y_train)start_time = time.time()for i in range(1, max_iter + 1):model.n_estimators = imodel.fit(X_train, y_train)# 记录时间elapsed = time.time() - start_timetimes.append(elapsed)# 记录训练损失train_pred = model.predict(X_train)train_loss = mean_squared_error(y_train, train_pred)train_losses.append(train_loss)# 记录验证损失val_pred = model.predict(X_test)val_loss = mean_squared_error(y_test, val_pred)val_losses.append(val_loss)return np.array(times), np.array(train_losses), np.array(val_losses)model_simple = GradientBoostingRegressor(learning_rate=0.1, max_depth=3, random_state=42)
model_medium = GradientBoostingRegressor(learning_rate=0.05, max_depth=5, random_state=42)
model_complex = GradientBoostingRegressor(learning_rate=0.01, max_depth=8, random_state=42)# 模拟训练过程
times_simple, train_loss_simple, val_loss_simple = simulate_training(model_simple, 100)
times_medium, train_loss_medium, val_loss_medium = simulate_training(model_medium, 100)
times_complex, train_loss_complex, val_loss_complex = simulate_training(model_complex, 100)# 标记最佳平衡点(最大曲率点)
def find_elbow_point(times, losses):"""找到曲线的拐点(最大曲率点)"""# 计算一阶导数(梯度)grad = np.gradient(losses, times)# 计算二阶导数grad2 = np.gradient(grad, times)# 计算曲率curvature = np.abs(grad2) / (1 + grad ** 2) ** 1.5# 找到最大曲率点(排除前10%的点)exclude_n = max(5, int(len(curvature) * 0.1))max_idx = np.argmax(curvature[exclude_n:-5]) + exclude_nreturn times[max_idx], losses[max_idx]elbow_time_simple, elbow_loss_simple = find_elbow_point(times_simple, val_loss_simple)
elbow_time_medium, elbow_loss_medium = find_elbow_point(times_medium, val_loss_medium)
elbow_time_complex, elbow_loss_complex = find_elbow_point(times_complex, val_loss_complex)plt.figure(figsize=(12, 8))
plt.plot(times_medium, train_loss_medium, 'b-', label='训练损失')
plt.plot(times_medium, val_loss_medium, 'r-', label='验证损失')# 标记过拟合开始点
diff = val_loss_medium - train_loss_medium
overfit_idx = np.where(diff > np.percentile(diff, 90))[0][0]
overfit_time = times_medium[overfit_idx]
overfit_val_loss = val_loss_medium[overfit_idx]plt.axvline(x=overfit_time, color='purple', linestyle='--', alpha=0.7)
plt.scatter(overfit_time, overfit_val_loss, s=150, c='purple', marker='x')plt.annotate('过拟合开始点',(overfit_time, overfit_val_loss),xytext=(overfit_time+0.5, overfit_val_loss+5),arrowprops=dict(facecolor='purple', shrink=0.05, width=2),fontsize=12, color='purple')# 标记最佳点
plt.scatter(elbow_time_medium, elbow_loss_medium, s=150, c='red', marker='*', zorder=10)
plt.annotate('最佳平衡点',(elbow_time_medium, elbow_loss_medium),xytext=(elbow_time_medium+0.5, elbow_loss_medium+2),arrowprops=dict(facecolor='red', shrink=0.05, width=2),fontsize=12, color='red')plt.xlabel('训练时间 (秒)', fontsize=12)
plt.ylabel('MSE', fontsize=12)
plt.title('训练与验证损失随时间变化', fontsize=14)
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

帕累托前沿分析(3D) 

# 3. 帕累托前沿分析 (3D)
# 模拟不同超参数配置的结果import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import time
import pandas as pd
import seaborn as sns# 设置样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
sns.set_palette("viridis")X, y = make_regression(n_samples=10000, n_features=50, noise=0.2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
np.random.seed(42)
results = []
for _ in range(10):depth = np.random.randint(3, 10)lr = 10 ** np.random.uniform(-2, -0.5)n_estimators = np.random.randint(20, 200)model = GradientBoostingRegressor(max_depth=depth,learning_rate=lr,n_estimators=n_estimators,random_state=42)start_time = time.time()model.fit(X_train, y_train)train_time = time.time() - start_timey_pred = model.predict(X_test)mse = mean_squared_error(y_test, y_pred)results.append({'depth': depth,'lr': lr,'n_estimators': n_estimators,'time': train_time,'mse': mse,'cost_score': 0.7 * mse + 0.3 * np.log1p(train_time)  # 自定义成本函数})# 转换为DataFrame
df = pd.DataFrame(results)# 找到帕累托前沿点
def is_pareto_efficient(costs):"""找到帕累托最优解"""is_efficient = np.ones(costs.shape[0], dtype=bool)for i, c in enumerate(costs):if is_efficient[i]:# 所有成本都小于等于当前点的点is_efficient[is_efficient] = np.any(costs[is_efficient] < c, axis=1)is_efficient[i] = True  # 保持当前点return is_efficientcosts = df[['mse', 'time']].values
pareto_mask = is_pareto_efficient(costs)
pareto_points = df[pareto_mask]# 3D可视化
fig = plt.figure(figsize=(14, 10))
ax = fig.add_subplot(111, projection='3d')# 绘制所有点
scatter = ax.scatter(df['depth'],df['lr'],df['n_estimators'],c=df['cost_score'],cmap='viridis',s=50,alpha=0.7,label='所有配置'
)# 绘制帕累托前沿点
pareto_scatter = ax.scatter(pareto_points['depth'],pareto_points['lr'],pareto_points['n_estimators'],c='red',s=100,edgecolors='black',label='帕累托前沿'
)# 标记最佳性价比点
best_idx = df['cost_score'].idxmin()
best_point = df.loc[best_idx]
ax.scatter(best_point['depth'],best_point['lr'],best_point['n_estimators'],c='gold',s=200,edgecolors='black',marker='*',label='最佳性价比'
)ax.set_xlabel('树深度', fontsize=12)
ax.set_ylabel('学习率', fontsize=12)
ax.set_zlabel('树数量', fontsize=12)
ax.set_title('超参数空间的帕累托前沿分析', fontsize=14)
ax.legend()# 添加颜色条
cbar = fig.colorbar(scatter, pad=0.1)
cbar.set_label('成本分数 (MSE + 时间成本)', fontsize=12)plt.tight_layout()
plt.show()

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

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

相关文章

面试刷题平台项目总结

项目简介&#xff1a; 面试刷题平台是一款基于 Spring Boot Redis MySQL Elasticsearch 的 面试刷题平台&#xff0c;运用 Druid HotKey Sa-Token Sentinel 提高了系统的性能和安全性。 第一阶段&#xff0c;开发基础的刷题平台&#xff0c;带大家熟悉项目开发流程&#xff…

负载均衡、算法/策略

负载均衡一、负载均衡层级对比特性四层负载均衡 (L4)七层负载均衡 (L7)工作层级传输层 (TCP/UDP)应用层 (HTTP/HTTPS等)决策依据源/目标IP端口URL路径、Header、Cookie、内容等转发方式IP地址/端口替换重建连接并深度解析报文性能更高吞吐量&#xff0c;更低延迟需内容解析&…

StackingClassifier参数详解与示例

StackingClassifier参数详解与示例 StackingClassifier是一种集成学习方法&#xff0c;通过组合多个基分类器的预测结果作为元分类器的输入特征&#xff0c;从而提高整体模型性能。以下是关键参数的详细说明和示例&#xff1a; 1. classifiers&#xff08;基分类器&#xff09;…

嵌入式中间件-uorb解析

uORB系统详细解析 1. 系统概述 1.1 设计理念 uORB&#xff08;Micro Object Request Broker&#xff09;是一个专为嵌入式实时系统设计的发布-订阅式进程间通信框架。该系统借鉴了ROS中topic的概念&#xff0c;为无人机飞控系统提供了高效、可靠的数据传输机制。 1.2 核心特征 …

HTTP.Client 库对比与选择

HTTP.Client 库对比与选择在 Python 中&#xff0c;除了标准库 http.client&#xff0c;还有许多功能更强大、使用更便捷的 HTTP 库。以下是一些常用的库及其特点&#xff1a;1. Requests&#xff08;最流行&#xff09;特点&#xff1a;高层 API&#xff0c;简单易用&#xff…

RabbitMQ面试精讲 Day 5:Virtual Host与权限控制

【RabbitMQ面试精讲 Day 5】Virtual Host与权限控制 开篇 欢迎来到"RabbitMQ面试精讲"系列的第5天&#xff01;今天我们将深入探讨RabbitMQ中Virtual Host与权限控制的核心机制&#xff0c;这是构建安全、隔离的消息系统必须掌握的重要知识。在面试中&#xff0c;面…

【前端实战】纯HTML+CSS+JS实现蜡笔小新无尽冒险:从零打造网页版超级玛丽

摘要&#xff1a;本文将详细介绍一款完全由HTMLCSSJS实现的网页版横版闯关游戏——"蜡笔小新无尽冒险"。游戏采用纯前端技术实现&#xff0c;无需任何外部依赖&#xff0c;完美复刻了经典超级玛丽的核心玩法&#xff0c;并创新性地融入了蜡笔小新角色元素。通过本文&…

[工具类] 网络请求HttpUtils

引言在现代应用程序开发中&#xff0c;网络请求是必不可少的功能之一。无论是访问第三方API、微服务之间的通信&#xff0c;还是请求远程数据&#xff0c;都需要通过HTTP协议实现。在Java中&#xff0c;java.net.HttpURLConnection、Apache的HttpClient库以及OkHttp等库提供了丰…

基于Spring Boot的装饰工程管理系统(源码+论文)

一、 开发环境与技术 本章节对开发装饰工程管理系统------项目立项子系统需要搭建的开发环境&#xff0c;以及装饰工程管理系统------项目立项子系统开发中使用的编程技术等进行阐述。 1 开发环境 工具/环境描述操作系统Windows 10/11 或 Linux&#xff08;如 Ubuntu&#x…

【WebGPU学习杂记】数学基础拾遗(2)变换矩阵中的齐次坐标推导与几何理解

今天打算开始 3D 数学基础的复习&#xff0c;本文假设你了解以下概念&#xff1a;一次多项式、矩阵、向量&#xff0c;基于以上拓展的概念 归一化、2&#xff5e;3阶矩阵的几何意义。几何意义结论 齐次坐标是对三维的人工的特定的升维&#xff0c;它是一个工具而已。图形学中常…

JS前端压缩算法——WWDHCAPOF-算法导论论文——东方仙盟算法

代码function customCompressString(input) {// 第一步&#xff1a;将字符串转换为ANSI码数组并乘以位置序号let resultArray Array.from(input).map((char, index) > {const ansiCode char.charCodeAt(0);return ansiCode * (index 东方仙盟); // 位置序号从1开始});// …

linux命令less的实际应用

less 是 Linux/Unix 中交互式文件查看神器&#xff0c;相比 more 和 cat&#xff0c;它支持自由导航、搜索、高亮等强大功能&#xff0c;尤其适合处理大文件或实时日志。以下是深度应用指南&#xff1a;​一、核心优势​less large_file.log # 秒开GB级文件&#xff08…

DAY31 整数矩阵及其运算

DAY31 整数矩阵及其运算 本次代码通过IntMatrix类封装了二维整数矩阵的核心操作&#xff0c;思路如下&#xff1a;数据封装→基础操作&#xff08;修改和获取元素、获取维度&#xff0c;toString返回字符串表示&#xff0c;getData返回内部数组引用&#xff09;→矩阵运算&…

飞桨深度学习环境搭建

一、安装 PyCharm PyCharm 官网下载页面 记得全部勾选。 二、安装 miniconda miniconda 官网下载页面 根据你的操作系统选择。 记得勾选前三个。 三、安装 CUDA 首先 nvidia-smi 查看支持最高的 CUDA 版本。 然后去 nvidia 官网下载 CUDA&#xff0c;选择适合你的版本。 …

MySQL 8.0 OCP 1Z0-908 题目解析(37)

题目146 Choose two. Which two are true about binary logs used in asynchronous replication? □ A) The master connects to the slave and initiates log transfer. □ B) They contain events that describe all queries run on the master. □ C) They contain events …

vue element 封装表单

背景&#xff1a; 在前端系统开发中&#xff0c;系统页面涉及到的表单组件比较多&#xff0c;所以进行了简单的封装。封装的包括一些Form表单组件&#xff0c;如下&#xff1a;input输入框、select下拉框、等 实现效果&#xff1a; 理论知识&#xff1a; 表单组件官方链接&…

flutter-完美解决键盘弹出遮挡输入框的问题

文章目录1. 前言2. 借助 Scaffold 的特性自动调整3. 使用 MediaQuery 精准控制抬升高度3.1. 底部抽屉内输入框的方案4. 注意事项5. 总结1. 前言 在 Flutter 的开发过程中&#xff0c;经常会碰到某一个页面有个 TextField 输入组件&#xff0c;点击的时候键盘会弹起来&#xff…

机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。概念部分大部分来自于机器学习菜鸟教程&#xff0c;公式部分也会参考机器学习书籍、阿里云天池。机器学习如果只啃概…

【C#】事务(进程 ID 64)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。不能在具有唯一索引“XXX_Index”的对象“dbo.Test”中插入重复键的行。

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

LeetCode Hot 100 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a;每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。示例…