【机器学习】什么是学习曲率?如何解决模型中方差和偏差问题?什么是迁移学习?什么是模型的精确率和召回率?

本文介绍了构建机器学习系统的关键概念,包括学习曲率、偏差与方差的辨析,以及如何通过迭代循环和误差分析改进模型。讨论了迁移学习在数据有限时如何利用预训练模型提升性能,并详细阐述了机器学习项目的完整周期。此外,还探讨了倾斜数据集的精确率和召回率,以及如何在它们之间进行权衡。
摘要由CSDN通过智能技术生成

系列文章目录

第十二章 Python 机器学习入门之构建机器学习系统


系列文章目录

文章目录

一、学习曲率

二、利用大型神经网络解决方差和偏差问题

三、机器学习开发的迭代循环

四、误差分析

五、 添加数据或创建数据的一些技巧(数据增强)

六、 迁移学习(使用其他任务中的数据)

七、 机器学习项目的完整周期

八、 倾斜数据集的误差指标(精确率和召回率)

总结


一、学习曲率

学习曲率是帮助理解我们的学习算法如何做的方法

前面我们说过什么是训练误差、交叉验证误差和测试误差,来看看学习曲率是什么样的

如图,当训练集增加时,交叉验证误差会下降;训练误差会上升,因为随着训练数据的增加,曲线很难完美的拟合所以的训练示例。

当模型具有高偏差时,学习曲率是什么样的?

如图,随着数据的增加,曲线也没有变化,所以训练误差会随着数据集的增加而变平

同样的交叉验证误差也会出现这种情况。因为模型太简单了,无法拟合那么多数据

我们有一条基准性能水平的衡量标准,应该就像图中的红线,会低于训练误差和交叉验证误差。

像这种情况,我们如果添加数据集,模型不会有什么改变,直线拟合不会变

这就是为什么我们在添加数据集前,要对模型进行诊断的原因,检测学习算法是否有高偏差的原因。

当模型具有高方差时,学习曲率是什么样的?

 

训练误差会和交叉验证误差有很大的间距,当模型具有高方差时,添加数据集可能会减低误差

当我们在训练一个神经网络时,可以绘制学习曲率来查看我们的模型时高偏差还是高方差,进而选择相应的方法来改进模型。

下面我们看看我们的模型有高方差或者高偏差时,怎么做可以获得更加好的模型

当模型具有高方差:1 获得更多的训练数据;2 尝试一组较小的特征;3 增加λ

当模型具有高偏差:1 添加一些特征;2 添加多项式特征;3 减小λ

二、利用大型神经网络解决方差和偏差问题

神经网络如此成功的原因之一时因为它为我们提供了一种解决高偏差和高方差的新方法。

如果我们拟合一个简单的模型,它可能会存在高偏差;如果我们拟合一个复杂的模型,它可能会存在高方差;

我们可以选择一个适当的,交叉验证误差最小的模型。

在神经网络出来之前,我们都要进行偏差方差权衡,来找到合适的模型

事实证明,在小型中等规模数据集上训练大型神经网络模型是低偏差机器

也就是说,只要神经网络足够大,总是能很好的适应我们的训练集,前提是训练集不是很大。

这意味着为我们提供了一种新方法,可以根据需要尝试减少偏差或减小方差,而无需在两者之间进行真正的权衡。

 

有种方法可以使用神经网络获得准确的模型,该神经网络首先在你的算法上训练你的数据集,然后计算训练误差,查看它在训练集上是否表现良好(相对于性能评估基准)。如果训练误差值过高,那我们就有一个高偏差问题,减少偏差的一种方法是使用更大的神经网络,就是具有更多的隐藏层,或每层更多的隐藏单元。

然后继续计算训练误差,查看它在训练集上是否表现良好(相对于性能评估基准),让神经网络越来越大,直到它在训练集上表现良好。这意味着在我们的训练集中达到与我们希望达到的目标误差水平大致相当的误差水平。

然后我们在看看它是否具有高方差,如果算法有高方差,解决问题的一个方法是获取更多的数据,并返回重新训练模型再仔细检查,直到算法没有高差和偏差,这就是一个良好的模型,可以推广到新的例子上。

当然,这个方法也有局限性,在某些时候,训练更大的神经网络不会减少偏差,它在计算上变得困难,计算速度会很慢;还有就是获得更多的数据有时是很困难的

当我们开发学习算法时,有时会发现自己的模型有高偏差,采取一些措施,比如我们会增加我们的神经网络,但是有时当我们增加神经网络之后,可能会发现模型的有很高的方差,这时,我们再去收集更多的数据。

