正則化的回歸是在普通回歸經驗風險中加入正則項構成的回歸,如式(9-10)所示:
正則化原理最常見的正則化方法是使用Lp正則化項,即Lp範數,其數學表達式為式(9-11):
圖9-4描述了二維情況下Lp範數的幾何圖形:
機器學習中最常見的是使用L1和L2正則化,即圖9-4中的兩條實線表示的曲線,一個曲線尖銳,一個則很圓滑。
回歸參數求解時就是對𝛽進行上述的範數計算並受到正則範圍限制。
最小𝛽周圍不斷擴展的等高線與上述幾何圖形相切的點,即為𝛽的滿足限制條件的取值,L1的限制下該等高線會和Y軸相切得到X軸上係數為0的𝛽,而與L2得到的是非零的兩個𝛽
Lasso和Ridge回歸L1的回歸稱為Lasso(套索)回歸,L2的回歸稱為Ridge(嶺)回歸。
Lasso回歸由於具有產生係數為0的特性(係數為0的特徵表示未被選中),使得它具有特徵選擇的效果。
Ridge回歸則具有壓縮(Shrink)係數的特性,能有效避免過擬合。
兩種正則的線性組合稱為ElasticNet(彈性網絡)回歸
Sklearn中的正則化的回歸實現較為全面。
普通:Lasso、Ridge 、ElasticNet、RidgeClassifier;帶交叉驗證:LassoCV、RidgeCV、ElasticNetCV、RidgeClassifierCV。Statsmodels中也支持部分正則化的方法,請參考:
regression.linear_model.GLS.fit_regularized
正則化效果演示數據準備使用三角函數cos模擬了48個點,同時構造了這些不同冪的值:
np.random.seed(42)
x = np.array([i * np.pi / 180 for i in range(-180, 60, 5)])
# 加入了分布正態的噪聲
y = np.cos(x) + np.random.normal(0, 0.15, len(x))
data = pd.DataFrame(np.column_stack([x, y]), columns=['x', 'y'])
pow_max = 13
# 構造不同冪的x
for i in range(2, pow_max):
colname = 'x_%d' % i
data[colname] = data['x']**i
普通線性回歸使用普通線性回歸模型擬合上述的點,
from sklearn.linear_model import LinearRegression
繪製指定冪的4個圖形並記錄所有冪的擬合情況:
係數情況:
Lasso回歸
from sklearn.linear_model import Lasso
使用不同的正則懲罰力度進行擬合,效果如下:
係數情況:
圖9-9的第一列,隨著alpha的增加RSS不斷增加,模型複雜度降低,回歸係數為0的個數不斷增加,係數矩陣逐漸稀疏,當alpha為0.1時的擬合曲線已經變成了平行於x軸的直線,即所有的回歸係數都為0
Ridge回歸使用不同的正則懲罰力度進行擬合,效果如下:
係數情況:
從圖9-11可以看出:
隨著alpha的增大,係數越來越小,逐漸趨向於0;
RSS增加,模型複雜度降低的同時逐漸從過擬合到欠擬合。
當alpha為1e-15時,該曲線和普通線性回歸中最後一個圖基本一致,表示沒有正則化的效果,而當alpha為0.001時,對模型過擬合進行了良好的矯正,但是當alpha為50時,所有回歸係數幾乎都為0,導致擬合的曲線接近一條直線,出現欠擬合。
需要注意的是:此時係數接近0,但並不為0,這是與Lasso差異最顯著的地方。
本文摘編自《機器學習:軟體工程方法與實現》,經出版方授權發布。