机器学习之过拟合与欠拟合,K折交叉验证详解【含代码】

news2024/11/19 4:19:47

欠拟合

欠拟合(Underfitting)是机器学习和统计学中的一个术语,描述了模型在训练数据和新数据(如测试数据或验证数据)上都表现不佳的情况。换句话说,欠拟合的模型没有足够地“学习”或“捕捉”数据中的模式和结构。

欠拟合的主要特征和原因包括:

  • 模型过于简单:例如,尝试使用线性模型来拟合非线性数据。

  • 训练时间不足:对于需要长时间训练的模型(如深度学习模型),如果训练时间太短,模型可能没有足够的机会学习数据的特征。

  • 不足够的特征:如果只使用了部分相关特征进行训练,或者提取的特征无法很好地代表数据,模型可能会出现欠拟合。

  • 模型参数设置不当:例如,决策树的最大深度设置得太浅,或正则化参数设置得过高。

如何检测和解决欠拟合:

检查模型在训练和测试数据上的性能:欠拟合的模型通常在这两者上都会表现得不太好。

选择更复杂的模型:如果使用的是简单模型,考虑使用更复杂的模型或添加更多的特征。

增加特征:添加更多的特征,或者使用特征工程方法来构造新的特征。

减少正则化:如果使用了正则化技术(如L1或L2正则化),可以考虑减少正则化强度或完全去掉。

增加训练时间:对于需要长时间训练的模型,增加迭代次数或训练时间。

获取更多的数据:有时,数据太少,无法充分代表整体分布,增加更多的训练数据可以有助于改善模型的性能。

总的来说,欠拟合意味着模型没有足够地学习数据,解决的关键通常是使模型更加复杂或为其提供更多的信息。

过拟合

过拟合(Overfitting)是机器学习中的一个常见问题,描述的是模型过度地“学习”训练数据,包括其中的噪声和异常值,从而导致其在新的、未见过的数据上表现不佳。

过拟合的主要特征和原因包括:

  • 模型过于复杂:例如,拥有大量参数的深度神经网络,或深度很深的决策树。

  • 训练数据量不足:与模型的复杂性相比,如果训练数据不足,模型可能会过度拟合。

  • 数据噪声:如果训练数据包含错误或噪声,模型可能会尝试拟合这些噪声。

  • 不必要的特征:如果包含许多与目标输出无关的特征,它们可能会导致过拟合。

如何检测和解决过拟合:

训练/验证曲线:通过观察模型在训练和验证数据上的性能,可以发现过拟合。特征是:训练误差低,但验证误差高。

交叉验证:使用交叉验证来估计模型在新数据上的性能。

正则化:使用L1或L2正则化可以约束模型的复杂性,并防止过拟合。

简化模型:选择一个简化版本的模型,例如,减少神经网络的层数或神经元数量,或限制决策树的深度。

早停:在训练深度学习模型时,当验证误差不再减少或开始增加时,停止训练。

数据增强:对训练数据进行小的修改以创建新的训练样本。这在图像识别任务中尤其有效。

丢弃法(Dropout):在训练深度学习模型时,随机丢弃一些神经元,可以作为正则化手段,减少过拟合。

增加训练数据:如果可能的话,获取更多的训练数据可以帮助减少过拟合。

特征选择:通过选择与目标输出最相关的特征,可以减少模型的复杂性。

总的来说,过拟合意味着模型在训练数据上表现得太好,以至于失去了泛化到新数据上的能力。解决过拟合的关键是平衡模型的复杂性与其在训练数据上的性能,同时考虑到其在未见过的数据上的性能。

权重衰退通常与L2正则化(Ridge正则化)等价。事实上,上面的惩罚项实际上就是L2范数正则化。当我们讨论权重衰退时,我们通常指的是在深度学习模型中添加L2正则化。

K折交叉验证

  1. 基本概念:

K折交叉验证是一种评估模型性能的方法。在这种方法中,训练数据被分割为K个子集(或称为“折”)。每次迭代,其中一个子集被用作测试集,而其他K-1个子集组合成训练集。这个过程会重复K次,每个子集都有一次机会作为测试集。最后,得到的K个模型的评估指标(如准确率)的平均值被用作总体的模型评估。
2. 步骤:

数据分割:将整个数据集随机分割成K个大小大致相同的非重叠子集。
模型训练与评估:对于每一折:
    将这一折作为测试集,其余的K-1折组合作为训练集。
    使用训练集训练模型。
    使用测试集评估模型。
    记录评估指标。
