社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习的通用工作流程

新机器视觉 • 10 月前 • 110 次点击  

点击下方卡片,关注“新机器视觉”公众号

重磅干货,第一时间送达


来源:AI自研社


本篇文章为大家介绍一种可解决机器学习问题的通用模板,内容节选自《Python深度学习》,个人觉得写的非常好,可以拿来反复的研读和领悟。


Part 01

定义问题,收集数据集


首先,你必须定义所面对的问题。


你的输入数据是什么?你要预测什么?只有拥有可用的训练数据,你才能学习预测某件事情。比如,只有同时拥有电影评论和情感标注,你才能学习对电影评论进行情感分类。因此,数据可用性通常是这一阶段的限制因素(除非你有办法付钱让人帮你收集数据)。


你面对的是什么类型的问题?是二分类问题、多分类问题、标量回归问题、向量回归问题,还是多分类、多标签问题?或者是其他问题,比如聚类、生成或强化学习?确定问题类型有助于你选择模型架构、损失函数等。


只有明确了输入、输出以及所使用的数据,你才能进入下一阶段。注意你在这一阶段所做的假设,这点很重要。


❑假设输出是可以根据输入进行预测的。

❑假设可用数据包含足够多的信息,足以学习输入和输出之间的关系。


在开发出工作模型之前,这些只是假设,等待验证真假。并非所有问题都可以解决。你收集了包含输入X和目标Y的很多样例,并不意味着X包含足够多的信息来预测Y。例如,如果你想根据某支股票最近的历史价格来预测其股价走势,那你成功的可能性不大,因为历史价格并没有包含很多可用于预测的信息。


有一类无法解决的问题你应该知道,那就是非平稳问题(nonstationary problem)。假设你想要构建一个服装推荐引擎,并在一个月(八月)的数据上训练,然后在冬天开始生成推荐结果。一个大问题是,人们购买服装的种类是随着季节变化的,即服装购买在几个月的尺度上是一个非平稳现象。你想要建模的对象随着时间推移而改变。在这种情况下,正确的做法是不断地利用最新数据重新训练模型,或者在一个问题是平稳的时间尺度上收集数据。对于服装购买这种周期性问题,几年的数据足以捕捉到季节性变化,但一定要记住,要将一年中的时间作为模型的一个输入。


请记住,机器学习只能用来记忆训练数据中存在的模式。你只能识别出曾经见过的东西。在过去的数据上训练机器学习来预测未来,这里存在一个假设,就是未来的规律与过去相同。但事实往往并非如此


Part 02

选择衡量成功的指标


要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确率(precision)和召回率(recall)?客户保留率?衡量成功的指标将指引你选择损失函数,即模型要优化什么。它应该直接与你的目标(如业务成功)保持一致。


对于平衡分类问题(每个类别的可能性相同),精度和接收者操作特征曲线下面积(area under the receiver operatingcharacteristiccurve, ROC AUC)是常用的指标。


对于类别不平衡的问题,你可以使用准确率和召回率。对于排序问题或多标签分类,你可以使用平均准确率均值(mean averageprecision)。自定义衡量成功的指标也很常见。


Part 03

确定评估方法


一旦明确了目标,你必须确定如何衡量当前的进展。前面介绍了三种常见的评估方法。


❑ 留出验证集。数据量很大时可以采用这种方法。

❑ K折交叉验证。如果留出验证的样本量太少,无法保证可靠性,那么应该选择这种方法。

❑ 重复的K折验证。如果可用的数据很少,同时模型评估又需要非常准确,那么应该使用这种方法。


只需选择三者之一。大多数情况下,第一种方法足以满足要求。



Part 04

准备数据

一旦知道了要训练什么、要优化什么以及评估方法,那么你就几乎已经准备好训练模型了。但首先你应该将数据格式化,使其可以输入到机器学习模型中(这里假设模型为深度神经网络)。


❑ 如前所述,应该将数据格式化为张量。

