机器学习开发流程基础

一、机器学习的四个分支

前边我们已经学习了深度学习的分类问题,其目标是通过学习输入的训练数据和标签,来学习两者之间的关系,这是典型的监督学习。

机器学习算法大致可以分为四类

* 监督学习

监督学习将输入的样本数据映射到标注的标记,是目前最常见的机器学习类型。

目前广受关注的深度学习几乎都属于监督学习,例如光学字符识别、语音识别、图像分类、语言翻译。

监督学习主要包括分类和回归,但是有很多变体,例如序列生成、语法树预测、目标检测、图像分割等。

现实中的业务场景都是有明确的业务目标的,也就是错综复杂的原始数据,都是有最终的业务目标的,也就是数据之间会有比较明确的关系;

* 无监督学习

无监督学习是在没有标记数据的情况下寻找输入数据的有趣变换,其目标在于数据可视化、数据压缩或者更好的理解数据的相关性。

降维和聚类是无监督学习的方法。

* 自监督学习

自监督学习是监督学习的一个特例;

自监督学习通常使用启发式算法从输入数据中自动生成标签;

自编码器的输出未经修改的输入,也就是以输入作为监督;

预测视频的下一帧及预测文本下一个词也是自监督学习,它们将未来的输入作为监督;

自监督学习通过将训练数据的一部分作为监督的目标,来自动的学习数据之间的关联关系,避免了人为标注的干预,有利于完成没有标记的大量数据的训练;

* 强化学习

在强化学习中,智能体接收环境有关信息,并学会选择使某种奖励最大化的的行动;

强化学习处于发展期,成熟的应用不多,但是潜力很大,例如自动驾驶、机器人、教育等领域;

二、机器学习模型评估

机器学习的目的是得到可以泛化的模型,但是随着训练的进行,模型在训练数据上的准确性不断的提高,就存在过拟合问题,导致模型在未知数据上的预测能力变差。

评估机器学习模型的重点是将数据划分为训练集、验证集、测试集,在训练集上训练模型,在验证集上评估模型,一旦找到最佳参数后就在测试集上测试模型。

将数据集划分为三个集合的原因跟机器学习的特点紧密相关

模型的训练过程中,我们需要不断的调整模型的配置来改善模型的性能,同时结合模型在验证集上的性能作为反馈信号来获得最佳的模型,那么这个模型在训练集上很容易产生过拟合的问题,
同理在验证集上也很容易产生过拟合问题,所以还需要使用测试集进行模型的评估来保证在模型在未知数据上的预测能力。

对训练数据集的划分,可以采用以下三种方法进行划分

简单留出验证

留出一定比例的数据作为测试集和测试集,然后在训练集中留出一部分作为验证集。此方法比较简单,但是如果遇到数据量比较少的情况,就需要使用下边两种方法了。

K折验证

K折验证将数据划分为大小相同的K个分区。依次选择分区i作为测试集,在剩余的K-1个分区作为训练集,最终计算K个分数的平均值。

带有打乱数据的重复K折验证

如果在较少可用数据的情况下,尽可能可能精确地评估模型,我们可以使用带有打乱数据的重复K折验证。具体做法是多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱。最终分数是每次K折验证分数的平均值。注意,这种方法一共要训练和评估P×K个模型(P是重复次数),计算代价很大。

进行数据划分是需要注意以下几点

尽量避免每个数据集只包含局部数据,尤其是有排序的数据要随机打乱,确保各个数据集都可以反应整体的数据样本分布;

对于通过过去预测未来的情况,例如天气预报、股市走势等,需要确保测试集数据要晚于训练集数据;

为了提高模型的准确行,要避免训练集和测试集包含相同的数据;

三、数据处理

在将数据输入到神经网络之前,必须对数据进行预处理来适应神经网络对输入数据的要求,其中包括向量化、值标准化、处理缺失值、特征提取。

无论什么类型的数据,都需要进行向量化将输入和目标转化为张量。

为了避免取值相对较大的数据或异质数据输入神经网络,导致网络无法收敛,需要对数据进行标准化。标准化之后,数据大部分值都应该在0-1的范围内,同时所有特征的取值都应该在大致相同的范围内。