计算平均指标:计算K次评估得到的指标的平均值。这个平均值被用作模型的整体评估指标。
  1. 优点:

    减少偶然性:因为每个数据点都有机会出现在训练集和测试集中,所以K折交叉验证提供了一个关于模型性能更稳健的估计。
    利用数据:尤其在数据较少的情况下,K折交叉验证能够更充分地利用可用数据进行模型训练与评估。

  2. 缺点:

    计算成本:需要训练K次模型,所以计算成本高于简单的数据分割方法。
    不适用于所有数据分布:如果数据集有特定的结构或分布,可能需要使用分层K折交叉验证或其他变种。

  3. 变体:

    分层K折交叉验证(Stratified K-Fold):在每个折中,每个类的数据比例与整体数据集中的比例大致相同。这在类分布不均匀的情况下尤其有用。
    时间序列交叉验证:对于时间序列数据,确保训练集中的时间点始终早于测试集中的时间点。

  4. 使用场景:

    模型评估:评估单一模型的性能。
    模型选择:在不同的模型或算法之间进行选择。
    参数调优:找到模型的最佳参数设置。

总之,K折交叉验证是一种评估和改进模型性能的强大工具,它可以帮助研究者或数据科学家在训练过程中避免过拟合,从而建立一个更泛化的模型。

利用网格搜索和K折交叉验证优化参数

# 导入所需库
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import accuracy_score

# 加载数据
data = load_iris()
X = data.data
y = data.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 设置随机森林的参数范围
param_grid = {
    'n_estimators': [10, 50, 100, 150],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'bootstrap': [True, False]
}

# 初始化随机森林分类器
rf = RandomForestClassifier()

# 使用GridSearchCV进行网格搜索与K折交叉验证
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, 
                           cv=5, n_jobs=-1, verbose=2)

# 拟合模型
grid_search.fit(X_train, y_train)

# 获取最佳参数
best_params = grid_search.best_params_
print("最佳参数:", best_params)

# 使用最佳参数的模型进行预测
best_rf = grid_search.best_estimator_
y_pred = best_rf.predict(X_test)

# 计算并输出准确度
accuracy = accuracy_score(y_test, y_pred)
print("测试集准确度:", accuracy)

当网格搜索完成后,你可以使用best_params_属性获取最佳的参数组合,并使用best_estimator_获取相应的模型。

但是这种有时候计算资源非常大,而且效果不好,无法达到最优,有时候也是劣势的局部最优,这类情况如果是有参数的一个确定的范围数值之后,可以采取。

所以一般我喜欢采取单个的参数进行寻优,逐步的优化,在单个参数达到我们定义的空间的局部最优的时候,在进行下一步

K折交叉验证不仅仅适用于多参数的网格搜索,也适用于单个参数的调优。其目的是为了提供对模型在未见数据上性能的一个更稳健的估计,从而帮助我们选择更好的参数。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

# 加载数据
data = load_iris()
X = data.data
y = data.target

# 对不同的n_estimators值进行交叉验证
n_estimators_options = [10, 50, 100, 150, 200]
for n_estimators in n_estimators_options:
    rf = RandomForestClassifier(n_estimators=n_estimators)
    scores = cross_val_score(rf, X, y, cv=5)
    print(f'n_estimators: {n_estimators}, 交叉验证平均准确率: {np.mean(scores)}')

之后,你就可以采取取平均值,用来判断参数的最佳值是多少

一般而言,交叉验证在参数优化和模型的评估用的比较多

在这里插入图片描述

每文一语

适应中学习

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

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

相关文章

力扣刷题 day42:10-12

1.最大正方形 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。 方法一:动态规划 #方法一:动态规划 def maximalSquar(matrix):dp[[0]*(len(matrix[0])1) for i in range(len(matrix)1)] #dp[i][j…

十三、【画笔工具组】

文章目录 画笔工具铅笔工具颜色替换工具混合器画笔工具 画笔工具跟混合器画笔工具,是我们平时使用频率较高的两款工具: 画笔工具 可以把画笔工具看成我们用的毛笔,使用时可以在拾色器里边选择我们需要的画笔颜色,可以把拾色器当做我们画画时用的一个颜料盘&#xf…

健效达海豚妈妈儿保项目推介会盛大启幕,聚焦互联网+精准医疗

2023年10月12日,由上海健启星科技发展有限公司和北京安智因生物技术有限公司联合主办的“2023互联网精准医学平台助力基层医疗|海豚妈妈儿保项目推介会”在中国苏州盛大启幕。 本次项目推介会得到国内行业专家、权威学者、国内知名三甲名医教授、头部企业、学术大咖…

grafana接入OpenTSDB设置大盘语法

目录 1、filter过滤语法1.1 精准匹配1.2 正则匹配1.3 通配符匹配 完整示例1、 展示应用app的CPU利用率监控2)展示应用app的在线核数 1、filter过滤语法 1.1 精准匹配 literal_or : tagv的过滤规则: 精确匹配多项迭代值,多项迭代值以’|分隔&a…

【面试经典150 | 哈希表】两数之和

文章目录 Tag题目来源题目解读解题思路方法一:暴力枚举方法二:哈希表 写在最后 Tag 【哈希表】【数组】 题目来源 1. 两数之和 题目解读 给定一个下标从 1 开始按照 非递减顺序排列 的整数数组 numbers,找出两数之和等于 target 的两个数&…

