传统的机器学习,即在深度学习流行之前的问题的一般处理流程通常是“预处理->特征变换->分类/回归”。即便现在深度学习似乎要统治业界,但要转换成这样的步骤,也不过是将“特征变换”与“分类/回归”合二为一而已,该做的预处理往往还是要做。《深度学习(Deep Learning Book)》里提过一种对深度学习的诠释思路——深度表示学习,与之类似。

但放到现实问题中来看,机器学习只不过是整个问题解决过程中一个很小的组成部分。比如在公司做业务,你要收集数据、清洗数据、建立合适的数据结构,对大规模数据可能还要顺便把大规模分布式问题解决一下。等费劲千辛万苦拿到“干净”的数据之后,才进入机器学习/模式识别问题的一般步骤。 
而实际上,至少七成时间花在了准备数据的阶段。很多人学机器学习往往只重视算法或者模型,学深度学习的只看网络结构和调参方法,但不要忘了,这是因为有人为你准备好了数据集和评测流程、方法。对于实际问题,这一整套框架都要根据实际情况去设计、改进,使之贴近业务,提供更好的服务。

做科研有做科研的方法,做实际业务是另一套模式。业界需要的大量的算法工程师,往往是做这些看似琐碎的无趣的活,这样看来程序员转算法工程师其实是比较容易的。 
啊哀叹一下为什么我编程这么菜……

扯淡结束。这篇博文要记录的内容,与数据集的制作与划分有关。 
本文还是以大白话写就,您读着也省劲,我写得也轻松。

Part 1. 实例: 一个信号处理问题
就从实际问题的背景开始,由导师的项目说起吧。 
项目需要完成一个系统,我负责实验设计、总体设计和信号处理+识别。这个项目的信号或者说数据是按时间采样得到的,比如说采样率是500Hz每秒就能得到500个点。一次采集在一分钟以上,只需要其中的不到三十秒的数据。 
所以问题就来了:得到一组数据需要至少一分钟,而且这个采集过程不能长时间运行,一次实验最多采三十组数据;更尴尬的是,实验比较特殊,不是想做几组就做几组的。 
也就是说,我们必须要用比较少的采集组数得到数据集,还要训练一个比较可靠的模型,用来做信号的识别/分类。 
一开始我想得很简单——少就少呗,无非是个小样本学习的问题。找一个鲁棒性比较好的特征变换方法,用简单点儿的分类模型,分分钟解决问题,反正设计指标也不高。 
但说归说,只有十几二十个样本,谁能保证训出来的模型能用啊。

查了一些文献,又结合系统的要求,最后选择用滑动窗分割的方法来增广数据集,即设置一个固定时长的滑动窗在时域信号上滑动,重叠时长为0,这样把一个样本切割成几十份样本,数据集扩增了几十倍。瞬间就把样本不足的问题解决了。 
采取这种方式,一是有人一直在这么做,二是系统实际工作时处理过程也与之类似——总不能后台默默跑一分钟才告诉你一个结果吧?最好是几秒钟就显示一个结果,让甲方知道我们的系统在干活,而不只是琢磨着怎么把他们的钱忽悠走。

离线测试效果奔波儿灞,不是,倍儿棒,正确率直接奔着95%去了。老实说当时我是有点怀疑的,但稍微动了一下脑子,感觉最多也就是线上比离线差点儿,总不能太糟吧。 
怕啥来啥。线上测试二分类正确率50%。 
当时我就蒙了。接着回炉重造,想到一个比较特殊的情况,改模型再训,嚯!99%!心想这回总不至于那么差吧,一上线还是完蛋。 
那几天是真烦,实在想不清楚怎么就完蛋了。

