第六週:正則化及機器學習中的概念補充

學習目標

  • 多項式迴歸與模型複雜度
  • 正則化
  • 模型的偏差和方差

多項式迴歸與模型複雜度

《淺析多項式迴歸與sklearn中的Pipeline》
多項式迴歸,通俗來看就是對數據集用多項式進行擬合,相較於線性迴歸,多項式可以擬合曲線細節更爲豐富,當然隨之而來的代價是模型複雜度的提升,進而造成模型的過擬合。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# 構造數據集

x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 + x**2 + x + 2 + np.random.normal(0, 1, size=100)
plt.scatter(x, y)
plt.show()

# 欠擬合

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X, y)
y_predict = lin_reg.predict(X)
plt.scatter(x, y)
plt.plot(x, y_predict, color='r')
plt.show()

# 過擬合

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

poly_reg = Pipeline([
    ('poly', PolynomialFeatures(degree=30)),
    ('std_scale', StandardScaler()),
    ('lin_reg', LinearRegression())
])


poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)

plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()

正則化

《(理論+代碼)模型正則化:L1正則、L2正則》
爲了防止因模型複雜度過高而導致其泛化性能太差,一般在損失函數中會引入正則化項來平衡模型複雜度。通常正則化有L1正則化和L2正則化。

# L1正則化
from sklearn.linear_model import Lasso

def LassoRegression(degree,alpha):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('std_scaler',StandardScaler()),
        ('lasso_reg',Lasso(alpha=alpha))
    ])

lasso_reg1 = LassoRegression(30,0.1)
lasso_reg1.fit(X,y)
y1_predict=lasso_reg1.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x), y1_predict[np.argsort(x)], color='r')
plt.show()

# L2正則化


from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline
# 需要傳入一個多項式項數的參數degree以及一個alpha值
def ridgeregression(degree,alpha):
    return Pipeline([
        ("poly", PolynomialFeatures(degree=degree)),
        ("standard", StandardScaler()),
        ("ridge_reg", Ridge(alpha=alpha))   #alpha值就是正則化那一項的係數
    ])
ridge1_reg = ridgeregression(degree=30,alpha=0.1)
ridge1_reg.fit(X,y)
y2_predict = ridge1_reg.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x), y2_predict[np.argsort(x)], color='r')
plt.show()

L1正則化就是在損失函數後邊所加正則項爲L1範數,加上L1範數容易得到稀疏解(0比較多),一般來說L1正則化較常使用。

L2正則化就是損失後邊所加正則項爲L2範數,加上L2正則相比於L1正則來說,得到的解比較平滑(不是稀疏),但是同樣能夠保證解中接近於0(但不是等於0,所以相對平滑)的維度比較多,降低模型的複雜度。

模型的偏差和方差

《ML/DL重要基礎概念:偏差和方差》

偏差和方差的定義

  • 偏差(bias):偏差衡量了模型的預測值與實際值之間的偏離關係。例如某模型的準確度爲96%,則說明是低偏差;反之,如果準確度只有70%,則說明是高偏差。
  • 方差(variance):方差描述的是訓練數據在不同迭代階段的訓練模型中,預測值的變化波動情況(或稱之爲離散情況)。從數學角度看,可以理解爲每個預測值與預測均值差的平方和的再求平均數。通常在模型訓練中,初始階段模型複雜度不高,爲低方差;隨着訓練量加大,模型逐步擬合訓練數據,複雜度開始變高,此時方差會逐漸變高。

解決方差和偏差的問題

我們要知道偏差和方差是無法完全避免的,只能儘量減少其影響。
在避免偏差時,需儘量選擇正確的模型,一個非線性問題而我們一直用線性模型去解決,那無論如何,高偏差是無法避免的。
有了正確的模型,我們還要慎重選擇數據集的大小,通常數據集越大越好,但大到數據集已經對整體所有數據有了一定的代表性後,再多的數據已經不能提升模型了,反而會帶來計算量的增加。而訓練數據太小一定是不好的,這會帶來過擬合,模型複雜度太高,方差很大,不同數據集訓練出來的模型變化非常大。
最後,要選擇合適的模型複雜度,複雜度高的模型通常對訓練數據有很好的擬合能力。
其實在機器學習領域,主要的挑戰來自方差。處理高方差的手段有:

  • 降低模型複雜度
  • 減少數據維度;降噪
  • 增加樣本數
  • 使用驗證集
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章