软件测试学习(五)

报告发现的问题 设法修复软件缺陷 ●没有足够的时间。在任何一个项目中,通常是软件功能太多,而代码编写人员和软件测试人员太少,而且进度中没有留出足够的空间来完成项目。假如你正在制作税务处理程序,4月15日 (赶在应付税务检查…

计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

枚举探秘:Java中的神奇力量!

在 Java 枚举出现之前,通常会使用常量类来表示一组固定的常量值,直到Java 1.5之后推出了枚举,那么枚举类型有哪些特点,它比常量类又好在哪里呢。 本文将分析一下枚举的特点及用法。 一、什么是枚举 Java 枚举(Enum&a…

leetcode 75. 颜色分类

2023.10.13 题目不让用sort方法&#xff0c;所以先用冒泡排序做了一下&#xff1a; 冒泡排序 class Solution {public void sortColors(int[] nums) {for(int i0; i<nums.length-1; i){for(int j0; j<nums.length-1; j){if(nums[j] > nums[j1]){int temp nums[j];n…

嵌入式实训室建设方案

嵌入式实训室概述 随着物联网和人工智能的快速发展,嵌入式技术迎来了发展机遇的同时,也给高校的嵌入式系统课程带来了挑战。嵌入式系统具有体积小、功能强、可靠性高等特点,已经广泛应用于各个领域,深入人们生活方方面面,对应培养多样化、高端化人才的需求。因此,越来越多高校…

信号弹图像立体匹配算法研究

目录 摘 要............................................. 3 第一章 绪论................................... 6 1.1 研究课题背景.......................... 6 1.2 立体匹配技术国内外发展现状............ 7 1.3 课题研究的目的...............…

代码随想录算法训练营第天十九天丨 二叉树part06

654.最大二叉树 思路 最大二叉树的构建过程如下&#xff1a; 对于这道题&#xff0c;思路整体模仿的是昨天的 根据中后序遍历构造二叉树 的解题思路。 直接看代码&#xff1a; class Solution {//用于快速查找private Map<Integer,Integer> map;public TreeNode cons…

3.6 空值的处理

思维导图&#xff1a; **3.6 空值的处理** 在前面的章节中&#xff0c;我们已经多次接触到了空值&#xff08;NULL&#xff09;的概念及其处理方式。在这一节中&#xff0c;我们将系统性地深入探讨空值的问题。 **定义&#xff1a;** 空值表示“不知道”、“不存在”或“无意…

云计算是什么?学习云计算能做什么工作?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…

介绍使用Photoshop制作ico图标

文章目录 说在前面安装制作插件制作ico 说在前面 Photoshop可以通过ICOFormat.8bi插件生成ico&#xff0c;但需要我们自行安装&#xff0c;安装过程很简单。 安装制作插件 下载地址&#xff1a; http://www.telegraphics.net/sw/ 下载完后解压文件得到下面这样的文件&#…

MySQL数据库的基本操作一

目录 什么是MySQL数据库? 数据库的基本操作 数据库操作 表操作 MySQL的增删改查 插入操作 查找操作 修改操作 删除操作 什么是MySQL数据库? MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于 Oracle 公司。MySQL 是一种关…

Zalo是什么?海外推广怎么做?

zalo是一款海外流行的通讯软件&#xff0c;2012年正式发布&#xff0c;至今已经拥有约2亿的用户&#xff0c;分别在越南、美国、缅甸、日本、台湾、泰国、韩国、马来西亚、沙乌地阿拉伯、安哥拉、斯里兰卡、捷克、俄罗斯地区上架。 zalo的越南用户数量很多&#xff0c;是越南地…

实操指南|如何用 OpenTiny Vue 组件库从 Vue 2 升级到 Vue 3

前言 根据 Vue 官网文档的说明&#xff0c;Vue2 的终止支持时间是 2023 年 12 月 31 日&#xff0c;这意味着从明年开始&#xff1a; Vue2 将不再更新和升级新版本&#xff0c;不再增加新特性&#xff0c;不再修复缺陷 虽然 Vue3 正式版本已经发布快3年了&#xff0c;但据我了…

c++视觉处理---直方图均衡化

直方图均衡化 直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分布图像的像素值&#xff0c;以使图像的直方图变得更均匀&#xff0c;从而提高图像的视觉质量。在OpenCV中&#xff0c;您可以使用 cv::equalizeHist 函数来执行直方图均衡化。以下是 cv::equal…

Xcode 14.3.1build 报错整理

1、Command PhaseScriptExecution failed with a nonzero exit code 2、In /Users/XX/XX/XX/fayuan-mediator-app-rn/ios/Pods/CocoaLibEvent/lib/libevent.a(buffer.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/XX/XX/XX/fayuan…