作者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://www.ptt.cc/bbs/DataScience/M.1522083370.A.C1F.html
※ 編輯: pipidog (73.66.168.95), 03/27/2018 01:03:54
推 patrick2dot0: 清楚明瞭 優質文給推 03/27 01:18
推 dary856974: 推~ 03/27 01:21
推 aszx4510: 推 奇淫巧技 03/27 02:10
推 ACMANIAC: 這篇厲害 03/27 02:35
推 ZuiYang: 必須推 03/27 02:54
→ pipidog: BTW,文中說的cv分三份只是舉例,實際上可能更多份,依數 03/27 03:07
→ pipidog: 據大小而定。盡可能做到每份validation不失代表性 03/27 03:07
→ pipidog: 教科書的範例,你隨便切都不會出大問題,但現實中差得遠了 03/27 03:11
推 lucien0410: 老司機推 奇淫巧技也推 03/27 03:45
推 yougigun: 清楚明瞭! 03/27 07:49
推 gus2: 有招stratified cv,每次取validate set之前資料都會shuffle 03/27 08:14
→ gus2: 隨機性更高 03/27 08:16
推 y956403: 推 03/27 08:46
推 jojojen: "每1^2的超空間裡有10K/(10)^2" <- "每10^2的" 有漏字? 03/27 09:25
推 pxycho: 推說的淺顯易懂 03/27 09:26
推 F0011010101: 推! 這有沒有精華區可以放進去啊 03/27 09:38
推 kokolotl: 推一下 03/27 09:40
推 lucien0410: 還有一種Monte-Carlo Cross Validation 隨機選取樣本 03/27 09:54
→ lucien0410: 來做validation 03/27 09:54
→ bruce32118: 推推 03/27 10:04
→ f496328mm: 第三點後面是在講 K-fold ? 這招也不錯 03/27 10:55
→ f496328mm: 只是在 train 時, 就是以時間去換準確率 03/27 10:55
→ f496328mm: 特徵工程真的是重中之重, model 大家都會用 03/27 10:57
推 st1009: 16樓~我回家後會收入精華問題與討論中 03/27 10:57
推 howie7155: 推 可惜 有錯字 03/27 11:30
推 Luluemiko: 推 03/27 11:44
推 lolmap: 推,謝謝分享 03/27 17:10
推 heiwa: 推說明清楚 03/27 18:20
推 ANGUS582: FE不管在比賽還是現實都是關鍵,每個人幾乎都是把時間 03/27 20:32
→ ANGUS582: 花在這 03/27 20:32
推 kokolotl: 有間公司的產品主打省掉80%FE的時間,加速顧客的分析 03/27 20:49
推 wilson0937: Push 03/27 22:54
推 ranch941: 謝謝分享,越看越是喜歡這個領域 03/27 23:38
→ tay2510: 感謝用心分享 03/28 00:01
噓 liang1230: 上面一堆推是ﴠ這整個是錯的 去看一下田神的課好嗎 03/28 02:12
→ gus2: 樓上,你若要求有意義的討論,最好就是回這篇文把你不同意 03/28 02:19
→ gus2: 的地方拿出來討論,而不是這種上對下叫別人去看什麼的態度 03/28 02:19
推 lucien0410: 沒錯 請樓樓上回文 討論這篇哪裡講錯 指導一下 03/28 02:24
推 ACMANIAC: 大大指正後才跳出來馬後炮開噓,不知道這心態是如何。 03/28 02:53
噓 kriswu8021: 嚴格來說就是誤導啊 以後的人如果看到一堆推就以為是 03/28 03:13
→ kriswu8021: 正解不就GG? 03/28 03:13
→ gus2: 講錯就是誤導,那我這輩子遇過的教授嚴格來說都在誤導學生 03/28 04:17
→ gus2: 學問這東西就是要討論,不喜歡就把你觀點/文獻拿出來戰 03/28 04:17
→ gus2: 不然嚴格來說也只是鍵盤噓文家 03/28 04:17
推 tay2510: 原po開頭就說是自己的見解了,只是因為他對cv存在的理由 03/28 10:33
→ tay2510: 解讀跟田神不同就噓的人,根本連自己的想法也沒有 幫補 03/28 10:33
→ tay2510: 血 03/28 10:33
噓 ice80712: 有些觀念根本似是而非 03/28 12:22
噓 kriswu8021: 笑死神邏輯 所以你覺得你教授都誤導就代表誤導是正確 03/28 13:37
→ kriswu8021: 的? 03/28 13:37
→ kriswu8021: 也許上ml之前要先修個邏輯課程的prerequisite 加油 03/28 13:38
噓 kriswu8021: 討論就一定要推嗎 你去panel誰跟你好聲好氣討論 呵呵 03/28 13:41
噓 sunhextfn: 原po要不要重學一下機率與統計 03/28 14:29
推 Kazimir: 你要是覺得哪裡錯 就指出哪裡錯 我的確不完全贊成這篇文 03/28 15:51
→ Kazimir: 不過應該比較在於說觀察角度上的不同 如果你認為哪裡有 03/28 15:53
→ Kazimir: 不好 指出來 拿出reference 這樣才是一個大家都會受益的 03/28 15:54
→ Kazimir: 討論 03/28 15:54
噓 kriswu8021: 我問一個問題就好,如果cv是為了解決curse of dimensi 03/28 17:00
→ kriswu8021: onality ,那在低維度的時候為什麼要用cv? 03/28 17:00
→ kriswu8021: 這種東西不是什麼新科技 網路上一大堆 請學會Google 03/28 17:01
推 lucien0410: kris大 真的不用這麼生氣 想想田神的心平氣和 03/28 17:10
→ lucien0410: cv就是一種行為 一個algorithm 能有不同的用法 03/28 17:13
→ lucien0410: 我自己認為討論一開始發明是為了什麼 討論來源 03/28 17:15
→ lucien0410: 是歷史學家的工作 電腦科學家數學家則是討論algorithm 03/28 17:16
→ lucien0410: 的性質和應用 03/28 17:17
→ lucien0410: 你可以來討論一下 原文這樣處理維度問題會導致什麼問 03/28 17:19
→ lucien0410: 題. Rosenblatt (1958) 第一次談到了神經網路的數學 03/28 17:23
→ lucien0410: 性質. 1958年 誰也不知道 現在DL會變這樣 03/28 17:25
噓 kriswu8021: ... 03/28 17:32
噓 vcyc: zzzzzz 03/28 18:58
→ gus2: 啥?這是風氣問題,你要好好討論還是指著錯咬到死 03/28 19:41
→ gus2: 這版剛建不久,風氣好不好影響後面來的人願不願意po文討論 03/28 19:41
→ gus2: 建議去好一點的panel體驗一下,質疑可以很直接,但不需要嗆 03/28 19:41
→ gus2: 然後回一個小事,我的邏輯是你"講錯就是誤導"是不對的, 03/28 19:44
→ gus2: 我就不清楚你怎麼推到誤導是正確的了 03/28 19:44
噓 Mizuha: 我不覺得k大有咬著什麼啊XD 護航的很好笑就是了 03/29 03:09
→ gus2: 就當不當的比喻吧,樓上這樣一分我多說什麼都是護航了 03/29 05:34
→ gus2: 想說的是,這些沒有貢獻討論內容的噓文對群組沒益處 03/29 05:34
推 lucien0410: 我又來護航了 希望你笑的開心 03/29 06:31
→ neutrinopig: 講錯不是誤導,對於錯的東西集體推正確也不算誤導 03/29 09:02
→ neutrinopig: 貢獻噓文不會沒意義阿,尤其在一面倒的推文中 03/29 09:05
→ neutrinopig: 至少提醒了你有人有不同觀點 03/29 09:06
推 lovepork: 推pipidog 03/29 12:50
推 nightflake: 新手推,希望前面幾樓也可以分享一下觀點賜教一下, 03/31 00:49
→ nightflake: 感恩 03/31 00:49
推 melonboya: 推推 U值好文 04/02 01:16
推 Echeo: 推推 10/13 07:38