1. 程式人生 > >機器學習入門系列03,Error的來源:偏差和方差(bias和variance)

機器學習入門系列03,Error的來源:偏差和方差(bias和variance)

回顧

第二篇中神奇寶貝的例子:

        可以看出越複雜的model 再測試集上的效能並不是越好

這篇要討論的就是 error 來自什麼地方?error主要的來源有兩個,bias(偏差) 和 variance(方差)

估測

假設上圖為神奇寶貝cp值的真正方程,當然這隻有Niantic(製作《Pokemon Go》的遊戲公司)知道。從訓練集中可以找到真實方程f̂  的近似方程 f

估測bias 和 variance

估測變數 x 的平均值

  • 假設x的平均值為 μ,方差為 σ2

估測平均值怎麼做呢?

  • 首先拿到N個樣品點:x1,x2,,xN
  • 計算平均值得到m, m=1Nnxnμ

但是如果計算很多組的m ,然後求m的期望

E[m]=E[1Nnxn]=1NnE[xn]=μ

這個估計呢是無偏估計(unbiased)。

然後m分佈對於 μ 的離散程度(方差):

Var[m]=σ2N

這主要取決於N,下圖可看出N越小越離散

估測變數 x 的方差

首先用剛才的方法估測m,

m=1Nnxnμ

然後再做下面計算:

s2=1Nn(xnm)2

就可以用s2來估測  σ2

這個估計是有偏估計(biased),

s2的期望值:

E[s2]=N1Nσ2σ2

用靶心來說明一下bias和variance的影響

靶心為真正的方程 f̂  ,深藍色點為f ,是實驗求得的方程。求f

的期望值f¯=E[f],即圖中淺藍色的點。

f¯f̂ 之間的距離就是誤差 bias,而f¯f 之間的距離就是誤差 variance。4幅圖的對比觀察兩個誤差的影響。

bias就是射擊時瞄準的誤差,本來應該是瞄準靶心,但bias就造成瞄準準心的誤差;而variance就是雖然瞄準在 f¯,但是射不準,總是射在 f¯ 的周圍。

為什麼會有很多的 f?

討論系列02中的案例:這裡假設是在平行宇宙中,抓了不同的神奇寶貝

用同一個model,在不同的訓練集中找到的 f就是不一樣的

這就像在靶心上射擊,進行了很多組(一組多次)。現在需要知道它的散佈是怎樣的,將100個宇宙中的model畫出來

不同的資料集之前什麼都有可能發生—||

考慮不同model的variance

一次model的variance就比較小的,也就是是比較集中,離散程度較小。而5次model 的 variance就比較大,同理散佈比較廣,離散程度較大。

所以用比較簡單的model,variance是比較小的(就像射擊的時候每次的時候,每次射擊的設定都集中在一個比較小的區域內)。如果用了複雜的model,variance就很大,散佈比較開。

這也是因為簡單的model受到不同訓練集的影響是比較小的。

考慮不同model的 bias

這裡沒辦法知道真正的 f̂ ,所以假設圖中的那條黑色曲線為真正的 f̂ 

結果視覺化,一次平均的 f¯沒有5次的好,雖然5次的整體結果離散程度很高。

一次model的bias比較大,而複雜的5次model,bias就比較小。

直觀的解釋:簡單的model函式集的space比較小,所以可能space裡面就沒有包含靶心,肯定射不中。而複雜的model函式集的space比較大,可能就包含的靶心,只是沒有辦法找到確切的靶心在哪,但足夠多的,就可能得到真正的 f¯

bias v.s. variance

將系列02中的誤差拆分為bias何variance。簡單model(左邊)是bias比較大造成的error,這種情況叫做 Underfitting(欠擬合),而複雜model(右邊)是variance過大造成的error,這種情況叫做Overfitting(過擬合)

怎麼判斷?

分析

  • 如果model沒有很好的fit訓練集,就是bias過大,也就是Underfitting
  • 如果model很好的fit訓練集,即再訓練集上得到很小的error,但在測試集上得到大的error,這意味著model可能是variance比較大,就是Overfitting。

對於Underfitting和Overfitting,是用不同的方式來處理的

bias大,Underfitting

此時應該重新設計model。因為之前的函式集裡面可能根本沒有包含f̂ 。可以:

  • 將更多的feature加進去,比如考慮高度重量,或者HP值等等。
  • 或者考慮更多次冪、更復雜的model。

如果此時強行再收集更多的data去訓練,這是沒有什麼幫助的,因為設計的函式集本身就不好,再找更多的訓練集也不會更好。

variance大,Overfitting

簡單粗暴的方法:More data

但是很多時候不一定能做到收集更多的data。可以針對對問題的理解對資料集做調整(Regularization)。比如識別手寫數字的時候,偏轉角度的資料集不夠,那就將正常的資料集左轉15度,右轉15度,類似這樣的處理。

選擇model

  • 現在在bias和variance之間就需要一個權衡
  • 想選擇的model,可以平衡bias和variance產生的error,使得總error最小
  • 但是下面這件事最好不要做:

用訓練集訓練不同的model,然後在測試集上比較error,model3的error比較小,就認為model3好。但實際上這只是你手上的測試集,真正完整的測試集並沒有。比如在已有的測試集上error是0.5,但有條件收集到更多的測試集後通常得到的error都是大於0.5的。

Cross Validation(交叉驗證)

圖中public的測試集是已有的,private是沒有的,不知道的。Cross Validation 就是將訓練集再分為兩部分,一部分作為訓練集,一部分作為驗證集。用訓練集訓練model,然後再驗證集上比較,確實出最好的model之後(比如model3),再用全部的訓練集訓練model3,然後再用public的測試集進行測試,此時一般得到的error都是大一些的。不過此時會比較想再回去調一下引數,調整model,讓在public的測試集上更好,但不太推薦這樣。(心裡難受啊,大學數模的時候就回去調,來回痛苦折騰)

上述方法可能會擔心將訓練集拆分的時候分的效果比較差怎麼辦,可以用下面的方法。

N-fold Cross Validation(N-折交叉驗證)

將訓練集分成N份,比如分成3份。

比如在三份中訓練結果Average Error是model1最好,再用全部訓練集訓練model1。(貌似數模也幹過,當年都是莫名其妙的分,想想當年數模的時候都根本來不及看是為什麼,就是一股腦上去做00oo00)