应用机器学习的建议

news2024/11/16 1:57:51

一、决定下一步做什么

        在你得到你的学习参数以后,如果你要将你的假设函数放到一组新的房屋样本上进行测试,假如说你在预测房价时产生了巨大的误差,你想改进这个算法,接下来应该怎么办?实际上你可以考虑先采用下面的几种方法:

  1. 获得更多的训练实例

  2. 尝试减少特征的数量

  3. 尝试获得更多的特征

  4. 尝试增加多项式特征

  5. 尝试减少正则化程度\lambda

  6. 尝试增加正则化程度\lambda

我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。“诊断法”的意思是这是一种测试法,你通过执行这种测试,能够深入了解某种算法到底是否有用,这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试才是有意义的

二、评估一个假设

        在本节内容中我想介绍一下怎样用你学过的算法来评估假设函数,在之后的内容中,我将以此为基础来讨论如何避免过拟合和欠拟合的问题

        当我们确定学习算法的参数的时候,我们考虑的是选择参数来使训练误差最小化,有人认为得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差,并不能说明它就一定是一个好的假设函数,而且我们也学习了过拟合假设函数的例子,所以这推广到新的训练集上是不适用的。

        那么,你该如何判断一个假设函数是过拟合的呢?对于某个简单的例子,我们可以对假设函数h(x)进行画图,然后观察图形趋势,但对于特征变量不止一个的一般情况,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现,因此,我们需要另一种方法来评估我们的假设函数。为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集,很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:

  • 对于线性回归模型,我们利用测试集数据计算代价函数J

  • 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:

  • 还可以对于每一个测试集实例计算误分类的比例:

    然后对计算结果求平均

三、模型选择和交叉验证集

假设我们要在10个不同次数的二项式模型之间进行选择:

显然次数越高的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型,因此我们需要使用交叉验证集来帮助选择模型,即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集

模型选择的方法为:

  1. 使用训练集训练出10个模型

  2. 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)

  3. 选取代价函数值最小的模型

  4. 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)

 

四、诊断偏差和方差

推荐一篇写得很好的关于偏差和方差的文章:机器学习 -偏差与方差 - 知乎

        当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。那么这两种情况,哪个和偏差有关,哪个和方差有关,或者是不是和两个都有关?搞清楚这一点非常重要,因为能判断出现的情况是这两种情况中的哪一种其实是一个很有效的指示器,指引着可以改进算法的最有效的方法。

Bias(偏差):用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异

Variance(方差):是不同的训练数据集训练出的模型输出值之间的差异

我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:(d:多项式的最高次数)

对于训练集,当 d 较小时,模型拟合程度更低,误差较大;随着 d 的增长,拟合程度提高,误差减小;对于交叉验证集,当 d 较小时,模型拟合程度低,误差较大;但是随着 d 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候

根据上面的图表,我们知道:

训练集误差和交叉验证集误差近似时:高偏差/欠拟合

交叉验证集误差远大于训练集误差时:高方差/过拟合

五、正则化和偏差/方差

        在我们训练模型的过程中,一般会使用一些正则化方法来防止过拟合,但是我们可能会正则化的程度太高或太小了,即我们在选择λ的值时也需要思考与刚才选择多项式模型次数类似的问题

我们选择一系列的想要测试的\lambda值,通常是 0-10之间的呈现2倍关系的值,如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共12个),我们同样把数据分为训练集、交叉验证集和测试集

选择\lambda的方法为:

  1. 使用训练集训练出12个不同程度正则化的模型

  2. 用12个模型分别对交叉验证集计算的出交叉验证误差

  3. 选择得出交叉验证误差最小的模型

  4. 运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:

• 当$\lambda$较小时,训练集误差较小而交叉验证集误差较大

• 随着 $\lambda$的增加,训练集误差不断增加,而交叉验证集误差则是先减小后增加

六、学习曲线

        学习曲线就是一种来判断某一个学习算法是否处于偏差、方差问题的很好的工具,学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(m)的函数绘制的图表。如果我们有100行数据,我们从1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据

 

如何利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观,也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助

如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果,也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果

七、回答开头的问题

        我们已经介绍了怎样评价一个学习算法,我们讨论了模型选择问题、偏差和方差的问题。那么这些诊断法怎样帮助我们判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的呢?让我们再次回到最开始的例子在那里寻找答案,回顾开头提出的六种可选的下一步,让我们来看一看我们在不同的情况下应该怎样选择:

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

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

相关文章

「QT」QString类的详细说明

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「

并查集:连通块中点的数量

