在迴歸分析中,線性模型的一般預測公式是:
是預測值,讀作"y hat",是特徵的線性組合,把向量w稱作 coef_(係數),公式是:
把w0稱作intercept_(截距),這兩個屬性是線性模型的共有屬性。
一,線性迴歸
最基本的線性模型是線性迴歸,也稱作最小二乘法(OLS),線性迴歸的原理是:計算訓練集中y的預測值和其真實值之間的差值的平方Vn,使得Vn的和達到最小。從二維圖形來看, 最優擬合曲線應該使各點到直線的距離的平方和(即殘差平方和,簡稱RSS)最小:
OLS線性迴歸的目標是通過減少響應變數的真實值與預測值的差值來獲得模型引數(截距項和斜率),就是使RSS最小。
舉個線性迴歸(OLS)的例子,通過學習訓練集獲得模型的引數:coef_(係數)和 intercept_(截距),通過score()來評估模型,滿分是1.0,表示模型擬合的優劣程度:
>>> import numpy as np >>> from sklearn.linear_model import LinearRegression >>> X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) >>> # y = 1 * x_0 + 2 * x_1 + 3 >>> y = np.dot(X, np.array([1, 2])) + 3 >>> reg = LinearRegression().fit(X, y) >>> reg.score(X, y) 1.0 >>> reg.coef_ array([1., 2.]) >>> reg.intercept_ 3.0000... >>> reg.predict(np.array([[3, 5]])) array([16.])
也可以通過計算預測值和實際值的 Mean squared error 來評估模型。
>>> from sklearn.metrics import mean_squared_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred)
二,嶺迴歸
嶺迴歸(Ridge)實際上是一種改良的OLS,能夠避免過擬合的線性模型,在嶺迴歸中,模型會保留所有的特徵向量,但是會減少特徵變數的係數,讓特徵變數對預測結果的影響變小,在嶺迴歸中是通過改變alpha引數來控制減少特徵向量係數的程度。通過保留全部特徵變數,只是降低特徵向量的係數值來避免過擬合,這種方法稱作L2正則化。
引數alpha稱作正則強度,必須為正浮點數,較大的值表示較強的正則化,增加alpha的值會降低特徵變數的係數,從而降低訓練集對模型的擬合程度,有助於模型的泛化。
>>> from sklearn import linear_model >>> reg = linear_model.Ridge(alpha=.5) >>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) Ridge(alpha=0.5) >>> reg.coef_ array([0.34545455, 0.34545455]) >>> reg.intercept_ 0.13636...
三,套索迴歸
套索迴歸使用L1正則化來增加模型的泛化能力,L1正則化是指不使用全部的特徵變數,這就導致在使用套索迴歸的時候,會有一部分特徵的係數等於0,也就是說,有一些特徵會被模型忽略。L1正則化把一部分特徵的係數變成0,有助於突出體現模型中最重要的那些特徵。
>>> from sklearn import linear_model >>> reg = linear_model.Lasso(alpha=0.1) >>> reg.fit([[0, 0], [1, 1]], [0, 1]) Lasso(alpha=0.1) >>> reg.predict([[1, 1]]) array([0.8])
套索迴歸擁有線性迴歸的一般屬性:coef_ 和 intercept_。套索迴歸容易發生欠擬合,這意味著模型使用的特徵變數過少,這需要通過調節套索迴歸的alpha來實現,alpha引數用於控制特徵變數的係數被約束到0的強度,預設值是1,降低alpha的值會增加特徵變數的係數,使特徵變數不容易被忽略。實際上,alpha引數可以看作是忽略特徵變數的強度,1為最強,0表示使用全部的特徵變數。如果把alpha值設定的太低,就等於把正則化效果去除了,模型可能會像線性模型一樣,出現過擬合。
四,彈性網模型
彈性網(Elastic Net)模型是一個線性模型,使用L1和L2正則化,是套索迴歸和嶺迴歸的組合,在實踐中這兩個模型的組合是最好的,然而代價是使用者需要調節兩個引數,一個是懲罰因子,另一個是L1和L2的正則化引數,通過控制l1_ratio引數來控制L1和L2的正則化。
sklearn.linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5, ...)
alpha:懲罰因子,預設值是1,如果設定為0,那麼等價於OLS。
l1_ratio:對於l1_ratio = 0,懲罰L2正則,對於l1_ratio = 1,懲罰L1正則,對於0 <l1_ratio <1,懲罰是L1和L2的組合。
彈性網(Elastic Net)模型適用於當資料集有很多特徵,而這些特徵都跟另一個特徵相關時,Lasso模型傾向於從這些特徵中隨機挑選一個,而ElasticNet傾向於全部選擇。
在實際的應用中,常常要決定是使用L1正則化還是L2正則化,原則大體上是:如果資料集有很多特徵,而這些特徵不是每一個都對結果有重要的影響,那麼就應該選擇L1正則化;如果資料集中的特徵不是很多,而且每一個特徵都會結果有重要的影響,那麼就應該使用L2正則化。
參考文件: