🤵♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱🏍
🙋♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)
<center >【机器学习 | PipeLine】机器学习通用管道最佳实践!!(无论什么问题都能套上,确定不来看看?)
<center> 作者: 计算机魔术师
<center> 版本: 1.0 ( 2023.10.27 )
摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅
该文章收录专栏
[✨--- 《深入解析机器学习:从原理到应用的全面指南》 ---✨]
@toc
Kaggle: 拥有稳定而强大的管道对于在最终的私人排行榜中取得出色表现最为关键。浪费时间过度拟合以在公共排行榜中获得额外的 0.0001 是没有意义的。始终相信当地的交叉验证分数,因为训练数据量大于公共排行榜的数据量。
无论是怎么样的一个机器学习问题,都有一个通用的处理流程模板,进行 问题定义,特征工程,评估指标,评估方法,损失函数,调优模型等等,总的来说总体如下:
首先面对的问题:
常见的有如,回归、分类、监督还是非监督学习、强化或生成、进化?聚类,二分类还是多分类,多分类是单标签还是多标签,确定问题类型可以有助于确定损失函数和模型架构、激活函数等。
只有可用的数据,我们才能训练我们的模型,学习某种模式,通常在这一部分,数据可用性是比较头疼的问题,比如数据是否高质量,是否充足以让模型学习。
在明确输入输出及所使用的数据中有两个假设:
我们在面对问题也要考虑到输入数据 X 是否有足够的信息来预测 Y, 比如在股票价格预测,如果只有历史价格显然是无法实现的,因为历史价格并没有包含可以很好预测的信息。
还有比如类似非平稳的问题, 总的来说机器学习只能通过记忆训练数据所存在的模式,识别曾经遇见的东西,根据过去规律预测未来,但显然未来规律并非如此
要控制一件事物,就需要能够观察它。要取得成功,就必须给出成功的定义:精度?准确率(precision)和召回率(recall)?客户保留率?衡量成功的指标将指引你选择损失函数,即要优化什么。它应该直接与你的目标(如业务成功)保持一致。(这非常重要!!)
自定义衡量成功的指标也很常见。要想了解当前问题的成功衡量指标以及这些指标与问题的关系,可以浏览 Kaggle 网站上的数据科学竞赛,上面展示了各种各样的问题和评估指标。
一旦明确了目标,你必须确定如何衡量当前的进展。 evaluation & metrics.md 介绍了常见的评估方法。大多数情况下, 留出验证集方法足以满足要求
一旦知道了要训练什么、要优化什么以及评估方法,那么你就几乎已经准备好训练模型了。但首先你应该将数据格式化,使其可以输入到机器学习模型中(这里假设模型为深度神经网络)。
如果不同的特征具有不同的取值范围(异质数据),那么应该做数据标准化。
这一阶段的目标是获得统计功效(statistical power),即开发一个小型模型,它能够打败纯随机的基准(dumb baseline)。在 MNIST 数字分类的例子中,任何精度大于 0.1 的模型都可以说具有统计功效;在 IMDB 的例子中,任何精度大于 0.5 的模型都可以说具有统计功效。不过要注意的是,不一定总是能获得统计功效。如果你尝试了多种合理架构之后仍然无法打败随机基准,那么原因可能是问题的答案并不在输入数据中。
要记住最开始所做的两个假设。
此时这些假设很可能是错误的,这样的话你需要从头重新开始。
如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型。
关于损失函数的选择,需要注意,直接优化衡量问题成功的指标不一定总是可行的。有时难以将指标转化为损失函数,要知道,损失函数需要在只有小批量数据时即可计算(理想情况下,只有一个数据点时,损失函数应该也是可计算的),而且还必须是可微的(否则无法用反向传播来训练网络)。例如,广泛使用的分类指标 ROC AUC 就不能被直接优化。因此在分类任务中,常见的做法是优化 ROC AUC 的替代指标,即 sensitity,specific,而这两个可以通过交叉熵来解决。一般来说,你可以认为交叉熵越小,ROC AUC 越大。
以下是常见问题类型的最后一层激活函数和损失函数的列表:
问题类型 | 最后一层激活函数 | 损失函数 |
---|---|---|
回归问题(Regression) | 无激活函数(线性输出) | 均方误差(Mean Squared Error) |
回归到 0~1 范围内的值 | Sigmoid激活函数 | 均方误差(Mean Squared Error)或 二元交叉熵(Binary Cross-Entropy) |
二分类问题(Binary Classification) | Sigmoid激活函数 | 二元交叉熵(Binary Cross-Entropy) |
多类分类问题(Multi-Class Classification)单标签问题 | Softmax激活函数 | 多元交叉熵(Categorical Cross-Entropy) |
多分类、多标签问题 | Sigmoid激活函数 | 二元交叉熵(Binary Cross-Entropy) |
目标检测问题(Object Detection) | 无激活函数(线性输出) | 损失函数因具体算法而异,例如交叉熵损失、平滑L1损失等 |
图像分割问题(Image Segmentation) | 无激活函数(线性输出) | 损失函数因具体算法而异,例如交叉熵损失、Dice损失等 |
生成对抗网络问题(Generative Adversarial Networks) | 无激活函数(线性输出) | 对抗性损失函数,例如生成器使用二元交叉熵,判别器使用Sigmoid交叉熵 |
强化学习问题(Reinforcement Learning) | 无激活函数(线性输出) | 因具体算法和环境而异,例如行动价值(Action Value)函数的均方误差、策略梯度等 |
请注意,以上列表仅列出了常见问题类型的典型激活函数和损失函数。在实际应用中,具体的选择可能会因问题的特点、数据分布和算法选择等因素而有所不同。
一旦得到了具有统计功效的模型,问题就变成了:模型是否足够强大?它是否具有足够多的层和参数来对问题进行建模?
例如,只有单个隐藏层且只有两个单元的网络,在 MNIST 问题上具有统计功效,但并不足以很好地解决问题。请记住,机器学习中无处不在的对立是优化和泛化的对立,理想的模型是刚好在欠拟合和过拟合的界线上,在容量不足和容量过大的界线上。为了找到这条界线,你必须穿过它。
要搞清楚你需要多大的模型,就必须开发一个过拟合的模型,这很简单。
(1) 添加更多的层或采用更复杂的架构
(2) 让每一层变得更大。(参数更多)
(3) 训练更多的轮次。
要始终监控训练损失和验证损失,以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降,那么就出现了过拟合。
这一步是最费时间的:你将不断地调节模型、训练、在验证数据上评估(这里不是测试数据)、
再次调节模型,然后重复这一过程,直到模型达到最佳性能。你应该尝试以下几项。
请注意:每次使用验证过程的反馈来调节模型,都会将有关验证过程的信息泄露到模型中。
如果只重复几次,那么无关紧要;但如果系统性地迭代许多次,最终会导致模型对验证过程过拟合(即使模型并没有直接在验证数据上训练)。这会降低验证过程的可靠性。一旦开发出令人满意的模型配置,你就可以在所有可用数据(训练数据 + 验证数据)上训练最终的生产模型,然后在测试集上最后评估一次。
如果测试集上的性能比验证集上差很多,那么这可能意味着你的验证流程不可靠,或者你在调节模型参数时在验证数据上出现了过拟合。在这种情况下,你可能需要换用更加可靠的评估方法,比如重复的 K 折验证。
🤞到这里,如果还有什么疑问🤞
🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。