首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >机器学习:来自13个Kaggle项目的经验总结

机器学习:来自13个Kaggle项目的经验总结

作者头像
Ai学习的老章
发布于 2020-12-08 06:34:58
发布于 2020-12-08 06:34:58
1.1K0
举报

任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果。

机器学习和图像分类也不例外,工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践。

在这篇文章中,我将给你很多资源来学习,聚焦于从13个Kaggle比赛中挑选出的最好的Kaggle kernel。这些比赛是:

  • Intel Image Classification:https://www.kaggle.com/puneet6060/intel-image-classification
  • Recursion Cellular Image Classification:https://www.kaggle.com/c/recursion-cellular-image-classification
  • SIIM-ISIC Melanoma Classification:https://www.kaggle.com/c/siim-isic-melanoma-classification
  • APTOS 2019 Blindness Detection:https://www.kaggle.com/c/aptos2019-blindness-detection/notebooks
  • Diabetic Retinopathy Detection:https://www.kaggle.com/c/diabetic-retinopathy-detection
  • ML Project — Image Classification:https://www.kaggle.com/c/image-classification-fashion-mnist/notebooks
  • Cdiscount’s Image Classification Challenge:https://www.kaggle.com/c/cdiscount-image-classification-challenge/notebooks
  • Plant seedlings classifications:https://www.kaggle.com/c/plant-seedlings-classification/notebooks
  • Aesthetic Visual Analysis:https://www.kaggle.com/c/aesthetic-visual-analysis/notebooks

我们会讨论调试深度学习解决方案的三个主要方面:

  • 数据
  • 模型
  • 损失函数

还有很多例子项目(和参考资料)供你参考。

数据

图像预处理 + EDA

每一个机器学习/深度学习解决方案都从原始数据开始。在数据处理管道中有两个基本步骤。

第一步是探索性数据分析 (EDA)。它帮助我们分析整个数据集并总结它的主要特征,比如类分布、大小分布等等。通常使用可视化方法来显示这种分析的结果。

第二步是图像预处理,目的是对原始图像提高图像数据(也称为图像特征)的质量,通过抑制不必要的扭曲,缩放,增强重要的特征,使数据更适合模型并提高性能。

你可以钻研这些Kaggle笔记本,看看一些图像预处理技术:

  • Visualisation:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline#Building-a-baseline-model-
  • Dealing with Class imbalance:https://www.kaggle.com/rohandeysarkar/ultimate-image-classification-guide-2020
  • Fill missing values (labels, features and, etc.):https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble
  • Normalisation :https://www.kaggle.com/vincee/intel-image-classification-cnn-keras
  • Pre-processing:https://www.kaggle.com/ratthachat/aptos-eye-preprocessing-in-diabetic-retinopathy#3.A-Important-Update-on-Color-Version-of-Cropping-&-Ben's-Preprocessing

数据增强

数据增强 可以通过从现有的训练样本中生成更多的训练数据来扩展我们的数据集。通过大量的随机转换生成新的样本,这些转换不仅可以生成可信的图像,而且还反映了真实的场景 —— 稍后将对此进行详细介绍。

这种技术得到了广泛的应用,不仅仅是在训练模型的数据样本太少的情况下。在这种情况下,模型开始记忆训练集,但无法泛化(在从未见过的数据上表现很差)。

通常,当一个模型在训练数据上表现很好,但在验证数据上表现很差时,我们称之为过拟合。为了解决这个问题,我们通常会尝试获取新数据,如果没有可用的新数据,则可以使用数据增强。

:一般的经验法则是始终使用数据增强技术,因为它有助于使我们的模型见识更多的变化并更好地泛化。即使我们有一个很大的数据集,也要使用数据增强,但这是以较慢的训练速度为代价的,因为增强是在线完成的(即在训练期间)。

