一、模型选择与调优

  • 在机器学习中,模型的选择和调优是一个重要的步骤,它直接影响到最终模型的性能

1、交叉验证

  • 在任何有监督机器学习项目的模型构建阶段,我们训练模型的目的是从标记的示例中学习所有权重和偏差的最佳值

  • 如果我们使用相同的标记示例来测试我们的模型,那么这将是一个方法论错误,因为一个只会重复刚刚看到的样本标签的模型将获得完美的结果,但无法预测数据,这种情况称为过拟合,为了克服过度拟合的问题,我们使用交叉验证

  • 交叉验证(Cross-validation)是一种统计学上的方法,用于评估机器学习模型的性能,并帮助避免过拟合。它的主要思想是在有限的数据集上划分出一部分数据用于测试模型的泛化能力

1.1 保留交叉验证HoldOut

  • 保留交叉验证(Holdout Cross Validation)是最简单的一种交叉验证方法。在这种方法中,数据集被一次性划分为两个互斥的部分:一个较大的部分作为训练集(training set),用于训练模型;另一个较小的部分作为验证集(validation set)或测试集(test set),用于评估模型的泛化能力

  • Holdout 方法的步骤:

    • 数据划分:从原始数据集中随机抽取一部分数据作为测试集,剩余的数据作为训练集。通常的比例为70%的数据作为训练集,30%的数据作为测试集

    • 训练模型:使用训练集数据来训练模型

    • 评估模型:使用测试集数据来评估模型的性能,如准确率、召回率等指标

  • Holdout 方法的优点:

    • 简单易行:只需要一次划分即可完成训练和测试

    • 计算效率高:相较于K折交叉验证等方法,Holdout方法的计算开销较低

  • Holdout 方法的缺点:

    • 不适用于不平衡的数据集:假设我们有一个不平衡的数据集,有 0 类和 1 类。假设80%的数据属于 0 类,其余 20% 的数据属于 1 类。这种情况下,训练集的大小为 80%,测试数据的大小为数据集的 20%。可能发生的情况是,所有 80% 的 0 类数据都在训练集中,而所有 1 类数据都在测试集中。因此,我们的模型将不能很好地概括我们的测试数据,因为它之前没有见过 1 类的数据

    • 大块数据被剥夺了训练模型的机会:在小数据集的情况下,有一部分数据将被保留下来用于测试模型,这些数据可能具有重要的特征,而我们的模型可能会因为没有在这些数据上进行训练而错过

1.2 K-折交叉验证K-Fold

  • K-折交叉验证(K-Fold Cross Validation)是一种评估机器学习模型性能的方法

  • 在这种 K 折交叉验证技术中,整个数据集被划分为 K 个相等大小的部分。每个分区称为一个折叠。因为有 K 个部分,所以我们称之为 K-Fold 。一个 Fold 折用作验证集,其余 K-1 个 Fold 用作训练集

  • 图示:

  • 执行步骤:

    • 数据划分:

      • 首先,将整个数据集随机分成 K 个子集或者 Folds,尽量保证每个子集的大小相同

    • 模型训练与测试:

      • 对于每一个子集,将其保留作为测试集,而其他 K-1个子集合并作为训练集。这样,就可以训练一次模型并评估其性能

      • 这个过程会被重复 K 次,每次选择不同的子集作为测试集

    • 性能评估:

      • 在所有 K 次迭代结束后,计算每次测试的结果(如准确率、召回率、F1分数等),然后求这些结果的平均值,以此作为模型性能的估计

  • cross_val_score 是 scikit-learn 中的一个函数,用于执行交叉验证并返回模型在不同折叠上的得分,cross_val_score 函数的主要参数如下:

    • estimator:一个 scikit-learn 的估算器(estimator),通常是模型类的实例,如 LogisticRegressionSVC

    • X:特征数据,可以是 NumPy 数组、Pandas DataFrame 或其他支持索引的数据结构

    • y:目标数据,通常是一个一维数组,表示每个样本的标签

    • cv:交叉验证的折叠数或交叉验证生成器。可以是一个整数(表示 K 折交叉验证的 K 值),也可以是一个交叉验证生成器(如 StratifiedKFold

  • 优点:

    • 减少过拟合:由于模型是整个数据集既用作训练集又用作验证集,这种方法可以帮助减少模型的过拟合倾向

    • 提高模型稳定性:通过多次迭代,K-折交叉验证能够提供更稳定的模型性能评估,因为它考虑了不同数据划分对模型的影响

    • 利用有限数据:当可用的数据量较小的时候,这种方法允许更有效地利用数据来评估模型性能

  • 缺点:

    • 计算成本较高:需要训练和验证K次模型,因此需要更多的计算资源和时间

1.3 分层K-折交叉验证Stratified k-fold

  • 分层 K 折交叉验证(Stratified K-Fold Cross Validation)是一种改进的交叉验证方法,它特别适用于类别不平衡的数据集。这种技术确保在每个折叠(fold)中,不同类别的样本比例保持一致,从而使得每次训练和测试集的类别分布尽可能与整体数据集的类别分布相同,比如说:原始数据有 3 类,比例为 1:2:1,采用 3 折分层交叉验证,那么划分的 3 折中,每一折中的数据类别保持着 1:2:1 的比例

  • StratifiedKFoldscikit-learn库中的一个类,用于实现分层 K 折交叉验证(Stratified K-Fold Cross Validation),构造函数 StratifiedKFold 的参数如下:

    • n_splits (int, default=5):定义将数据集分割成多少个折叠(folds)。默认值为 5,意味着将数据集分成 5 个子集

    • shuffle (bool, default=False):如果设置为 True,则在划分数据之前会对数据进行随机化。这有助于提高结果的随机性和公平性

    • random_state (int, RandomState instance or None, default=None):如果 shuffle=True,则可以设置 random_state 来确保每次分割的结果可复现。它可以是一个整数(作为随机种子)、一个 RandomState 实例,或者 None(表示不使用固定的随机种子)

  • StratifiedKFold返回的对象中,可以调用skf.split(X, y)方法,skf.split(X, y) 方法是 StratifiedKFold 类的一个重要方法,用于生成训练集和测试集的索引。该方法返回一个迭代器,每次迭代返回一个元组 (train_index, test_index),分别对应训练集和测试集的索引,参数和返回值如下:

    • X:特征数据,可以是任何支持索引访问的数据结构,如 NumPy 数组、列表或 Pandas DataFrame

    • y:标签数据,通常是一个一维数组,表示每个样本的类别标签

    • split 方法返回一个迭代器,每次迭代返回一个元组 (train_index, test_index),其中:

      • train_index:一个 NumPy 数组,包含训练集样本的索引

      • test_index:一个 NumPy 数组,包含测试集样本的索引

案例:

from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
​
def stratified_k_fold():iris = load_iris()X = iris.datay = iris.target# 模型对象model = KNeighborsClassifier()# K-折交叉验证skf = StratifiedKFold(n_splits=5,shuffle=True,random_state=42)# 存储每次验证的结果scores = []for train_index,test_index in skf.split(X,y):X_train,X_test = X[train_index],X[test_index]y_train,y_test = y[train_index],y[test_index]# 特征工程:标准化standardScaler = StandardScaler()X_train = standardScaler.fit_transform(X_train)X_test = standardScaler.transform(X_test)# 训练模型model.fit(X_train,y_train)# 在测试集上评估模型y_predict = model.predict(X_test)score = accuracy_score(y_test, y_predict)scores.append(score)print(scores)

StratifiedKFold 的工作原理

  • 目标:在划分数据时,保持每一折的 y_trainy_test 中各类别的比例与原始数据 y 相同。

  • 实现方式

    • 每个类别单独计算分位数,确保每个类别的样本均匀分布在每一折中。

    • 例如,如果原始数据中类别 A 占 40%,B 占 60%,则每一折的 y_trainy_test 也会保持 4:6 的比例。

2、超参数搜索

  • 超参数是在建立模型时用于控制算法行为的参数。这些参数不能从常规训练过程中获得。在对模型进行训练之前,需要对它们进行赋

  • 超参数的选择对模型的最终性能有着至关重要的影响。不同的超参数组合可能导致模型在训练集上过拟合或者欠拟合。因此,寻找合适的超参数组合是一项关键任务

  • 常见的方式:

    • 手工调参

    • 网格搜索

    • 随机搜索

    • 贝叶斯搜索

2.1 网格搜索

  • 网格搜索是一种基本的超参数调优技术。它为网格中指定的所有给定超参数值的每个排列构建模型,评估并选择最佳模型

  • GridSearchCVscikit-learn 库提供的一个用于执行网格搜索的类,它可以在给定的超参数网格中自动寻找最佳的超参数组合。GridSearchCV 通过交叉验证来评估每种超参数组合的效果,并最终返回性能最好的模型

  • GridSearchCV的构造函数的参数如下:

    • estimator:scikit-learn估计器实例

    • param_grid:以参数名称(str)作为键,将参数设置列表尝试作为值的字典

    • cv:确定交叉验证切分策略,None 默认5折,integer 设置多少折

  • GridSearchCV的对象中,有如下几个重要的属性:

    • best_params_ 最佳参数

    • best_score_ 在训练集中的准确率

    • best_estimator_ 最佳估计器

    • cv_results_ 交叉验证结果

案例:

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
​
​
# 用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证
def knn_iris_gridSearchCV():iris = load_iris()X = iris.datay = iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)# 特征工程:标准化transfer = StandardScaler()X_train = transfer.fit_transform(X_train)X_test = transfer.transform(X_test)# 创建KNN模型, 不设置n_neighbors的值,后期让GridSearchCV来设置knn = KNeighborsClassifier()# 加入网格搜索与交叉验证, GridSearchCV会让k分别等于1,2,5,7,9,11进行网格搜索model = GridSearchCV(knn, param_grid={"n_neighbors": [1, 2, 5, 7, 9, 11]})# 训练模型model.fit(X_train, y_train)# 模型评估# 比对真实值和预测值y_predict = model.predict(X_test)print("y_predict:\n", y_predict)print("真实值和预测值的准确率:\n", y_test == y_predict)# 计算预测值和真实值的准确率print("预测值和真实值的准确率:\n", accuracy_score(y_test, y_predict))# 计算准确率score = model.score(X_test, y_test)print("在测试集中的准确率为:\n", score)# 最佳参数:best_params_print("最佳参数:\n", model.best_params_)# 最佳结果:best_score_print("在训练集中的准确率:\n", model.best_score_)# 最佳估计器:best_estimator_print("最佳估计器:\n", model.best_estimator_)# 交叉验证的平均得分:cv_results_['mean_test_score']print("交叉验证的平均得分:\n", model.cv_results_['mean_test_score'])# 超参数的所有组合:model.cv_results_['params']print("超参数的所有组合:\n", model.cv_results_['params'])# 交叉验证结果:cv_results_print("交叉验证结果:\n", model.cv_results_)

3、模型保存与加载

  • joblib 是一个 Python 库,主要用于并行计算和持久化存储(即保存和加载)大型 NumPy 数组和模型。joblib 提供了 dumpload 两个函数,用于保存和恢复 Python 对象,特别是机器学习模型

函数名参数说明
joblib.dump()obj:要保存的对象 filename:保存文件的路径将 Python 对象保存到磁盘文件中。它可以有效地压缩数据,并且支持并行写入,适合用于保存大型数据集或模型
joblib.load()filename:保存对象的文件路径从磁盘文件中恢复之前保存的对象

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

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

相关文章

vue+Django农产品推荐与价格预测系统、双推荐+机器学习预测+知识图谱

vueflask农产品推荐与价格预测系统、双推荐机器学习价格预测知识图谱文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处!编号: D010 技术架构: vueflaskmysqlneo4j 核心技术: 基…

数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(下篇)

衔接上篇文章:数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(上篇)(十一)数组的组合核心功能:一、生成基数组np.arange().reshape() 基础运算功能&…

负载因子(Load Factor) :哈希表(Hash Table)中的一个关键性能指标

负载因子(Load Factor) 是哈希表(Hash Table)中的一个关键性能指标,用于衡量哈希表的空间利用率和发生哈希冲突的可能性。一:定义负载因子(通常用希腊字母 λ 表示)的计算公式为&…

监控插件SkyWalking(一)原理

一、介绍 1、简介 SkyWalking 是一个 开源的 APM(Application Performance Monitoring,应用性能监控)和分布式追踪系统,主要用于监控、追踪、分析分布式系统中的调用链路、性能指标和日志。 它由 Apache 基金会托管,…

【接口自动化测试】---自动化框架pytest

目录 1、用例运行规则 2、pytest命令参数 3、pytest配置文件 4、前后置 5、断言 6、参数化---对函数的参数(重要) 7、fixture 7.1、基本用法 7.2、fixture嵌套: 7.3、请求多个fixture: 7.4、yield fixture 7.5、带参数…

Flink Stream API 源码走读 - socketTextStream

