什麼是過擬合?
在訓練假設函數模型h時,爲了讓假設函數總能很好的擬合樣本特徵對應的真實值y,從而使得咱們所訓練的假設函數缺少泛化到新數據樣本能力。app
過擬合會在變量過多同時過少的訓練時發生,咱們有兩個選擇,一是減小特徵的數量,二是正則化,今天咱們來重點來討論正則化,它經過設置懲罰項讓參數θ足夠小,要讓咱們的代價函數足夠小,就要讓θ足夠小,因爲θ是特徵項前面的係數,這樣就使特徵項趨近於零。嶺迴歸與Lasso就是經過在代價函數後增長正則化項。機器學習
多元線性迴歸損失函數:ide
嶺迴歸迴歸代價函數:
函數
咱們從矩陣的角度來看。機器學習的核心在在於求解出θ使J(θ)最小。怎樣找到這個θ,經典的作法是使用梯度降低經過屢次迭代收斂到全局最小值,咱們也能夠用標準方程法直接一次性求解θ的最優值。當迴歸變量X不是列滿秩時, XX'的行列式接近於0,即接近於奇異,也就是某些列之間的線性相關性比較大時,傳統的最小二乘法就缺少穩定性,模型的可解釋性下降。所以,爲了解決這個問題,須要正則化刪除一些相關性較強特徵。學習
標準方程法:
加上正則化後:
spa
這裏,λ>=0是控制收縮量的複雜度參數:λ的值越大,收縮量越大,共線性的影響愈來愈小。在不斷增大懲罰函數係數的過程當中,畫出估計參數0(λ)的變化狀況,即爲嶺跡。經過嶺跡的形狀來判斷咱們是否要剔除掉該特徵(例如:嶺跡波動很大,說明該變量參數有共線性)。code
步驟:1.首先要對數據進行一些預處理,儘可能把保持全部特徵在一個範圍內,使用特徵縮放和均值歸一化來處理特徵值是頗有必要的,不然,不一樣特徵的特徵值大小是沒有比較性的。
2.其次構建懲罰函數,針對不一樣的λ,畫出嶺跡圖。
3.根據嶺跡圖,選擇要剔除那些特徵。blog
將嶺係數繪製爲正則化的函數
本例顯示了共線性對估計量係數的影響。嶺迴歸是本例中使用的估計量。 每種顏色表示係數矢量的不一樣特徵,而且這是做爲正則化參數的函數顯示的。這個例子還顯示了將嶺迴歸應用於高度病態的基質的有用性。對於這樣的矩陣,目標變量的輕微變化會致使計算權重的巨大差別。在這種狀況下,設置必定的正則化(λ)來減小這種變化(噪音)是有用的。當λ很大時,正則化效應支配平方損失函數,而且係數趨於零。在路徑的末尾,因爲λ趨於零,而且解決方案傾向於普通最小二乘,因此係數顯示出大的振盪。 在實踐中,須要調整λ以使二者之間保持平衡。ci
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model #X爲一個10*10的矩陣 X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis]) y = np.ones(10) ############################################################################## #設置不一樣的lambda和參數 n_lambda = 200 lambda = np.logspace(-10, -2, n_lambda) coefs = [] for a in lambda: ridge = linear_model.Ridge(lambda=a, fit_intercept=False) ridge.fit(X, y) coefs.append(ridge.coef_) # ############################################################################# #顯示繪製結果 ax = plt.gca() ax.plot(lambda, coefs) ax.set_xscale('log') ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis plt.xlabel(r'$\lambda$') plt.ylabel('weights') plt.title('Ridge coefficients as a function of the regularization') plt.axis('tight') plt.show()
結果:
get
感謝您的閱讀,若是您喜歡個人文章,歡迎關注我哦