如果我们的神经网络太大怎么办?还会产生高方差问题吗?

事实证明,一个具有良好正则化的大型神经网络,通常比小型神经网络做的更好。

只要我们适当的进行正则化,拥有更大的神经网络几乎没有坏处。一个更大的神经网络可能会减慢代码的运行速度,除此之外不会有什么不好的影响。

三、机器学习开发的迭代循环

 

开发一个系统学习模型,首先要决定系统的整体框架是什么,也就是选择机器学习模型,以及决定使用哪些数据,像选择超参数等。

然后根据这些决定,去训练模型,因为我们刚刚开始训练模型,它几乎不会实现我们所想的设计,所以要查看一些诊断,例如查看算法的偏差和方差,错误分析等,我们根据诊断的结果做出决策,像让神经网络变大或者改变正则化参数λ ,或者添加数据,或者添加特征减去特征等。

然后用新构建的框架再经过这个循环。它一般会在这个循环中进行多次迭代,直到达到我们想要的性能。

四、误差分析

Error analysis

我们在开发学习算法时,最重要的就是知道下一步做什么可以提高学习算法的性能,除了计算偏差和方差,误差分析也是很重要的。

下面来看看什么是误差分析

 

如图,我们的交叉验证数据集有500个数据,其中有100个预测错误。错误分析error analysis的过程就是指手动查看这100个错误的示例,并试图找到算法出错的地方。

具体做法:可以将这些错误的示例进行分类,像以共同的属性的,共同的特征的进行分类。

如果我们模型比较大,我们错误的例子有1000个的话,我们可能没有时间去一个一个的进行查看,那么我们可以随机抽取其中的100个左右进行分类查看。

分类误差后,看看哪种类型的错误出现的最多,我们可以有针对性的去完善它。

 

五、 添加数据或创建数据的一些技巧(数据增强)

在我们训练模型时,往往想要更多的数据来训练,可是这有时会很难实现。

一般情况,我们在进行错误分析时,发现某一种类型的错误很多,比如识别猫狗时,识别狗的错误示例比较多,那我们就重点添加狗的数据。

除了获得全新的训练示例xy外,还有另一种方法——数据增强

我们要做的就是利用现有的训练示例去创建一个新的训练示例,比如识别数字或字母,我们只需要将数字或字母放大,缩小,旋转,改变对比度等,这些操作都可以获得一个新的示例。除此之外,像垃圾邮件识别、语言识别等都可以使用增强数据来创建更多的数据。

六、 迁移学习(使用其他任务中的数据)

对于没有那么多数据的应用程序,可以使用迁移学习,它可以让我们使用不同任务的数据来帮助我们的应用程序。

下面来看看迁移学习的工作原理。

假设我们想识别手写数字0到0,但我们没有那么多手写数字的标记数据。如果我们发现了一个非常大的数据集,比如时一百万张猫、狗、汽车、人等照片,有1000个类别,我们可以在这个大型的神经网络上训练一个神经网络,训练图像X作为输入,识别这些输入的数据是这1000个类别中的哪一个,训练模型,我们会得到参数w1,b1…..w5,b5.

应用迁移学习,我们要做的就是复制这个神经网络,改变输出层,原先的神经网络输出层有1000个单元,现在我们改成10个输出单元。这里要注意,原先神经网络中的w5,b5不能被复制,因为输出层的维度改变了。我们需要从头开始训练,得到参数w5,b5。

在这里,我们可以使用前四层的参数,

具体来讲,有两种方法可以训练这个神经网络的参数:1 是我们只训练输出层的参数,前面几层的参数我们可以直接复制过来使用,再使用随机梯度下降或Adam优化算法来更新w5,b5,来降低代价函数;2 是训练这个神经网络中的所有参数。

如果我们有个小的数据集,则使用方法1会更好;如果我们有一个大的数据集,那么使用方法2会更好。

这也就是说我们在互联网上下载别人已经训练好的模型,修改输出层,进行微调,就可以得到我们需要的神经网络了。

那么,为什么迁移学习有用呢?为什么可以用识别猫、狗等的神经网络参数,来识别手写数字呢?

神经网络的第一层会检测图像的边缘,下一层可能会学习将边缘组合在一起来检测角点,再下一层神经网络可能已经学会了一些更加复杂的,比如它们存储的形状、曲线或其他的。

这就是为什么学习检测大量不同的图像,它会教神经网络检测图像的边缘、角落和基本形状。