概述 本文深入分析了 Flink 中 socketTextStream() 方法的源码实现,从用户API调用到最终返回 DataStream 的完整流程。 核心知识点 1. socketTextStream 方法重载链 // 用户调用入口 env.socketTextStream("hostname", 9999)↓ 补充分隔符参数 env.socket…

待办事项小程序开发

1. 项目规划功能需求:添加待办事项标记完成/未完成删除待办事项分类或标签管理(可选)数据持久化(本地存储)2. 实现功能添加待办事项:监听输入框和按钮事件,将输入内容添加到列表。 标记完成/未完…

【C#】Region、Exclude的用法

在 C# 中,Region 和 Exclude 是与图形编程相关的概念,通常在使用 System.Drawing 命名空间进行 GDI 绘图时出现。它们主要用于定义和操作二维空间中的区域(几何区域),常用于窗体裁剪、控件重绘、图形绘制优化等场景。 …

机器学习 - Kaggle项目实践(3)Digit Recognizer 手写数字识别

Digit Recognizer | Kaggle 题面 Digit Recognizer-CNN | Kaggle 下面代码的kaggle版本 使用CNN进行手写数字识别 学习到了网络搭建手法学习率退火数据增广 提高训练效果。 使用混淆矩阵 以及对分类出错概率最大的例子单独拎出来分析。 最终以99.546%正确率 排在 86/1035 …

新手如何高效运营亚马逊跨境电商:从传统SP广告到DeepBI智能策略

"为什么我的广告点击量很高但订单转化率却很低?""如何避免新品期广告预算被大词消耗殆尽?""为什么手动调整关键词和出价总是慢市场半拍?""竞品ASIN投放到底该怎么做才有效?""有没有…

【论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架】

论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架​1&&2. 摘要&&引言3.方法3.1 整体架构3.2 多模态特征池3.3 补充特征注入器3.4 适配器调优范式4 实验4.1 RGB-IR 目标检测4.2 RGB-IR 语义分割4.3 RGB-IR 显著目…

Hyperf 百度翻译接口实现方案

保留 HTML/XML 标签结构,仅翻译文本内容,避免破坏富文本格式。采用「HTML 解析 → 文本提取 → 批量翻译 → 回填」的流程。百度翻译集成方案:富文本内容翻译系统 HTML 解析 百度翻译 API 集成 文件结构 app/ ├── Controller/ │ └──…

字节跳动 VeOmni 框架开源:统一多模态训练效率飞跃!

资料来源:火山引擎-开发者社区 多模态时代的训练痛点,终于有了“特效药” 当大模型从单一语言向文本 图像 视频的多模态进化时,算法工程师们的训练流程却陷入了 “碎片化困境”: 当业务要同时迭代 DiT、LLM 与 VLM时&#xff0…

配置docker pull走http代理

之前写了一篇自建Docker镜像加速器服务的博客,需要用到境外服务器作为代理,但是一般可能没有境外服务器,只有http代理,所以如果本地使用想走代理可以用以下方式 临时生效(只对当前终端有效) 设置环境变量…

OpenAI 开源模型 gpt-oss 本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss,这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说,这意味着我们终于可以在自己的机器上,完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows和Linux…

力扣-5.最长回文子串

题目链接 5.最长回文子串 class Solution {public String longestPalindrome(String s) {boolean[][] dp new boolean[s.length()][s.length()];int maxLen 0;String str s.substring(0, 1);for (int i 0; i < s.length(); i) {dp[i][i] true;}for (int len 2; len …

Apache Ignite超时管理核心组件解析

这是一个非常关键且设计精巧的 定时任务与超时管理组件 —— GridTimeoutProcessor&#xff0c;它是 Apache Ignite 内核中负责 统一调度和处理所有异步超时事件的核心模块。&#x1f3af; 一、核心职责统一管理所有需要“在某个时间点触发”的任务或超时逻辑。它相当于 Ignite…

DAY 42 Grad-CAM与Hook函数

知识点回顾回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例# 定义一个存储梯度的列表 conv_gradients []# 定义反向钩子函数 def backward_hook(module, grad_input, grad_output):# 模块&#xff1a;当前应用钩子的模块# grad_input&#xff1a;模块输入的梯度…

基于 NVIDIA 生态的 Dynamo 风格分布式 LLM 推理架构

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

《吃透 C++ 类和对象(中):拷贝构造函数与赋值运算符重载深度解析》

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…