如果数据有缺失值,就需要格式化缺失值,一般来说会将缺失值设置为0。如果数据有缺失值,那么各个数据集都应该包含有缺失值的样本。

特征工程(feature engineering)是指将数据输入模型之前,利用你自己关于数据和机器学习算法(这里指神经网络)的知识对数据进行硬编码的变换(不是模型学到的),以改善模型的效果。多数情况下,一个机器学习模型无法从完全任意的数据中进行学习。呈现给模型的数据应该便于模型进行学习。

特征工程的本质:用更简单的方式表述问题,从而使问题变得更容易。它通常需要深入理解问题。

良好的特征可以让我们用更少的资源更少的数据更优雅地解决问题。

四、过拟合

随着训练过程和优化的不断深入,模型会不断的学习到训练数据更多的特征,最终必然会导致模型的过拟合问题,从而导致模型在未知数据上的泛化能力的不佳。为了获得一个可以更好预测未知数据的最佳模型,我们需要在优化和泛化之间需求一个最优的平衡点。

为了防止过拟合的最优方法是获取更多的训练数据,从统计学上来看,越多的数据越可以更好的反应数据的分布规律,自然就提高了模型的泛化能力。而在现实的情况中,往往是在训练数据确定并且已经产生过拟合的情况下,自然是模型记住了太多的训练数据的自有特征,导致模型泛化能力减弱只能识别训练数据的尴尬,所以需要降低模型记录的信息量。

减小网络规模

深度网络的层数和参数的多少,直接反映了模型可记忆数据信息的能力,理论上来说,层数或者参数越多,模型的学习能力越强,但是为了获得一个更好的模型,需要在层数及参数的过多和过少之间寻求一个平衡。一般开始的时候选择一个相对较少的层数和参数,随着训练过程不断的增加层数和参数,直到这种增加对验证损失的影响很小。

添加权重正则化

一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,这使得权重值的分布更加规则(regular)。这种方法叫作权重正则化(weightregularization),其实现方法是向网络损失函数中添加与较大权重值相关的成本(cost)。这里常用的有L1、L2正则化。

添加dropout正则化

在训练过程中Dropout不再依赖特定的神经元,使得神经网络难以记忆输入/输出对。这促使神经网络学习通用、鲁棒的特征,而不是学习一次性、特定的东西来对应训练的实例。

五、机器学习开发流程

定义问题

我们使用机器学习解决问题基于的假设,所以我们需要明确了输入输出以及所使用的数据,方便定义需要解决的问题和模型。
已有的数据需要足够丰富并且可以用来预测输出
训练数据承载的规律在过去和未来都是相同的

选择评价指标

对于平衡分类问题(每个类别的可能性相同),使用精度和接收者操作特征曲线下面积作为指标。
对于类别不平衡的问题,可以使用准确率和召回率。
对于排序问题或多标签分类,可以使用平均准确率均值。

确定评估方法

留出验证集。数据量很大时可以采用这种方法。
K折交叉验证。如果留出验证的样本量太少,无法保证可靠性,那么应该选择这种方法。
重复的K折验证。如果可用的数据很少,同时模型评估又需要非常准确,那么应该使用这种方法。

数据预处理

格式化输入数据为张量。
张量的取值通常应该缩放为较小的值,比如在[-1, 1]区间或[0, 1]区间。
针对不同特征不同取值范围的数据进行标准化。
针对小数据问题做特征工程。

确认模型

计算的模型必须比纯随机的概率要高才行,否则就是我们基于的假设训练数据出了问题。
根据实际要处理的问题来确定最后一层的激活函数、损失函数、优化器等。

训练模型

通过调整网络的层数、参数及训练的轮次,时刻检测训练损失和验证损失,寻找欠拟合和过拟合的折中点。

调整模型

通过不断的调整模型及添加正则化、dropout、特征工程等并进行训练最终得到理想的可用于生产环境的模型。

posted @ 2021-04-22 08:43  无风听海  阅读(647)  评论(0编辑  收藏  举报