import java.io.*; import java.util.Scanner;public class Main{static int N 100010;static int[] p new int[N]; //存储每个节点的父亲节点,一开始默认p[i]i;static int[] size new int[N]; //存储每个连通块里含有多少个节点static BufferedReader in new BufferedR…

数学知识第二期 约数

前言 约数也是很重要的基础数学知识,希望大家能够完全掌握!!! 一、约数的知识 简介 约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,就说a能被b整除,或b能整除a。a称为b的…

【Java与网络6】实现一个自己的HTTP浏览器

前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理,本文我们来整个大活:自己实现一个简单的浏览器。 目录 1.主线程循环体 2.readHostAndPort()方法的实现 3.readHttpRequest()方法的实现 4.sendHttpRequest()方法的实现 5.readHttpRespons…

vector迭代器失效

目录 迭代器失效的场景 insert插入元素时迭代器失效 erase删除元素时迭代器失效 本期我们主要进行vector迭代器失效问题的讨论。 迭代器失效的场景 insert插入元素时迭代器失效 先看代码: iterator insert(iterator pos, T val){assert(pos > _start);ass…

不知道如何批量处理图片

你是否曾经遇到过需要批量处理大量图片的情况?例如,需要将多张图片转换为统一格式、调整大小或进行美化处理。这种时候,如果一张张手动处理,不仅效率低下,还容易出错。那么,有没有一种方法可以快速、准确地…

web前端项目-动画特效【附源码】

文章目录 一:赛车游戏动画HTML源码:JS源码:CSS源码:(1)normalize.css(2)style.css 二:吉普车动画演示HTML源码:CSS源码:(1&#xff09…

matlab对负数开立方根得到虚数的解决方案

问题描述:在matlab中,对负数开立方根,不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​,我们知道其实数解是-3,但在matlab中的计算结果如下: 问题原因:matlab中的立方根运算是在…

仅使用 Python 创建的 Web 应用程序(前端版本)第08章_商品详细

在本章中,我们将实现一个产品详细信息页面。 完成后的图像如下。 Model、MockDB、Service都是在产品列表页实现的,所以创建步骤如下。 No分类内容1Page定义PageId并创建继承自BasePage的页面类2Application将页面 ID 和页面类对添加到 MultiPageApp 的页面中Page:定义PageI…

项目管理平台

技术架构: MySQL、Servlet、JSP 功能模块: 从管理员角度看: 用户登入系统后,可以修改管理员的密码。同时具有以下功能: 1、管理员可以管理具体项目信息。 2、管理员可以管理项目经费信息。 3、管理员可以管理项目资源信息。 4、…

确定软件项目范围基准 5个重点

软件项目范围基准明确了项目的边界、目标和主要交付成果,有助于提高项目成本、进度和资源估算的准确性,便于实施项目控制,而且还可以帮助我们清楚分派责任,防止范围蔓延,从而提升项目的成功率。 如果没有明确确定范围基…

Hive实战 —— 电商数据分析(全流程详解 真实数据)

目录 前言需求概述数据清洗数据分析一、前期准备二、项目1. 数据准备和了解2.确定数据粒度和有效列3.HDFS创建用于上传数据的目录4.建库数仓分层 5.建表5.1近源层建表5.2. 明细层建表为什么要构建时间维度表?如何构建时间维度表? 5.3 轻聚层建表6. 指标数…

transformer架构的理解

一、transformer 架构 如上图所示,transformer(形状像变压器?或者翻译成变形金刚,由不同模块拼装而成)的架构左边是n个结构体相同的编码器(例如,原论文是6个编码器的串联)&#xff0…

第6章 python深度学习—第6章(波斯美女)

第6章 深度学习用于文本和序列 6.1 处理文本数据 与其他所有神经网络一样,深度学习模型不会接收原始文本作为输入,它只能处理数值张量。 文本向量化(vectorize)是指将文本转换为数值张量的过程。它有多种实现方法。 将文本分割…

迪文串口屏文本显示的使用

一、使用背景 由于迪文屏的数据变量显示功能不能显示字母类等字符,比如屏幕上要显示期日时间格式为2024-1-27 11:22:20,则不适合用数据变量显示,此时可以使用文本显示功能。 二、实现过程 1、首先查看迪文屏的使用手册DGUSII 应用开发指南…

两个近期的计算机领域国际学术会议(软件工程、计算机安全):欢迎投稿

近期,受邀担任两个国际学术会议的Special session共同主席及程序委员会成员(TPC member),欢迎广大学界同行踊跃投稿,分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…

【投稿优惠|EI优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024)

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024) 2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024) 一、【会议简介】 随着全球能源需求的不断增长,清洁能源的研究与应用成为了国际…

【leetcode题解C++】144. 94. 145.二叉树前序、中序、后序遍历 and 102.二叉树的层序遍历

144. 二叉树前序遍历 给出一个根节点,返回前中后序遍历的结果的。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root…

vue3 npm i 一直卡到不动

一. 首先node 版本要18.0及以上 查看node版本并安装指定版本 二. 查看npm镜像源以及指定安装npm的镜像 三. 删除项目中的package-lock.json文件 最好是把node_modules安装包也删除掉,然后npm i 就可以了

js打地鼠

文章目录 1实现效果2代码实现 1实现效果 游戏难度:简单,一般,困难,噩梦(控制setInterval的time参数) 按钮功能:结束(可以通过修改gameScore的值来修改判定结束的分数)&am…