Deciding What to Try Next
當我們已經完成了模型的選擇與訓練,最後發現對于新的資料集,我們的模型誤差很大,我們該怎麼辦。我們有接下來的一些方法去解決這個問題:
- 擷取更多的訓練集
- 減少特征數量
- 選擇更多的特征
- 增加高次項的特征( x 1 2 , x 1 2 , x 1 x 2 , e t c . x_1^{2},x_1^{2},x_1x_2,etc. x12,x12,x1x2,etc.)
- 減少 λ \lambda λ(正則系數)
- 增加 λ \lambda λ(正則系數)
但是這麼多選擇,我們應該從哪個入手呢,顯然随便選擇一個方向去嘗試是不太明智的,對于實際的機器學習問題,一般調試都是需要很久的,如果方向錯誤,幾個月的時間就浪費了。是以我們需要進行機器學習診斷,需要對我們的機器學習算法進行測試去找到一個最有可能提高我們模型性能的方向。雖然診斷是需要一定時間的,但是确實很好的利用了時間,而且比盲目嘗試要來的劃算得多。
首先第一步如何評判我們的假設的模型。
Evaluating a Hypothesis
在之前講到過拟合的時候,我們提到過可能對于訓練集來說我們模型的error很低,但是對于新的資料集可能我們error會變高(因為過拟合)。是以我們一般會把我們的資料集在一開始進行劃分,70%的資料作為訓練集,剩下的30%作為測試集,訓練集用來訓練模型,測試集用來模拟新資料拟合我們模型的情況。值得提的一點是,如果資料具有某種順序或者某種規律,最好随機進行資料劃分,個人覺得可能原因應該是減少資料之間的相關性。
使用兩個資料集的步驟:
- 用訓練集,學習 Θ \Theta Θ,降低 J t r a i n ( Θ ) J_{train}(\Theta) Jtrain(Θ)
- 計算測試集error J t e s t ( Θ ) J_{test}(\Theta) Jtest(Θ)
test set error
對于線性回歸:
J t e s t ( Θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h Θ ( x t e s t ( i ) ) − y t e s t ( i ) ) 2 J_{test}(\Theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\Theta(x_{test}^{(i)})-y_{test}^{(i)})^2 Jtest(Θ)=2mtest1i=1∑mtest(hΘ(xtest(i))−ytest(i))2
對于分類來說有兩種方法:
-
代價函數
J t e s t ( Θ ) = − 1 m t e s t ∑ i = 1 m t e s t y t e s t ( i ) log h Θ ( x t e s t ( i ) ) + ( 1 − y t e s t ( i ) ) ( 1 − log h Θ ( x t e s t ( i ) ) ) J_{test}(\Theta)=-\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}\log h_\Theta(x_{test}^{(i)}) + (1-y_{test}^{(i)})(1-\log h_\Theta(x_{test}^{(i)})) Jtest(Θ)=−mtest1i=1∑mtestytest(i)loghΘ(xtest(i))+(1−ytest(i))(1−loghΘ(xtest(i)))
-
Misclassification error (0/1 misclassification error)(分類錯誤率)
e r r ( h Θ ( x ) , y ) = { 1 if ( h Θ ( x ) ≥ 0.5 and y = 0 ) or ( h Θ ( x ) < 0.5 and y = 1 ) 0 otherwise err(h_\Theta(x),y)= \begin{cases} 1 & \text{if ($h_\Theta(x)\ge 0.5$ and $y=0$) or ($h_\Theta(x) < 0.5$ and $y=1$)} \\[2ex] 0 & \text{otherwise} \end{cases} err(hΘ(x),y)=⎩⎨⎧10if (hΘ(x)≥0.5 and y=0) or (hΘ(x)<0.5 and y=1)otherwise
Test Error = 1 m t e s t ∑ i = 1 m t e s t e r r ( h Θ ( x t e s t ( i ) ) , y t e s t ( i ) ) \text{Test Error} = \frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\Theta(x_{test}^{(i)}),y_{test}^{(i)}) Test Error=mtest1i=1∑mtesterr(hΘ(xtest(i)),ytest(i))
Model Selection
明白怎麼評判模型之後,第一步我們就是要驗證我們選擇的模型是否是最佳的。
假設現在我們要去拟合一個多次方程,那麼我們到底應該選擇幾次方程進行拟合呢,這顯然是一個頭疼的問題,于是我們使用上面說到的訓練集去訓練了1到10次方這10個方程。
然後通過測試集給出的error,我們選擇使用5次方的模型,那麼現在我們要給出模型的泛化能力的名額,但是我們不能直接使用 J t e s t ( Θ ( 5 ) ) J_{test}(\Theta^{(5)}) Jtest(Θ(5)),因為我們的測試集已經用來拟合我們的一個隐藏的參數(最高次方項d),是以模型對于這個測試集不再陌生,就相當于我們拿訓練集的error去判定了模型的泛化能力,顯然這是不對的。為了規避這個問題,我們進一步的對資料集進行劃分,添加一個Cross validation set(交叉)驗證集,我們将資料集比例,調整為訓練集占60%,驗證集占20%,測試集占20%。
那麼現在我們有了三個資料集,首先使用訓練集,訓練每個模型參數,然後使用驗證集進行測試,選出error最小的模型(模型最高次項為幾次方),最後使用測試集給出泛化誤差(generalization error)。