机器学习相关建议

news/2024/10/30 19:37:07/

1、开发机器学习系统或者优化的路径

  • 训练数据量的增加对机器学习系统的影响
  • 增加特征集或减少特征集
  • 改变正则化参数
  • 尝试增加多项式特征
    | 高偏差、欠拟合 | 高方差、过拟合 |
    | ------------------ | ------------------------------ |
    | 尝试增加多项式特征 | 尝试减少特征的数量 |
    | 尝试减少正则化程度 | 获得更多的训练实例 |
    | 尝试获得更多的特征 | 尝试增加正则化程度 λ |

    由于方法太多且无法确定上述方法对算法优化是否有很大的帮助,因此我们尝可以评估机器学习算法的性能。方法如下:

1.1评估假设(防止过拟合或欠拟合)

​ 为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数𝐽
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以计算误分类的比率,对于每一个测试集实例,计算:

在这里插入图片描述

然后对计算结果求平均。

1.2选择合适的模型

一般越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集的模型可能导致过拟合,我们应该选择一个更能适应一般情况的模型。一般使用交叉验证集来帮助选择合适的模型。

如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集,这三个集合不能有交集,常见的比例是8:1:1。需要注意的是,通常都会给定训练集和测试集,而不会给验证集。这时候验证集该从哪里得到呢?一般的做法是,从训练集中均匀随机抽样一部分样本作为验证集。
之所以出现交叉验证,主要是因为训练集较小。无法直接像前面那样只分出训练集,验证集,测试就可以了(简单交叉验证)。

需要说明的是,在实际情况下,人们不是很喜欢用交叉验证,主要是因为它会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。但这也是根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。

交叉验证集:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集

模型选择的方法为:

  1. 使用训练集训练出 10 个模型
  2. 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
  3. 选取代价函数值最小的模型
  4. 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)

1.3诊断偏差和方差

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

训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合

1.4正则化和偏差/方差

正则化可防止出现过拟合状况,但是无法选出合适的正则参数𝜆 。选择一系列的想要测试的 𝜆 值,通常是 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 个)。我们同样把数据分为训练 集、交叉验证集和测试集。
在这里插入图片描述

选择𝜆的方法为:
1.使用训练集训练出 12个不同程度正则化的模型;
2.用 12个模型分别对交叉验证集计算的出交叉验证误差;
3.选择得出交叉验证误差最小的模型;
4.运用步骤 3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ的值绘制在一张图表上。
在这里插入图片描述

当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大;
随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加。

1.5学习曲线

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

利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:
在这里插入图片描述

在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。

利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并
且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数
据可以提高模型的效果
![[1681222867703.png]]

在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

1.6神经网络的偏差和方差

使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小;使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。

2、机器学习系统的设计

2.1 误差分析

构建一个学习算法的推荐方法为:

  1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法;
  2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择;
  3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势。
    以垃圾邮件分类器算法为例:误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。

2.2 类偏斜的误差度量

设定某个实数来评估你的学习算法,并衡量它的表现,即为误差度量值。就使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。

类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。

例如用算法来预测癌症是否是恶性的,在我们的训练集中,只有 0.5%的实例 是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。然而我们通过训练而得到的神经网络算法却有 1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
查准率(Precision)和查全率(Recall) 我们将算法预测的结果分成四种情况:

  1. 正确肯定(True Positive,TP):预测为真,实际为真
  2. 正确否定(True Negative,TN):预测为假,实际为假
  3. 错误肯定(False Positive,FP):预测为真,实际为假
  4. 错误否定(False Negative,FN):预测为假,实际为真
    则:查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
    查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
    ![[1681284408490.png]]

2.3 查准率和查全率之间的权衡

对于上述预测肿瘤的例子中,假使,我们的算法输出的结果在 0-1 之间,我们使用阀值 0.5 来预测真和假。

如果想要高的查准率,我们可以使用比 0.5更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果想要高的查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5更小的阀值,如 0.3。
通过以下公式确定合适的阈值,选使F1最高的阈值。
F1Score=2∗PRP+RF1Score=2* \frac{PR}{P+R} F1Score=2P+RPR


http://www.ppmy.cn/news/42112.html

相关文章

知识图谱嵌入方法-transE

目录 一、知识图谱嵌入 二、transE算法 三、缺点 一、知识图谱嵌入 知识图谱(Knowledge Graph,KG) 是大规模语义网络知识库,利用三元组(实体,关系,实体)来描述具体的知识,其具有语义丰富、结…

工作中英语学习的几个阶段

1. 学习英语的几个阶段 在汽车行业中,英语是一种重要的工作语言。为了更好地掌握这个行业,我们需要了解英语熟练度的几个等级。英语熟练度通常被分为以下几个等级: 初级水平:能够理解常见的日常用语和简单的句子。在沟通中需要依…

【Vue】学习笔记-事件处理

事件的基本用法 使用v-on:xxx 或xxx 绑定事件,其中xxx是事件名事件的回调需要配置在methods对象中,最终会在vm上methods中配置的函数,不要用箭头函数,否则this就不是vm了methods中配置的函数,都是被vue所管理的函数。…

Amazon 中国区配置 PingIdentity 身份集成实现 Redshift 数据库群集单点登录

无疑使用单点登录 (SSO)访问组织中的多种应用程序能够提升用户体验 。 如果您负责为 Amazon Redshift 启用 SSO,则可以使用 ADFS、PingIdentity、Okta、Azure AD 或其他基于 SAML 浏览器的身份提供程序设置 SSO 身份验证。 这篇文章向您展示了如何将 PingOne 设置为…

Redis篇之五大数据类型

1、五大数据类型 4.1、String(字符串) String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象…

【Java实验】继承

目录 任务一 扩充类 1. 扩充Shape类族,创建椭圆Ellipse类 2. 创建椭圆类的子类Circle类 任务二 创建一个碟包

推荐NLP基础 RNN循环神经网络

NLP概述 Natural Language Processing(NLP, 自然语言处理) 目的:让计算机处理或“理解”自然语言,以执行语言翻译和问题回答等任务;最终 来讲就是构建机器语言和人类语言之间的沟通桥梁,实现人机交流为最终目的。 常见应用&…

Segment Anything文章要点

核心方法: 1. 数据 Unfortunately, there is no web-scale data source for segmentation; to address this, we build a “data engine” 没有大规模的数据源用于分割; 为了解决这个问题,我们构建了一个“数据引擎” We iterate between using our efficient mo…