更優:幫你調試代碼!

點擊上方關注,All in AI中國

更優:幫你調試代碼!

在跳轉到代碼進行調試之前,請執行以下幾個步驟。

讓我們想象一下,這是一個美好的下午,你已經為你的模型寫了一個更好的算法,你希望它會帶給你正確的結果。此時,如果您在預測中發現了一些非常錯誤的信息,那麼您就是在正確的位置。

在進入解決方案之前,讓我們看一下將要使用的一些術語。

  1. 訓練集:您為算法提供輸入,以便訓練它並找到最適合您的數據。
  2. 交叉驗證集(CV):使用您的訓練示例預測模型中錯誤的數據集。
  3. 測試集:這是您要在其中測試模型並找出其準確性的數據集。

一般來說,如果你獲得訓練集,你可以將上述訓練集分為3個部分,其中60%用於訓練,20%用於驗證集,20%用於測試集(這只是一種劃分方法,你可以選擇這樣做或者不這樣做)。

現在,根據您選擇的數據集,您輸入的功能、正則化參數等,您可能遇到以下情況之一:

  1. 高偏差(低配):如果你的假設在訓練集上表現不佳且未能概括新的例子,那麼它就會遭受高度偏見。
  2. 高方差(過度擬合):如果您的假設在訓練集中表現良好,但對於驗證或任何新示例表現不佳,就會受到高方差的影響。

線性迴歸的典型偏差- 方差權衡(假設我們預測房價只有一個特徵,如房子的大小)如下圖所示。繪製的圖形僅沿X軸顯示X(訓練示例)的一個特徵,沿y軸輸出(訓練示例)。圖(a)顯示假設與訓練集的擬合程度,但由於角度大,因此無法概括新的例子。圖(c)表明該假設不適合訓練數據集,也未能概括。圖(b)顯示了最適合我們的訓練集以及驗證集的最佳擬合,因為它隨著房屋大小的增加而緩慢增長。

更優:幫你調試代碼!

如果你已經理解了上述問題,那就讓我們處理它們,看看如何解決它們。

如何解決高方差:通過使用正則化或通過增加訓練樣本的數量可以解決高方差。正則化確保假設的參數(最佳擬合的θ)低,以便可以避免角度,並且我們得到一個概括得很好的假設。

下圖顯示了房屋價格與房屋面積的成本函數,並採用了正則化。藍色曲線顯示假設的過度擬合,該假設對訓練集表現良好但未能概括。另一方面,品紅色曲線顯示正常化的作用。它對於訓練和新示例都表現良好。

更優:幫你調試代碼!

如果增加訓練樣例的數量,曲線會發現很難採用角度形狀,因此可以很好地推廣。

如何解決高偏差:可以通過增加訓練示例的特徵數量來解決高偏差,例如在房子的大小上增加多項式特徵,或引入更多特徵,如房屋位置、BHK數量等等。這樣可以防止曲線直線擬合,從而在訓練和新示例中表現良好。

下圖給出了不同的高偏差模型。

更優:幫你調試代碼!

注意:

  1. 在高偏差情況下,增加訓練集不會有太大的幫助。
  2. 應該避免使正則化參數(lambda)的值過高,因為它會對我們的θ參數造成嚴重的損失,並導致欠擬合。

現在,如果您想知道如何在我的代碼中實現這些概念,那麼您真的需要了解學習曲線!

學習曲線

為了理解學習曲線,讓我們看一下典型的高偏差曲線並對其進行分析。

更優:幫你調試代碼!

上圖顯示了僅具有一個特徵的線性迴歸的高偏差學習曲線。學習曲線沿y軸繪製有誤差(在訓練集和交叉驗證中),沿x軸繪製m(訓練樣本的數量)。從圖中可以明顯看出,如果m非常小,則訓練誤差非常小,但驗證誤差(CV)非常高,因為我們沒有很好地訓練數據集來進行推廣。隨著我們增加m的值,訓練誤差會增加,因為直線擬合不能再對大量數據集執行,但驗證誤差會減小,因為我們可以比以前更好地推廣它(因為它已被訓練)。在進一步增加m時,訓練和驗證集的誤差都會飽和,因為無論您輸入了多少數據集,直線擬合都無法適應這麼多數據集。

如何編寫這個概念:讓我們看看上面提到的概念的代碼。我已經在Matlab / Octave環境中編寫了代碼,但如果我們想要學習這個概念,這不是問題。

更優:幫你調試代碼!

我們運行從1到多個訓練樣例(m)的循環。X是包含所有訓練樣例的原始矩陣。Xt包含'i'個訓練樣例,Yt包含它們相應的輸出(這裡是房子的價格)。然後我們將Xt,Yt和正則化參數(lambda)傳遞給trainLinearReg函數,該函數返回給定數量的訓練樣例的最佳擬合(theta值)並將其存儲在theta中。最後,我們計算“i”個訓練樣例的誤差矩陣。error_train(i)包含“i”個訓練樣例的訓練集中的錯誤。error_val(i)包含'iith'迭代的驗證集中的錯誤。您可能會注意到,與訓練集不同,我們在每次迭代時都會傳遞整個驗證集。要計算訓練集或驗證集的誤差,我們只需將lambda作為零傳遞給linearRegCostFunction即可使用cost函數。

更優:幫你調試代碼!

當您同時使用錯誤矩陣(訓練和驗證)時,您應該繪製它們以使其可視化。

更優:幫你調試代碼!

plot函數從1到m取值,並繪製相應數量的訓練樣例的error_train和error_val。實施此操作後,您將獲得類似於上圖所示的高偏差曲線。

對於高方差,您將得到類似於下圖所示的曲線。

更優:幫你調試代碼!

注意:

  1. 與高偏差情況不同,驗證錯誤和訓練錯誤之間存在差距。
  2. 增加訓練樣例或正則化參數的數量可以幫助避免高方差。

到目前為止,您可以識別是否處於高偏差或高方差狀態,這是調試代碼的一個良好開端。

調整正則化參數(lambda):

我想告訴你的最後一件事是關於正則化參數lambda。特別是,沒有正則化(λ= 0)的模型很好地適合訓練集。相反,具有過多正則化的模型不適合訓練集和測試集。'λ'的良好選擇可以很好地適應數據。如果你跟著我,你可以很容易地找到你模型的lambda的最佳值。我們必須做與學習曲線相同的事情,即我們必須繪製“錯誤”和訓練樣例數之間的圖表。但是,這次我們必須改變參數lambda並在訓練和驗證集中看到相應的錯誤。錯誤即訓練和驗證都很低的區域將為我們提供λ的最佳值。讓我們看看這個概念背後的代碼。

更優:幫你調試代碼!

向量lambda_vec是一個向量,包含我們將要採用的lambda的各種值,並循環它以找到訓練集和validaiton集中的相應錯誤。讓我們看一下這個概念的圖表,並嘗試理解它是如何工作的。

更優:幫你調試代碼!

從圖中可以明顯看出,lambda值約為100可能是訓練模型的好選擇,因為此時交叉驗證和訓練集都具有較低的誤差值。在這一點上,我們已經看到了許多可能使我們的算法表現不佳的錯誤,以及我們如何消除這些問題。

練習合併所有這些概念並製作一個你自己的模型。

結論

因此,學習曲線有助於糾正高偏差、高方差以及模型中的正則化參數,從而節省大量時間。

更優:幫你調試代碼!


分享到:


相關文章: