學習筆記之模型正則化

我們前面提到過,降低方差的方法有模型正則化,此方法也是最重要提供模型泛化能力方法。我們今天瞭解L1和L2兩種正則化方法。用到正則化的算法有Lasso迴歸、嶺迴歸、支持向量機等。

一、模型正則化概念

模型正則化(Regularization),對學習算法的修改,限制參數的大小,減少泛化誤差而不是訓練誤差。

在使用比較複雜的模型,去擬合數據時,很容易出現過擬合現象(訓練集表現很好,測試集表現較差),這會導致模型的泛化能力下降,這時候,我們就需要使用正則化,降低模型的複雜度。

正則化的策略包括:約束和懲罰被設計爲編碼特定類型的先驗知識 偏好簡單模型其他形式的正則化,如:集成的方法,即結合多個假說解釋訓練數據。

二、L1正則化

L1正則化,就是在目標函數中加了L1範數這一項。使用L1正則化的迴歸模型叫做LASSO迴歸(Least Absolute Shrinkage and Selection Operator Regression)。

數學原理就是:若模型過擬合,參數θ就會非常大。爲了限制參數θ,我們改變損失函數,加入模型正則化。使J(θ)=MSE(y,y^;θ)+αi=1nθiJ(θ)=MSE(y,\hat{y};θ)+\alpha\sum_{i=1}^{n}|θ_i|儘可能小。

注意:
①、 i=1nθi\sum_{i=1}^{n}|θ_i|取值範圍是1~n,即不包含θ0θ_0。這是因爲,θ0θ_0不是任何一個參數的係數,是截距。反映到圖形上就是θ0θ_0反映了曲線的高低,而不決定曲線每一部分的陡峭與緩和。所以模型正則化時不需要。
②、對於超參數α\alpha係數,在模型正則化的新的損失函數中,要讓每個θiθ_i都儘可能小的程度佔整個優化損失函數程度的多少。即α\alpha的大小表示優化的側重。

L1正則化可以使得參數稀疏化,即得到的參數是一個稀疏矩陣。因此可以常使用LASSO迴歸做特徵選擇,篩選最重要的特徵。

# 使用Pipeline封裝一個Lasso迴歸方法
def LassoRegression(degree,alpha):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std_scaler',StandardScaler()),
        ('lasso_reg',Lasso(alpha=alpha))
    ])
    # 我們調整alpha=0.0001,0.1,10 看不同結果
alphas=[0.0001,0.1,10]
for alpha in alphas:
    lasso_reg = LassoRegression(30,alpha)
    lasso_reg.fit(X_train,y_train)
    y1_predict=lasso_reg.predict(X_test)
    print(mean_squared_error(y_test,y1_predict)) 
    X_plot = np.linspace(-3,3,100).reshape(100,1)
    y_plot = lasso_reg.predict(X_plot)
    plt.scatter(X,y)
    plt.plot(X_plot[:,0],y_plot,color='r')
    plt.axis([-3,3,0,10])
    plt.show()

看效果圖發現,α值適中,模型效果才更佳。
α=0.0001
α=0.0001的圖形
α=0.01
在這裏插入圖片描述
α=10
在這裏插入圖片描述

三、L2正則化

L2正則化,就是在目標函數中加了L2範數這一項(用平方和來做正則項)。使用L2正則化的迴歸模型叫做嶺迴歸(Ridge Regression)。

數學原理就是:若模型過擬合,參數θ就會非常大。爲了限制參數θ,我們改變損失函數,加入模型正則化。使J(θ)=MSE(y,y^;θ)+αi=1nθi2J(θ)=MSE(y,\hat{y};θ)+\alpha\sum_{i=1}^{n}θ_i^{2}儘可能小。

將係數壓縮無限接近0,不會等於0;因此,和LASSO迴歸對比,不會生成稀疏矩陣。

# 使用Pipeline封裝一個Lasso迴歸方法
def ridgeregression(degree,alpha):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std_scaler',StandardScaler()),
        ('ridge_reg',Ridge(alpha=alpha))
    ])
    # 我們調整alpha=0.0001,1,1000 看不同結果
alphas=[0.0001,1,1000]
for alpha in alphas:
    ridge_reg = ridgeregression(30,alpha)
    ridge_reg.fit(X_train,y_train)
    y1_predict=ridge_reg.predict(X_test)
    print(mean_squared_error(y_test,y1_predict)) 
    X_plot = np.linspace(-3,3,100).reshape(100,1)
    y_plot = ridge_reg.predict(X_plot)
    plt.scatter(X,y)
    plt.plot(X_plot[:,0],y_plot,color='r')
    plt.axis([-3,3,0,10])
    plt.show()

看效果圖發現,跟LASSO迴歸一樣,α值適中,模型效果才更佳。

α=0.0001
在這裏插入圖片描述
α=1
在這裏插入圖片描述
α=1000
在這裏插入圖片描述

完整代碼
參考文章:https://mp.weixin.qq.com/s/fbwx0mlG88YjFTNwYErnxQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章