此外,对于每个任务或数据集,我们必须使用反映可能的现实场景的增强技术(例如,如果我们有一个猫/狗探测器,我们可以使用水平翻转、剪裁、亮度和对比度,因为这些增强匹配不同的照片拍摄方式。

这里是一些Kaggle比赛notebooks,你可以查看流行的数据增强技术:

  • Horizontal Flip:https://www.kaggle.com/datafan07/analysis-of-melanoma-metadata-and-effnet-ensemble
  • Random Rotate and Random Dihedral:https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb
  • Hue, Saturation, Contrast, Brightness, Crop:https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords
  • Colour jitter:https://www.kaggle.com/nroman/melanoma-pytorch-starter-efficientnet

模型

开发一个基线

在这里,我们使用一个非常简单的架构创建一个基本的模型,没有任何正则化或dropout层,看看我们是否能超过50%的准确率基线。尽管我们不可能总能达到这个目标,但如果我们在尝试了多种合理的架构后不能超过基线,那么输入数据可能不包含模型进行预测所需的信息。

用Jeremy Howard的名言:

“你应该能够在15分钟内使用50%或更少的数据集快速测试你是否正在朝着一个有希望的方向前进,如果没有,你必须重新考虑一切。”

开发一个足够大可以过拟合的模型

一旦我们的基线模型有足够的能力超过基线分数,我们就可以增加基线模型的能力,直到它在数据集上过拟合为止,然后我们就开始应用正则化。我们可以通过以下方式增加模块容量:

  • 添加更多层
  • 使用更好的结构
  • 更完善的训练流程

结构

根据文献,以下架构的改进提高了模型的容量,但几乎没有改变计算复杂度。

  • Residual Networks
  • Wide Residual Networks
  • Inception
  • EfficientNet
  • Swish activation
  • Residual Attention Network

大多数时候,模型容量和精度是正相关的 —— 随着容量的增加,精度也会增加,反之亦然。

训练过程

下面是一些你可以用来调整你的模型的训练过程,通过实例项目来看看它们是如何工作的:

  • Mixed-Precision Training
  • Large Batch-Size Training
  • Cross-Validation Set
  • Weight Initialization
  • Self-Supervised Training (Knowledge Distillation)
  • Learning Rate Scheduler
  • Learning Rate Warmup
  • Early Stopping
  • Differential Learning Rates
  • Ensemble
  • Transfer Learning
  • Fine-Tuning

超参数调试

与参数不同,hyperparameters是由你在配置模型时指定的(即学习率、epoch的数量、hidden units的数量、batch size大小等)。

你可以通过使用hyperparameter调优库,比如Scikit learn Grid Search,Keras Tuner来自动化这个过程,而不是去手动配置。这些库会在你指定的范围内尝试所有的hyperparameter组合,返回表现最好的模型。

需要调优的超参数越多,过程就越慢,因此最好选择模型超参数的最小子集进行调优。

并不是所有的模型超参数都同样重要。一些超参数会对机器学习算法的行为产生巨大的影响,进而影响其性能。你应该小心地选择那些对模型性能影响最大的参数,并对它们进行调优以获得最佳性能。

正则化

这种方法迫使模型学习有意义和具有泛化能力的数据表示,通过对记忆/过拟合欠拟合进行惩罚来实现,使模型对于它没见过的数据更鲁棒。

解决上述问题的一个简单方法是获得更多的训练数据,因为一个模型训练的数据越多,自然就会泛化得越好。

这里有一些技巧你可以试着减轻过拟合和欠拟合,项目如下:

  • Adding Dropout:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Adding or changing the position of Batch Norm:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Data augmentation:https://www.kaggle.com/cdeotte/triple-stratified-kfold-with-tfrecords
  • Mixup:https://arxiv.org/abs/1710.09412
  • Weight regularization:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline
  • Gradient clipping:https://www.kaggle.com/allunia/protein-atlas-exploration-and-baseline

损失函数

损失函数也被称为成本函数或目标函数,用于查找目标输出的模型之间的差异,并帮助模型最小化它们之间的距离。

这里是一些最流行的损失函数,与项目实例,你会发现一些技巧,以提高你的模型的能力:

  • Label smoothing
  • Focal loss
  • SparseMax loss and Weighted cross-entropy
  • BCE loss, BCE with logits loss and Categorical cross-entropy loss
  • Additive Angular Margin Loss for Deep Face Recognition

评估 + 错误分析

在这里,我们做消融研究,并分析我们的实验结果。我们确定了我们的模型的弱点和长处,并确定了未来需要改进的地方。在这个阶段,你可以使用以下技术,并在链接的示例中查看它们是如何实现的:

  • Tracking metrics and Confusion matrix:https://www.kaggle.com/vincee/intel-image-classification-cnn-keras
  • Grad CAM:https://arxiv.org/pdf/1610.02391v1.pdf
  • Test Time Augmentation (TTA):https://www.kaggle.com/iafoss/pretrained-resnet34-with-rgby-0-460-public-lb

有许多实验跟踪和管理工具,采取最小设置为你自动保存所有数据,这使消融研究更容易。

最后

有许多方法来调整你的模型,并且新的想法总是会出现。深度学习是一个快速发展的领域,没有什么灵丹妙药。我们必须做很多实验,足够的试验和错误会带来突破。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
要在 O(log n) 时间内完成 HEAP-DELETE 操作,可以使用以下方法:
福大大架构师每日一题
2023/08/10
2000
文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
Timer模块相关的逻辑较为复杂,不仅包含JavaScript层的实现,也包括C++编写的与底层libuv协作的代码,想要完整地看明白是比较困难的,本章仅以setTimeout这个API的实现机制为主线,讲述源码中的JavaScript相关的实现部分,这部分只需要一些数据结构的基本知识就可以理解。
大史不说话
2019/06/25
7150
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
如何实现一个定时器?
定时器在各种场景都需要用到,比如游戏的Buff实现,Redis中的过期任务,Linux中的定时任务等等。顾名思义,定时器的主要用途是执行定时任务。
范蠡
2021/04/08
1.7K0
如何实现一个定时器?
GitHub标星3w+的项目,全面了解算法和数据结构知识
导语:今天分享一个开源项目,里面汇总了程序员技术面试时需要了解的算法和数据结构知识,并且还提供了相应的代码,目前 GitHub 上标星 35000 star,值得一看。
AI科技大本营
2019/08/20
7780
GitHub标星3w+的项目,全面了解算法和数据结构知识
Linux定时器实现
通过排序链表来保存定时器,由于链表是排序好的,所以获取最小(最早到期)的定时器的时间复杂度为 O(1)。但插入需要遍历整个链表,所以时间复杂度为 O(n)。如下图:
用户7686797
2020/08/25
3.3K0
GitHub 标星 3w+,很全面的算法和数据结构知识
今天分享一个开源项目,里面汇总了程序员技术面试时需要了解的 算法和数据结构知识,并且还提供了相应的代码,目前 GitHub 上标星 35000 star,值得一看。
五分钟学算法
2019/07/10
1.9K0
GitHub 标星 3w+,很全面的算法和数据结构知识
《基于单层时间轮与无锁数组操控的容器化定时器协同管理方法》---背景介绍
定时管理系统作为计算机系统的关键组件,在服务器、实时系统、网络通信等领域发挥着不可或缺的作用。其核心功能是按照预设时间点触发任务,保障系统的有序运行。以云计算分布式容器通信场景为例,系统需频繁设置定时器,用于确认在规定时间内是否收到应答,若超时未收到,则判定为超时失败。
用户11477875
2025/02/25
1130
定时器有几种实现方式?
在开始正题之前,先闲聊几句。有人说,计算机科学这个学科,软件方向研究到头就是数学,硬件方向研究到头就是物理,最轻松的是中间这批使用者,可以不太懂物理,不太懂数学,依旧可以使用计算机作为自己谋生的工具。这个规律具有普适应,再看看“定时器”这个例子,往应用层研究,有 Quartz,Spring Schedule 等框架;往分布式研究,又有 SchedulerX,ElasticJob 等分布式任务调度;往底层实现研究,又有不同的定时器实现原理,工作效率,数据结构…简单上手使用一个框架,并不能体现出个人的水平,如何与他人构成区分度?我觉得至少要在某一个方向有所建树:
kirito-moe
2019/03/15
4.8K0
时间轮java实现「建议收藏」
在开发高性能服务器中,定时器总是不可或缺的。 常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,如果程序中的定时器数量比较少,基于最小堆的定时器一般可以满足需求,且实现简单。
全栈程序员站长
2022/11/15
1.2K0
时间轮java实现「建议收藏」
深入Linux C/C++ Timer定时器的实现核心原理
我曾以为像定时器这样基础的功能,操作系统会有一个完备的实现。当需要开启一个定时任务的时候,会有一个优雅的、如下形式的接口:
sunsky
2020/12/21
11.7K1
深入Linux C/C++ Timer定时器的实现核心原理
一文读懂堆与栈的区别
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种内存管理方式; (2)数据结构场景下,堆与栈表示两种常用的数据结构。
恋喵大鲤鱼
2022/05/09
1.3K0
一文读懂堆与栈的区别
堆与栈区别
堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:
Anymarvel
2020/07/27
1.4K0
堆与栈区别
定时器的实现原理
定时任务在很多场景都需要用到,比如游戏的 Buff 实现,Redis 中的过期任务,Linux 中的定时任务,电商未支付订单的关闭等等。
恋喵大鲤鱼
2023/10/12
3760
定时器的实现原理
文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题
在二叉搜索树(Binary Search Tree, BST)和最小堆(Min Heap)中,元素的排列顺序都是根据其关键字的大小。然而,它们之间存在着重要的区别。
福大大架构师每日一题
2023/11/25
1940
文心一言 VS 讯飞星火 VS chatgpt (142)-- 算法导论12.1 2题
数据结构--堆的深度解析
堆(Heap)是一种非常重要的非线性数据结构,广泛应用于各种算法和问题解决中,如优先队列、堆排序、Top-k 问题等。本文将深入解析堆的定义、类型、操作、应用及其优缺点。
平凡之路.
2024/10/09
7030
数据结构--堆的深度解析
常见的数据结构及应用
数据结构是计算机存储、组织数据的方式。在工作中,我们通常会直接使用已经封装好的集合API,这样可以更高效地完成任务。但是作为一名程序员,掌握数据结构是非常重要的,因为它可以帮助我们更好地理解和设计算法,从而提高程序的效率和可靠性。
王二蛋
2024/04/26
3330
常见的数据结构
实现线性表的方式一般有两种,一种是使用数组存储线性表的元素,即用一组连续的存储单元依次存储线性表的数据元素。另一种是使用链表存储线性表的元素,即用一组任意的存储单元存储线性表的数据元素。
分母为零
2019/12/04
9270
时间驱动:探索计时器方案和革命性的时间轮技术
(1)心跳检测 (2)游戏中的技能冷却 (3)倒计时 (4)其他需要延迟处理的功能 定时器,就是指定某个时间处理某个事情。
Lion 莱恩呀
2024/09/21
2140
时间驱动:探索计时器方案和革命性的时间轮技术
数据结构:堆(Heap)
堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。
sunsky
2020/10/28
1.7K0
数据结构:堆(Heap)
吴师兄导读:如何快速入门数据结构和算法
吴师兄导读:有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及排序算法,给同学们带来一堂数据结构和算法的基础课。
五分钟学算法
2020/08/21
1.7K0
吴师兄导读:如何快速入门数据结构和算法
相关推荐
文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
更多 >
交个朋友
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
加入[架构及运维] 腾讯云技术交流站
云架构设计 云运维最佳实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档