所以我们用识别猫、狗等的神经网络参数,它可以帮助我们识别这些非常通用的图像特征、和寻找边缘、角落、曲线和基本形状。这对于其他计算机视觉任务很有帮助,比如说识别手写数字。

但是,预训练的一个限制是,图像的类型X的预训练和微调步骤必须相同 。如果我们要解决的最终任务是计算机视觉任务,那么预训练步骤已经在相同类型的输入上训练神经网络,即所需尺寸的图像。

相反,如果我们的目标是构建一个语言识别系统来处理音频,那么预训练的神经网络图像可能对语音识别没有太大的帮助,那我们就去找一个对音频数据进行预处理的神经网络,然后根据自己的音频数据对神经网络进行微调,我们就可以使用了。

总结一下,迁移学习可以分为两步

1 下载带参数的、已经在大型数据集进行了预训练、与我们的应用程序相同的输入类型的神经网络,该输入类型可以是图像、音频、文本或者是其他的内容。当然,除了下载别人训练好的神经网络,我们也可以自己训练神经网络,只是比较麻烦了。

2 是根据自己的数据进一步训练或微调神经网络,再利用神经网络来训练我们自己的数据集。

七、 机器学习项目的完整周期

以音频识别为例,一个完整的机器学习项目的周期可以分为以下几步:

 

1 机器学习项目的第一步是确定项目的范围,也就是说这个项目想要做什么。

2 收集数据,决定需要什么数据来训练我们的机器学习系统,并去做获取音频,获取数据标签的工作。

3 收集完初始数据后,我们开始训练模型,我们训练语音识别系统,进行错误分析,考虑是不是要回头继续收集数据等操作来改进模型。

4 经过不断训练模型,改进模型,我们会得到一个性能很好的模型,然后就可以投入使用了。使用的过程中我们也可以继续的去修改完善模型。

八、 倾斜数据集的误差指标(精确率和召回率

以一个二元分类来检测一种罕见病为例

如果存在疾病,则y 输出1;不存在,则y 输出0.

我们发现我们的模型误差在1%左右,这看起来不错。但这是一个罕见的病例识别,如果一个正常人患病的概率只有0.5%,那么我们的模型误差在1%,它可能可以检测除了一些患者,也可能检测不出来,如果我们还有一个误差在0.7%的模型,我们并不知道哪一个模型的检测效果更好。

这就是一种倾斜数据集的问题,我们通常使用不同的错误度量,而不仅仅是分类错误来确定我们的分类算法表现如何。

一对常见的错误度量是精确率和召回率。

如图,以交叉验证集中的100个例子。

上面的公式就是精确的的计算公式,正确预测为1 的个数除以总共的预测为1 的个数

下面的公式是召回率的计算公式,正确的预测为1 的个数除以总共实际为1 的个数。

如何计算出来的精度和召回率都很低,则说明模型的检测效果并不好。

高精度说明,如果预测出这个人患有这种罕见病,那么这个人有很大的可能真的患有该罕见病;

高召回的说明,如果有一个患有这种罕见病的患者,算法可能会正确的识别出来他们患有这种疾病。

通过上面两点的说明,我们可以来找到精确率和召回率之间的权衡

当有我们要预测一种罕见病,使用的时逻辑回归进行预测,正常情况我们的阈值都设置为0.5,但是如果我们需要提高预测的精度时,我们就可以提高阈值,可以为0.7,0.9. 当阈值为0.9时,这时的精确率就会非常高,同时召回率就会非常低,因为我们检测出来的人变少了,但是精度变高了。如果检测出一个人患有该罕见病,那么这个人就极有可能患有该遗传病。

同样,如果我们的需求时尽可能多的检测出患病者,我们可以适当的减低阈值,这样虽然精确率会下降,但是召回率会增加,检测出来的病人也会很多。

权衡精确率和召回率一般是要我们人为设置阈值的,如果需要算法可以自动权衡精确率和召回率,我们可以使用另一个指标 F1 score,它可以自动结合精确率召回率来我们选择具有价值的或两者之间的最佳权衡。

它其实就是精确率P 和召回率R 的调和均值,调和均值是一种取更强调较小值的平均值。

从下图可以看见它的计算公式。

 


总结

本文主要讲解了如何构建机器学习系统,首先说明了说明是学习速率,接着讲解了解决神经网络模型中的方差和偏差问题,简单说了机器学习开发的迭代循环,如何去进行误差分析等。重点阐述了什么是迁移学习和神经网络模型中精确率和召回率问题,以及机器学习项目的完整周期。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓亮.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值