利用学习曲线诊断机器学习算法

2024-06-15 17:08

本文主要是介绍利用学习曲线诊断机器学习算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019/04/21

引言

前几天的时候,在吴恩达的那本机器学习书上看到了这个内容,联想到最近在做的这个实验,的确是那种过拟合的趋势,所以就想着把这个部分来学习一下,然后找到解决方案来缓解我这边的这个症结。

初步的学习

(前端时间也说了,我记笔记一直是按照资源管理的方式来记录的,这样不好,应该记下来自己的见解 2019/04/21)
在以往教科书式的学习过程中,我们都被图1、图2这种形式被教导过拟合与欠拟合的概念。

图1 - 过拟合与欠拟合

 

图2 - 模型复杂度与分数

但是实际情况是,高维数据情况下看不到曲线穿过各个点的形式,很多算法的模型复杂度也并不能量化,最终导致你没办法看到上述的两个图。平时做的更多的是,根据某个参数的调整,来查看类似上述的图像,也不失为一种有效的办法,但在参数较多的时候,又陷入了高维数据无法可视化的困难。
但学习曲线可以帮助你完成这个类似的目标,通过将训练数据的个数作为横轴,将训练误差与测试误差随横轴变化的两条曲线分别画出来,就能很好的模拟出来这种曲线,如图3所示。

图3-学习曲线(代码就是sklearn中的示例源码)


图3是我在做实验的时候,生成的一个图。当时调整了一个类似惩罚因子的参数,本来过拟合的图就变成了这样。
对于过拟合与欠拟合的概念,还有什么bias vs variance什么的,这里就不在赘述了。我觉得,掌握这个内容,单单就是从书上那点内容,通过图1、图2来讲解这整个内容根本不够,最重要的还是找一个真实的数据集来展示出来这个过程。
文章[1]从最基础的内容开始,按照实验步骤,将过拟合与欠拟合、学习曲线、验证曲线的内容都给介绍了出来。
欠拟合:高bias,需要提高模型复杂度,学习曲线展现为,测试误差与训练误差逐渐重合,并且数值较大,如图4所示。

图4-欠拟合[1]


过拟合:高variance,需要降低模型复杂度,学习曲线展现为,训练误差很低,非常平稳,但测试误差要高的多,特别是随着数据集大小的提升,测试误差也趋于平稳,如图5所示

图5-过拟合

 

深入探讨

在吴恩达的那本机器学习书籍中,对于这部分内容进行了详细的探讨,包括哪些部分的误差是bias,哪些部分是variance,重点应该放在他提供的解决方案上,文章[3]算是一个简版的说明,在进行区分的时候,主要集中在两种情况:高bias,高variance。

学习资源

文章[1]的内容,作为比较基础的介绍,配有相应的代码,非常适合入门学习;文章[2]也是简单的介绍,他提出的一个见解是,利用学习曲线来诊断是否是具有代表性的数据集;文章[4]应该是他学了了吴恩达的课程,然后凝练出来的一些关键点。


2019/07/20 实际情况的解释
下面这几篇文章,我也多读了几篇,然后这次也一直在做相应的实践。然后就是发现这个东西涵盖的内容还是非常多的。单单从什么过拟合和欠拟合的角度来解决这个问题,貌似并不是非常奏效,可能有很大一部分原因,是因为那部分数据就是很尴尬,所以再也调整不上去了。文章[3]算是解释的比较清楚得了。

解决方案

文章[4]中上述这个图片,基本上算是把所有的就觉方案都给提出来了把。
然后就是一个比较关键的部分,你的数据有些部分的内容他就是容易分错,可能是因为特征不好,也可能是因为他属于小概率的类别,正如文献[4]中所说,他的预测概率一直在0.5之间。

参考文献

[1]week6-andrew-ng-machine-learning-with-python.html
[2]learning-curves-for-diagnosing-machine-learning-model-performance
[3]learning-curves-machine-learning/
[4]machine-learning-diagnostics

这篇关于利用学习曲线诊断机器学习算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064056

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert