作者pipidog (如果狗狗飞上天)
看板DataScience
标题Re: [问题] Validation set 到底在做什麽?
时间Tue Mar 27 00:56:07 2018
既然都讲了,乾脆好人做到底,把cross validation(cv)也讲完好了.很多人都知道cv
怎麽操作,但是我相信很少人真的明白做cv的意义.以及什麽情况下我们很要求做cv.
这是很正常的,因为你去看很多教科书,他们就从没讲好cv的意义过. 以下我谈谈我对
cv的见解. 欢迎各位补充分享自己的看法.
cv是个大故事,你得从为什麽要做特徵工程讲起.
1. 数据的线性空间
data science里面,最核心的观念之一,就是资料空间. 想像一下我们有10K笔资料,
然後N个feature. 所以这10K的资料就会散布在这个N维的线性(线性是一个假设,方
便我们对数据进行理解跟操作)空间里面.每一个feature就代表一个维度.
好了,那让我们先考虑维度问题. 如果我有10K笔资料.我透过rescale把每个Feature
都归一化到0~10之间(通常是0~1,但我为了举例,先假设我归一化到0~10). 好了,那
让我们看看特徵的增减会发生什麽事情.
假如每笔资料只有2个feature,而每个feature又都归一到0~10之间,这意味着平均
每1^2的超空间里有10K/(10)^2=100笔资料. 满不错的,很够了.
但如果我有10个feature呢? 这意味着每1^10的超空间里,只有10K/(10^10)=10^-6
笔资料! 天啊~10个feature,这不算多吧? 但是平均下来资料竟变得如此稀疏.
这表示,当你的feature一多起来,你将建构出一个非常高维的线性空间,而维度越高,
数据就越稀疏,每笔数据之间在空间中的距离就会成指数型式越拉越远. 如同我们
的宇宙一般,数据变成非常离散,彼此之间间隔非常非常遥远,当维度趋近无穷大,
任何一笔资料的距离将变成无穷远.
这同时也表示,当你对资料做采样,你非常有可能采样出不具代表性的样本出来,
因为空间中的样本非常稀疏,你一但少采样到几个,很可能空间中就有一块很巨大
的区域没有被你适当的采样到! 你采样出来的东西就会有高度偏差.
所以越高维的资料,要做出正确的采样越困难! 你训练出来的模型越可能
泛化能力很差,因为你的train跟validation很可能采样到了数据中的不同空间,
导致validation里面一些数据空间在train中根本没出现过,所以明明train表现
的不错,但是一到了validation就不行.这就称作过拟合.
这种维度造成的采样不均现象这叫做维度灾难!
2. 怎麽解决维度灾难?
维度灾难的核心问题在於,你会无法适当采样(i.e.难以分割train跟validatio)
. 所以解决维度灾难,本质上就是要设法改善数据结构,让你可以做出适当采样.
要做到这点,你必须要完成两件事情. 第一,你要尽可能的删去不需要的,多余的维
度. 至於该怎麽做,这就是"特徵工程"的核心问题.这几天几夜都说不完,就不提了.
第二,你要尽可能让你的数据分布的均匀. 如果你的数据是这边一坨,那边一坨,
你一但把资料分割成train跟valdation,你非常有可能割出不具代表性的资料集.
但如果你的数据本来就已经分布很均匀了,那你越不容易产生采样上的偏差.
面对相对均匀的数据,我们常用的作法就是归一,把所有的特徵的数值都取在[0,1],
这样数据的scale差距就不会太大,所有数据均匀的分布在[0,1]的高维空间中,容
易正确采样.
但如果你的数据分布就是很不均匀,这边一坨那边一坨,这时候我们会试着把数据
归一成标准常态分布(均值=0,标准差=1),这会让原本离很远的两坨变得靠近一些.
总之,各种特徵工程里的奇淫巧技,为的就是想让数据分布的越均匀越好.
好的分布是你能够正确分割train与validation的前提.
3. 为什麽需要cross validation?
前面都讲了,越高维的时候,适当的分割数据将会越困难. 而之前的文章我又谈到
,模型的好坏本质上就是由两个资料集决定的: train, validation,前者决定
浅在参数,後者决定超参数. 所以一但这两个资料集在分割的时候产生了偏差,不
具代表性,那我的一切都只是在做白工. 而且越是高维度的资料,我们越难适当的
分割出具代表性的资料.
你的一切训练都只是一场幻觉,所有美好的loss都只是
自己骗自己的假象,因为你的train跟validation一开始就形同垃圾!
但怎麽办? 我们不是上帝,无法以N+1维的角度审视我们的资料啊,难道只能认了?
但凡人毕竟有凡人的做法,是的,我们没有上帝视角,但我们尽可能对数据做不同
的采样,这总可以吧? 这就是cross validation的由来.
我们把数据分割成三等分,每次取一份出来做validation,另外两份作trian
来生成模型,这样每一次我就会生成三个模型,给出三个performance,然後我拿
三个performance来取平均作为总的performance,以衡量我模型的好坏.
用平均表现去取代单次表现,抹平了因偏差而造成的极端情形.
这样是不是就尽可能的避免了我在切割train与validation时偏差的问题?
================================================================
结论:
洋洋洒洒写了一堆,我想讲的观念只有一个
=>
在高维空间中正确的分割train与validation是极其困难的!
这是机器学习成功的最关键前提,很多人也不觉得这步有啥特别,随便切个7:3
就是了.
殊不知这一步乃是机器学习的最核心,它超越了一切算法与架构.与高手
过招,其实早在这一步就已经决定往後的命运了.
算法问题,坦白说,老狗变不出新把戏,你会玩的模型书上都教了,谁不会?
但是建构好的特徵来正确的分割具有代表性的资料集,那可就是拚经验,拚功力,
各种奇淫巧技,各门各派,各有巧思.面对怎样的数据该怎麽做,靠的都是老司机
引路,从没有GPS可以看,在教科书上也绝对找不到完整的论述.
所以先忘了那些高深的算法吧,蹲好马步,从洗资料,筛特徵开始打好基础.特徵
工程看似不痛不痒,实乃重中之重.
其核心思想,就是想方设法让数据尽可能分布的均匀,尽可能做到让我们随机分
割数据集也不致过度偏差.但这毕竟是不够的,我们没有上帝视角,永远不晓得我
们分割得好不好. 所以只能引进cross validation,透过平均表现来抹去因偏
差而造成的极端表现,训练出真正具有泛化能力的模型.
不晓得这样讲完後,有没有对cross validation更了解一点?
--
★人生中最温暖的夏天是在纽约的冬天★
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 73.66.168.95
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1522083370.A.C1F.html
※ 编辑: pipidog (73.66.168.95), 03/27/2018 01:03:54
1F:推 patrick2dot0: 清楚明了 优质文给推 03/27 01:18
2F:推 dary856974: 推~ 03/27 01:21
3F:推 aszx4510: 推 奇淫巧技 03/27 02:10
4F:推 ACMANIAC: 这篇厉害 03/27 02:35
5F:推 ZuiYang: 必须推 03/27 02:54
6F:→ pipidog: BTW,文中说的cv分三份只是举例,实际上可能更多份,依数 03/27 03:07
7F:→ pipidog: 据大小而定。尽可能做到每份validation不失代表性 03/27 03:07
8F:→ pipidog: 教科书的范例,你随便切都不会出大问题,但现实中差得远了 03/27 03:11
9F:推 lucien0410: 老司机推 奇淫巧技也推 03/27 03:45
10F:推 yougigun: 清楚明了! 03/27 07:49
11F:推 gus2: 有招stratified cv,每次取validate set之前资料都会shuffle 03/27 08:14
12F:→ gus2: 随机性更高 03/27 08:16
13F:推 y956403: 推 03/27 08:46
14F:推 jojojen: "每1^2的超空间里有10K/(10)^2" <- "每10^2的" 有漏字? 03/27 09:25
15F:推 pxycho: 推说的浅显易懂 03/27 09:26
16F:推 F0011010101: 推! 这有没有可以放进去啊 03/27 09:38
17F:推 kokolotl: 推一下 03/27 09:40
18F:推 lucien0410: 还有一种Monte-Carlo Cross Validation 随机选取样本 03/27 09:54
19F:→ lucien0410: 来做validation 03/27 09:54
20F:→ bruce32118: 推推 03/27 10:04
21F:→ f496328mm: 第三点後面是在讲 K-fold ? 这招也不错 03/27 10:55
22F:→ f496328mm: 只是在 train 时, 就是以时间去换准确率 03/27 10:55
23F:→ f496328mm: 特徵工程真的是重中之重, model 大家都会用 03/27 10:57
24F:推 st1009: 16楼~我回家後会收入精华问题与讨论中 03/27 10:57
25F:推 howie7155: 推 可惜 有错字 03/27 11:30
26F:推 Luluemiko: 推 03/27 11:44
27F:推 lolmap: 推,谢谢分享 03/27 17:10
28F:推 heiwa: 推说明清楚 03/27 18:20
29F:推 ANGUS582: FE不管在比赛还是现实都是关键,每个人几乎都是把时间 03/27 20:32
30F:→ ANGUS582: 花在这 03/27 20:32
31F:推 kokolotl: 有间公司的产品主打省掉80%FE的时间,加速顾客的分析 03/27 20:49
32F:推 wilson0937: Push 03/27 22:54
33F:推 ranch941: 谢谢分享,越看越是喜欢这个领域 03/27 23:38
34F:→ tay2510: 感谢用心分享 03/28 00:01
35F:嘘 liang1230: 上面一堆推是ﴠ这整个是错的 去看一下田神的课好吗 03/28 02:12
36F:→ gus2: 楼上,你若要求有意义的讨论,最好就是回这篇文把你不同意 03/28 02:19
37F:→ gus2: 的地方拿出来讨论,而不是这种上对下叫别人去看什麽的态度 03/28 02:19
38F:推 lucien0410: 没错 请楼楼上回文 讨论这篇哪里讲错 指导一下 03/28 02:24
39F:推 ACMANIAC: 大大指正後才跳出来马後炮开嘘,不知道这心态是如何。 03/28 02:53
40F:嘘 kriswu8021: 严格来说就是误导啊 以後的人如果看到一堆推就以为是 03/28 03:13
41F:→ kriswu8021: 正解不就GG? 03/28 03:13
42F:→ gus2: 讲错就是误导,那我这辈子遇过的教授严格来说都在误导学生 03/28 04:17
43F:→ gus2: 学问这东西就是要讨论,不喜欢就把你观点/文献拿出来战 03/28 04:17
44F:→ gus2: 不然严格来说也只是键盘嘘文家 03/28 04:17
45F:推 tay2510: 原po开头就说是自己的见解了,只是因为他对cv存在的理由 03/28 10:33
46F:→ tay2510: 解读跟田神不同就嘘的人,根本连自己的想法也没有 帮补 03/28 10:33
47F:→ tay2510: 血 03/28 10:33
48F:嘘 ice80712: 有些观念根本似是而非 03/28 12:22
49F:嘘 kriswu8021: 笑死神逻辑 所以你觉得你教授都误导就代表误导是正确 03/28 13:37
50F:→ kriswu8021: 的? 03/28 13:37
51F:→ kriswu8021: 也许上ml之前要先修个逻辑课程的prerequisite 加油 03/28 13:38
52F:嘘 kriswu8021: 讨论就一定要推吗 你去panel谁跟你好声好气讨论 呵呵 03/28 13:41
53F:嘘 sunhextfn: 原po要不要重学一下机率与统计 03/28 14:29
54F:推 Kazimir: 你要是觉得哪里错 就指出哪里错 我的确不完全赞成这篇文 03/28 15:51
55F:→ Kazimir: 不过应该比较在於说观察角度上的不同 如果你认为哪里有 03/28 15:53
56F:→ Kazimir: 不好 指出来 拿出reference 这样才是一个大家都会受益的 03/28 15:54
57F:→ Kazimir: 讨论 03/28 15:54
58F:嘘 kriswu8021: 我问一个问题就好,如果cv是为了解决curse of dimensi 03/28 17:00
59F:→ kriswu8021: onality ,那在低维度的时候为什麽要用cv? 03/28 17:00
60F:→ kriswu8021: 这种东西不是什麽新科技 网路上一大堆 请学会Google 03/28 17:01
61F:推 lucien0410: kris大 真的不用这麽生气 想想田神的心平气和 03/28 17:10
62F:→ lucien0410: cv就是一种行为 一个algorithm 能有不同的用法 03/28 17:13
63F:→ lucien0410: 我自己认为讨论一开始发明是为了什麽 讨论来源 03/28 17:15
64F:→ lucien0410: 是历史学家的工作 电脑科学家数学家则是讨论algorithm 03/28 17:16
65F:→ lucien0410: 的性质和应用 03/28 17:17
66F:→ lucien0410: 你可以来讨论一下 原文这样处理维度问题会导致什麽问 03/28 17:19
67F:→ lucien0410: 题. Rosenblatt (1958) 第一次谈到了神经网路的数学 03/28 17:23
68F:→ lucien0410: 性质. 1958年 谁也不知道 现在DL会变这样 03/28 17:25
69F:嘘 kriswu8021: ... 03/28 17:32
70F:嘘 vcyc: zzzzzz 03/28 18:58
71F:→ gus2: 啥?这是风气问题,你要好好讨论还是指着错咬到死 03/28 19:41
72F:→ gus2: 这版刚建不久,风气好不好影响後面来的人愿不愿意po文讨论 03/28 19:41
73F:→ gus2: 建议去好一点的panel体验一下,质疑可以很直接,但不需要呛 03/28 19:41
74F:→ gus2: 然後回一个小事,我的逻辑是你"讲错就是误导"是不对的, 03/28 19:44
75F:→ gus2: 我就不清楚你怎麽推到误导是正确的了 03/28 19:44
76F:嘘 Mizuha: 我不觉得k大有咬着什麽啊XD 护航的很好笑就是了 03/29 03:09
77F:→ gus2: 就当不当的比喻吧,楼上这样一分我多说什麽都是护航了 03/29 05:34
78F:→ gus2: 想说的是,这些没有贡献讨论内容的嘘文对群组没益处 03/29 05:34
79F:推 lucien0410: 我又来护航了 希望你笑的开心 03/29 06:31
80F:→ neutrinopig: 讲错不是误导,对於错的东西集体推正确也不算误导 03/29 09:02
81F:→ neutrinopig: 贡献嘘文不会没意义阿,尤其在一面倒的推文中 03/29 09:05
82F:→ neutrinopig: 至少提醒了你有人有不同观点 03/29 09:06
83F:推 lovepork: 推pipidog 03/29 12:50
84F:推 nightflake: 新手推,希望前面几楼也可以分享一下观点赐教一下, 03/31 00:49
85F:→ nightflake: 感恩 03/31 00:49
86F:推 melonboya: 推推 U值好文 04/02 01:16
87F:推 Echeo: 推推 10/13 07:38