❑ 这些张量的取值通常应该缩放为较小的值,比如在[-1,1]区间或[0,1]区间。

❑ 如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化。

❑你可能需要做特征工程,尤其是对于小数据问题。准备好输入数据和目标数据的张量后,你就可以开始训练模型了。


Part 05

开发比基准更好的模型

这一阶段的目标是获得统计功效(statistical power),即开发一个小型模型,它能够打败纯随机的基准(dumbbaseline)。


在MNIST数字分类的例子中,任何精度大于0.1的模型都可以说具有统计功效;在IMDB的例子中,任何精度大于0.5的模型都可以说具有统计功效。


注意,不一定总是能获得统计功效。如果你尝试了多种合理架构之后仍然无法打败随机基准,那么原因可能是问题的答案并不在输入数据中。要记住你所做的两个假设。


❑假设输出是可以根据输入进行预测的。

❑假设可用的数据包含足够多的信息,足以学习输入和输出之间的关系。这些假设很可能是错误的,这样的话你需要从头重新开始。如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型。

❑最后一层的激活。它对网络输出进行有效的限制。例如,IMDB分类的例子在最后一层使用了sigmoid,回归的例子在最后一层没有使用激活,等等。

❑损失函数。它应该匹配你要解决的问题的类型。例如,IMDB的例子使用binary_crossentropy、回归的例子使用mse,等等。

❑优化配置。你要使用哪种优化器?学习率是多少?大多数情况下,使用rmsprop及其默认的学习率是稳妥的。


关于损失函数的选择,需要注意,直接优化衡量问题成功的指标不一定总是可行的。有时难以将指标转化为损失函数,要知道,损失函数需要在只有小批量数据时即可计算(理想情况下,只有一个数据点时,损失函数应该也是可计算的),而且还必须是可微的(否则无法用反向传播来训练网络)。例如,广泛使用的分类指标ROC AUC就不能被直接优化。因此在分类任务中,常见的做法是优化ROC AUC的替代指标,比如交叉熵。一般来说,你可以认为交叉熵越小,ROC AUC越大。


下表列出了常见问题类型的最后一层激活和损失函数,可以帮你进行选择。


Part 06

扩大模型规模:开发过拟合的模型

一旦得到了具有统计功效的模型,问题就变成了:模型是否足够强大?它是否具有足够多的层和参数来对问题进行建模?


例如,只有单个隐藏层且只有两个单元的网络,在MNIST问题上具有统计功效,但并不足以很好地解决问题。请记住,机器学习中无处不在的对立是优化和泛化的对立,理想的模型是刚好在欠拟合和过拟合的界线上,在容量不足和容量过大的界线上。


为了找到这条界线,你必须穿过它。要搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单。

(1)添加更多的层。

(2) 让每一层变得更大。

(3) 训练更多的轮次。


要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。


下一阶段将开始正则化和调节模型,以便尽可能地接近理想模型,既不过拟合也不欠拟合。


Part 07

模型正则化与调节超参数

这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试以下几项。


❑添加dropout。

❑尝试不同的架构:增加或减少层数。

❑ 添加L1和/或L2正则化。

❑尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置。

❑(可选)反复做特征工程:添加新特征或删除没有信息量的特征。请注意:每次使用验证过程的反馈来调节模型,都会将有关验证过程的信息泄露到模型中。如果只重复几次,那么无关紧要;但如果系统性地迭代许多次,最终会导致模型对验证过程过拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。


一旦开发出令人满意的模型配置,你就可以在所有可用数据(训练数据+验证数据)上训练最终的生产模型,然后在测试集上最后评估一次。如果测试集上的性能比验证集上差很多,那么这可能意味着你的验证流程不可靠,或者你在调节模型参数时在验证数据上出现了过拟合。在这种情况下,你可能需要换用更加可靠的评估方法,比如重复的K折验证。


声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

—THE END—

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157120
 
110 次点击