1. 程式人生 > >李巨集毅老師機器學習課程筆記_ML Lecture 2: Where does the error come from?

李巨集毅老師機器學習課程筆記_ML Lecture 2: Where does the error come from?

####引言: 最近開始學習“機器學習”,早就聽說祖國寶島的李巨集毅老師的大名,一直沒有時間看他的系列課程。今天聽了一課,感覺非常棒,通俗易懂,而又能夠抓住重點,中間還能加上一些很有趣的例子加深學生的印象。 視訊連結(bilibili):[李巨集毅機器學習(2017)](https://www.bilibili.com/video/av10590361?from=search&seid=4930602846193099298) 另外已經有有心的同學做了速記並更新在github上:[李巨集毅機器學習筆記(LeeML-Notes)](https://datawhalechina.github.io/leeml-notes/#/?id=%e6%9d%8e%e5%ae%8f%e6%af%85%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0leeml-notes) 所以,接下來我的筆記只記錄一些我自己的總結和聽課當時的困惑,如果有能夠幫我解答的朋友也請多多指教。 ###一、誤差來自哪裡?該如何處理這些誤差? 從第一課可以知道,越複雜的模型並不一定會帶來越低的誤差(error)。誤差來自兩方面: - 偏差(bias) - 方差(variance) 如果可以診斷誤差的來源,就可以選擇適當的方法來改進自己的模型。 看到這裡我有一些困惑,誤差、偏差、方差聽起來太像了,到底有什麼區別呢? ![圖1 偏差、方差的區別](https://upload-images.jianshu.io/upload_images/2844213-a0ee8c82245e1f95.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 【此處與機器學習無關:圖1真的挺難得,不知不覺有一種管理方面感觸的代入感,左上角圖表示好的領導(戰略決策層)與好的員工(戰術執行層)的配合,右上角圖表示好的領導(戰略決策層)與差的員工(戰術執行層)的配合,左下角圖表示差的領導(戰略決策層)與好的員工(戰術執行層)的配合,右下角圖表示差的領導(戰略決策層)與差的員工(戰術執行層)的配合。從這方面可以看出,一個好的戰略決策有多麼重要!】 ![圖2 模型複雜度、誤差、偏差、方差的關係](https://upload-images.jianshu.io/upload_images/2844213-80ee136023c8bd69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![圖3 機器學習的過程是尋找到合適的f^](https://upload-images.jianshu.io/upload_images/2844213-4ded6604bb3293bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 簡單的模型(如一次方程)所帶來的方差比複雜模型(如五次方程)所帶來的方差要小如圖4。 ![圖4 簡單的模型有助於控制模型空間,從而控制方差大小](https://upload-images.jianshu.io/upload_images/2844213-94b264fb95c12e95.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 雖然簡單的模型有助於控制方差,但如果一開始選定的範圍並沒有包含f^,那麼f*所帶來的偏差也有很大可能帶來誤差。如圖5。 ![圖5](https://upload-images.jianshu.io/upload_images/2844213-18fba7c0e7c8c2c6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - 如果誤差來自於偏差,那麼往往在訓練集上欠擬合(underfitting) - 如果誤差來自於方差,那麼往往在訓練集上過擬合(overfitting) ![圖6 ](https://upload-images.jianshu.io/upload_images/2844213-4411bc42a4de6eb5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 機器學習需要弄清楚一件事情:誤差來自哪裡?如果是偏差,那麼該怎麼辦?如果是方差,那麼又該怎麼辦?如圖7。 - 當欠擬合的時候(資料無法很好擬合f*),那就來自偏差,這時應該重新設計模型,因為f^沒有被f*所包含 - 當過擬合的時候,那誤差就來自方差,這時候有兩種辦法: - 增加資料:幾乎是萬靈丹,不會傷害偏差,但有一個缺點是成本太高 - 正則化:可以使曲線變得平滑 ![圖7 ](https://upload-images.jianshu.io/upload_images/2844213-c8e132c628d9951c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ###二、選擇模型的過程中需要注意的事情 通常我們都可以在偏差和方差之間找到一個平衡,從而找到合適的模型。但一定不要做這樣的事情: 直接用全部訓練集直接選擇模型,這樣你在測試集上得到的誤差並不能反映真實測試集上的誤差。如圖8。 ![圖8 選擇模型的時候不要做什麼](https://upload-images.jianshu.io/upload_images/2844213-ea274111782228b1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 那麼應該怎麼做? - 交叉驗證:將訓練集分為訓練集和驗證集(validation set),先用這兩個集合選擇出誤差比較小的模型,然後拿自己的測試集來比較誤差的大小。如果覺得第一步本身訓練集並不大還要再分的話,可以在選好模型後在整個訓練集上再確認一下。這樣你的測試集基本上可以反映出模型在真正測試集的誤差。如圖9。 ![圖9](https://upload-images.jianshu.io/upload_images/2844213-66b9d9252cbbee30.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果你擔心自己分的測試集可能帶來偏差的話,可以做N次交叉驗證,將訓練集分為多組小訓練集1,小訓練集2,小驗證集,得到誤差最小的模型後再在全量的訓練集上繼續訓練即可。如圖10。 ![圖10](https://upload-images.jianshu.io/upload_images/2844213-86ad1b0951687495.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 在這裡李巨集毅老師特別提到,在訓練集上選好模型後,如果測試集上表現偏差比較大,不要再返回去選擇那些誤差表現大的模型,因為他們可能在private測試集上表現出的誤差可能會