过了大概大半星期,忽然产生了一个念头——是不是数据集有问题? 
众所周知,我们一般做机器学习要在数据集上 shuffle,然后按比例划分训练、验证和测试集。这个系统模型比较简单没几个超参,样本又少,出于侥幸心理干脆就省略了验证集。 
但问题在于,这个数据集是怎么得到的?是从大约二十组信号上“片”出来的。 
我隐约察觉问题在哪儿了。然后就实验验证呗。 
从时间的角度考虑,系统需要用“过去”的数据去预测“未来”。所以这一回我先划分了训练和测试集数据,然后再做切片。其实在这里,数据根本不需要 shuffle ——分类器是 linear classifier 或 SVM,训练过程是一次把所有数据喂进去。Shuffle 没有任何意义。 
这回的测试结果看起来比较“正常”了——在50%和60%之间浮动。好嘛问题终于是定位到了,但新的问题是,这样一来我用的信号处理方法对分类根本没效果,简直一夜回到解放前。

后来我对一些小细节做了一点调整,最近参与的三个人差不多把全新的系统调试完了,具体效果……我猜设计要求的70%还是能达到吧。不再细说。

Part 2. 数据集的制作与划分,方法要根据问题而定
所以说,通过这一课我学到了什么?

shuffle 不要乱用
算法一定要贴在具体业务上
为什么我的模型会线下99%、线上50%? 
显然是对线下模型过拟合了。但我明明做了训练集和测试集啊?问题就出在这儿: 
我增广之后,先 shuffle、再划分。对学术界的很多数据集,这么做可能完全没影响,但没影响不代表它是对的。Kaggle 、天池之类的数据竞赛,训练集和测试集都是提前划分好的,有没有想过其中的道理? 
打个比方,我的错误操作,就像中学时候不会做的题目抄答案,但每次只看一半,理由是“只要给个思路我就会做了”。当然,这纯粹是自己骗自己。 
先 shuffle 再划分,就相当于“答案只看一半”——“过去”的数据和“现在”的数据混到了一起,模型既学到了“过去”的模式,又学到了“现在”的模式,准确率自然可观;而“未来”的数据是不可见的,模型显然学不到“未来”的模式。 
所以正确的方法是先划分。Shuffle 可以不用。因为 shuffle 的作用体现在 mini-batch learning 的时候。一次性训练的分类器使用 shuffle 并没有什么意义。

第二点体会就结合我的方向来说了。去年去北京听课,天津大学的一位博后在讲实验设计和信号处理方法的时候提到,我们这个领域多年来已经遇到了瓶颈,具体体现在算法的提升作用越来越小,实验设计反倒比处理方法重要得多。 
我非常赞同。 
深度学习火起来之后,领域内不少人也研究过基于深度学习的处理方法,但经得起考验的成果不多。一方面深度学习不是万能的,另一方面,多年来进展缓慢,侧面说明我们这个领域可能真地存在这么一个天花板。我觉得具体问题就在信号采集的方式和设备上面——这个话题不展开讨论——结果就是,受制于“硬件”限制,在实验设计上出成果比在算法上出成果要容易。 
这就是说,对很多实际问题来说,算法并不是关键。按照 Andrew Ng. 和国外很多博客的观点,围绕你的目标设计一个好的 pipeline,包括如何对数据的建模、一个衡量模型好坏的基准等等,然后不断改进,这才是使用机器学习的有效方式,而不是只针对其中算法的部分尝试各种分类/回归器,或者想用深度学习调参搞定一切。这正是 NFL 定理的意义:如果不考虑具体问题,所有的算法都是随机猜测,没有好坏之分。

深度学习中数据的拆分打乱相关推荐

  1. 如何系统性掌握深度学习中的数据使用

    数据是深度学习系统的输入,对深度学习的发展起着至关重要的作用,但是又容易被很多人忽视,尤其是缺少实战的理论派. 今天便来谈谈这个问题,同时介绍一个好的学习社区供大家讨论与提升. 文/编辑 | 言有三 ...

  2. 对pca降维后的手写体数字图片数据分类_【AI白身境】深度学习中的数据可视化...

    今天是新专栏<AI白身境>的第八篇,所谓白身,就是什么都不会,还没有进入角色. 上一节我们已经讲述了如何用爬虫爬取数据,那爬取完数据之后就应该是进行处理了,一个很常用的手段是数据可视化. ...

  3. MATLAB中深度学习的数据集合

    简 介: 本文总结了部分MATLAB中用于深度学习的数据集合. 关键词: MATLAB,DEEPLENARING #mermaid-svg-xPWl4yTsAw5Z4HFe {font-family: ...

  4. 深度学习中图片数据增强方法

    简 介: 在深度学习中需要对图像进行不同的处理.本文对比了基于Numpy以及Paddle.vision.transforms函数中对于图片处理的效果. 关键词: 图像预处理,cv2,paddle #m ...

  5. 【AI白身境】深度学习中的数据可视化​​​​​​​

    文章首发于微信公众号<有三AI> [AI白身境]深度学习中的数据可视化 今天是新专栏<AI白身境>的第八篇,所谓白身,就是什么都不会,还没有进入角色. 上一节我们已经讲述了如何 ...

  6. 【技术综述】深度学习中的数据增强(下)

    文章首发于微信公众号<有三AI> [技术综述]深度学习中的数据增强(下) 今天带来深度学习中的数据增强方法的下篇.我们将从以下几个方向入手.1,介绍一下什么是无监督的数据增强方法.2,简单 ...

  7. [综述类] 一文道尽深度学习中的数据增强方法(上)

    今天带来一次有关于深度学习中的数据增强方法的分享. 00 什么是数据增强 在深度学习项目中,寻找数据花费了相当多的时间.但在很多实际的项目中,我们难以找到充足的数据来完成任务. 为了要保证完美地完成项 ...

  8. mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...

    1.什么是生成器 我们可以把生成器理解为一个高端的列表.生成器就是一个集算法和列表还有依次读取于一体的功能.因为如果列表存储的内容过多就会造成内存的浪费.但是如果"列表"内的元素可 ...

  9. 总结 62 种在深度学习中的数据增强方式

    数据增强 数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程 这包括对数据进行不同方向的扰动处理 或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而 ...

最新文章

  1. Move to Another Changelist
  2. 零基础学习大数据人工智能,学习路线篇!
  3. -f shell 模糊匹配_linux模糊查找一个文件的方法
  4. 【TypeError: float() argument must be a string or a number, not ‘map’】
  5. Tree UVALive - 8212
  6. (44)System Verilog数组逻辑运算
  7. 升级 Node.js 版本遇到的 co 和 pm2 问题解析
  8. 梦幻109鸿蒙量星太难杀,梦幻西游:维摩诘杀怪最少攻略,20分钟轻松做完!
  9. iOS 之模拟网易新闻主页的滚动效果
  10. 在浏览器中打开shell,连接linux
  11. windows2012R2安装python3.x版本报错0x80240017
  12. 2020美团笔试题目:送餐小区数量
  13. 手机wps怎么设置打印横竖_手机WPS怎么设置横版打印?
  14. Java技术——你真的了解String类的intern()方法吗,快点来学吧
  15. sql中的日期和字符串的转化
  16. [DLX]HDOJ4069 Squiggly Sudoku
  17. python 异常及处理
  18. Python 竟然不是最赚钱的编程语言?!
  19. 注册表RootKey简写:HKCR, HKCU, HKLM, HKU, and HKCC
  20. 智能音箱来了,语音交互设计的一点认知

热门文章

  1. lol计算机内存,你每打一把LOL,腾讯就会多往你电脑里塞600M垃圾
  2. Hexo-yilia主题个性化美化及功能添加
  3. 技巧:修改Chrome默认搜索引擎为Google.com
  4. Verilog实现四位加/减法器(逻辑表达式)
  5. 最全的的初中数学公式大全
  6. 电脑重装系统的几种方法
  7. 超准的普通话水平测试,敢不敢进来做一下!
  8. 微信小程序音频的使用:wx.createInnerAudioContext的使用
  9. iphone手机音频AAC视频H264推流(一) iphone手机推流最佳方案
  10. R语言-用R眼看琅琊榜小说的正确姿势