Ridge和Lasso回歸:Python Scikit-Learn的完整指南

今天我們將通過線性迴歸深入研究機器學習中的監督學習,特別是兩種特殊的線性迴歸機器學習模型--Lasso和Ridge迴歸。

首先讓我們澄清線性機器學習模型是使用輸入特徵的線性函數預測輸出的最簡單方法之一。

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

具有p特徵的線性模型用於輸出預測

在上面的等式(1.1)中,我們展示了基於n個特徵的線性模型。僅考慮單個特徵時,您可能已經知道w [0]將是斜率而b將表示截距。線性迴歸尋找優化w和b,以便最小化成本函數。成本函數可以寫成

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

簡單線性模型的成本函數

在上面的等式中,我假設數據集有M個實例和p個特徵。一旦我們對劃分為訓練集和測試集的數據集使用線性迴歸,計算訓練集和測試集的分數可以讓我們粗略地瞭解機器學習模型是過度擬合還是欠擬合。如果你足夠幸運的話,選擇的線性模型也可以是正確的!如果我們在機器學習數據集上只有很少的特徵,而且訓練和測試集的分數都很低,那麼這就是欠擬合的問題。另一方面,如果我們有大量的特徵,測試分數相對於訓練分數來說是比較差的,那麼這就是過度泛化或過度擬合的問題。Ridge 迴歸和Lasso迴歸是一些簡單的技術,以減少機器學習模型的複雜性和防止過度擬合可能導致的簡單線性迴歸。

Ridge迴歸:在Ridge迴歸中,通過添加相當於係數大小的平方的懲罰來改變成本函數。

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

Ridge迴歸的成本函數

這相當於在下面的條件下最小化等式1.2中的成本函數

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

補充1:對Ridge迴歸係數進行約束

因此Ridge迴歸對係數(w)施加約束。懲罰項(lambda)使係數正則化,使得如果係數取大值,則優化函數受到懲罰。因此,Ridge迴歸會縮小系數,有助於降低模型複雜度和多重共線性。回到eq.1.3可以看出,當lambda趨於零時,成本函數變得類似於線性迴歸代價函數(方程1.2)。因此降低特徵上的約束(low lambda),模型將類似於線性迴歸模型。讓我們看一個使用波士頓房屋數據的例子,下面是用來描述線性迴歸的Python代碼,作為Ridge迴歸的極限情況 -

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib
matplotlib.rcParams.update({'font.size': 12})
from sklearn.datasets import load_boston
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
boston=load_boston()
boston_df=pd.DataFrame(boston.data,columns=boston.feature_names)
#print boston_df.info()
boston_df['Price']=boston.target
#print boston_df.head(3)
newX=boston_df.drop('Price',axis=1)
print newX[0:3] # check
newY=boston_df['Price']
#print type(newY)# pandas core frame
X_train,X_test,y_train,y_test=train_test_split(newX,newY,test_size=0.3,random_state=3)
print len(X_test), len(y_test)
lr = LinearRegression()
lr.fit(X_train, y_train)
# higher the alpha value, more restriction on the coefficients; low alpha > more #generalization, coefficients are barely
rr = Ridge(alpha=0.01)
# restricted and in this case linear and ridge regression resembles
rr.fit(X_train, y_train)
rr100 = Ridge(alpha=100) # comparison with alpha value
rr100.fit(X_train, y_train)
train_score=lr.score(X_train, y_train)
test_score=lr.score(X_test, y_test)
Ridge_train_score = rr.score(X_train,y_train)
Ridge_test_score = rr.score(X_test, y_test)
Ridge_train_score100 = rr100.score(X_train,y_train)
Ridge_test_score100 = rr100.score(X_test, y_test)
print "linear regression train score:", train_score
print "linear regression test score:", test_score
print "ridge regression train score low alpha:", Ridge_train_score
print "ridge regression test score low alpha:", Ridge_test_score
print "ridge regression train score high alpha:", Ridge_train_score100
print "ridge regression test score high alpha:", Ridge_test_score100
plt.plot(rr.coef_,alpha=0.7,linestyle='none',marker='*',markersize=5,color='red',label=r'Ridge; $\alpha = 0.01$',zorder=7) # zorder for ordering the markers
plt.plot(rr100.coef_,alpha=0.5,linestyle='none',marker='d',markersize=6,color='blue',label=r'Ridge; $\alpha = 100$') # alpha here is for transparency
plt.plot(lr.coef_,alpha=0.4,linestyle='none',marker='o',markersize=7,color='green',label='Linear Regression')
plt.xlabel('Coefficient Index',fontsize=16)
plt.ylabel('Coefficient Magnitude',fontsize=16)
plt.legend(fontsize=13,loc=4)
plt.show()

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

圖1:不同α值的Ridge迴歸,以顯示線性迴歸作為Ridge迴歸的限制情況

讓我們理解上圖。在X軸中我們繪製係數索引,對於波士頓數據,有13個特徵(對於Python第0個索引,指的是第1個特徵)。對於低的α值(0.01),當係數受到較少限制時,係數幅度幾乎與線性迴歸相同。對於更高的α(100)值,我們看到對於係數指數3,4,5,與線性迴歸情況相比,幅度要小得多。

在更多地討論這些概念之前,我們首先通過Lasso(least absolute shrinkage and selection operator)迴歸。Lasso迴歸的成本函數可以寫成

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

Lasso迴歸的成本函數

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

補充2:Lasso迴歸係數; 受到類似於Ridge的限制,如前所示

就像Ridge迴歸成本函數一樣,對於λ= 0,上面的等式簡化為等式1.2。唯一的區別是係數的平方而不是模數。這種類型的正則化(L1)可以導致零係數,即,對於輸出的評估,一些特徵被完全忽略。因此,Lasso迴歸不僅有助於減少過度擬合,而且可以幫助我們進行特徵選擇。就像Ridge迴歸一樣,可以控制正則化參數(lambda),我們將在下面使用癌症數據集看到效果sklearn。我使用癌症數據而不是之前使用的波士頓房屋數據的原因是癌症數據集與波士頓房屋數據的13個特徵相比具有30個特徵,因此通過改變正則化可以很好地描述使用Lasso迴歸的特徵選擇參數。

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

圖2:Lasso迴歸和特徵選擇依賴於正則化參數值

我用來製作這些圖的Python代碼如下

import math 
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# difference of lasso and ridge regression is that some of the coefficients can be zero i.e. some of the features are
# completely neglected
from sklearn.linear_model import Lasso
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_breast_cancer
from sklearn.cross_validation import train_test_split
cancer = load_breast_cancer()
#print cancer.keys()
cancer_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)

#print cancer_df.head(3)
X = cancer.data
Y = cancer.target
X_train,X_test,y_train,y_test=train_test_split(X,Y, test_size=0.3, random_state=31)
lasso = Lasso()
lasso.fit(X_train,y_train)
train_score=lasso.score(X_train,y_train)
test_score=lasso.score(X_test,y_test)
coeff_used = np.sum(lasso.coef_!=0)
print "training score:", train_score
print "test score: ", test_score
print "number of features used: ", coeff_used
lasso001 = Lasso(alpha=0.01, max_iter=10e5)
lasso001.fit(X_train,y_train)
train_score001=lasso001.score(X_train,y_train)
test_score001=lasso001.score(X_test,y_test)
coeff_used001 = np.sum(lasso001.coef_!=0)
print "training score for alpha=0.01:", train_score001
print "test score for alpha =0.01: ", test_score001
print "number of features used: for alpha =0.01:", coeff_used001
lasso00001 = Lasso(alpha=0.0001, max_iter=10e5)
lasso00001.fit(X_train,y_train)
train_score00001=lasso00001.score(X_train,y_train)
test_score00001=lasso00001.score(X_test,y_test)
coeff_used00001 = np.sum(lasso00001.coef_!=0)
print "training score for alpha=0.0001:", train_score00001
print "test score for alpha =0.0001: ", test_score00001
print "number of features used: for alpha =0.0001:", coeff_used00001
lr = LinearRegression()
lr.fit(X_train,y_train)
lr_train_score=lr.score(X_train,y_train)
lr_test_score=lr.score(X_test,y_test)
print "LR training score:", lr_train_score
print "LR test score: ", lr_test_score
plt.subplot(1,2,1)
plt.plot(lasso.coef_,alpha=0.7,linestyle='none',marker='*',markersize=5,color='red',label=r'Lasso; $\alpha = 1$',zorder=7) # alpha here is for transparency
plt.plot(lasso001.coef_,alpha=0.5,linestyle='none',marker='d',markersize=6,color='blue',label=r'Lasso; $\alpha = 0.01$') # alpha here is for transparency

plt.xlabel('Coefficient Index',fontsize=16)
plt.ylabel('Coefficient Magnitude',fontsize=16)
plt.legend(fontsize=13,loc=4)
plt.subplot(1,2,2)
plt.plot(lasso.coef_,alpha=0.7,linestyle='none',marker='*',markersize=5,color='red',label=r'Lasso; $\alpha = 1$',zorder=7) # alpha here is for transparency
plt.plot(lasso001.coef_,alpha=0.5,linestyle='none',marker='d',markersize=6,color='blue',label=r'Lasso; $\alpha = 0.01$') # alpha here is for transparency
plt.plot(lasso00001.coef_,alpha=0.8,linestyle='none',marker='v',markersize=6,color='black',label=r'Lasso; $\alpha = 0.00001$') # alpha here is for transparency
plt.plot(lr.coef_,alpha=0.7,linestyle='none',marker='o',markersize=5,color='green',label='Linear Regression',zorder=2)
plt.xlabel('Coefficient Index',fontsize=16)
plt.ylabel('Coefficient Magnitude',fontsize=16)
plt.legend(fontsize=13,loc=4)
plt.tight_layout()

plt.show()
Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

讓我們在簡短的總結中理解圖形和Python代碼。

  • Lasso迴歸中的正則化參數的默認值(由alpha給出)為1。
  • 因此,在癌症數據集中的30個特徵中,僅使用了4個特徵(係數的非零值)。
  • 訓練和測試分數(僅有4個特徵)都很低; 得出結論,該模型不擬合癌症數據集。
  • 通過減少alpha和增加迭代次數來減少這種欠擬合。現在alpha = 0.01,非零特徵= 10,訓練和測試分數增加。
  • 兩個不同α值的係數幅度的比較顯示在圖2的左圖中。對於α= 1,我們可以看到大多數係數為零或接近零,而α= 0.01則不是這種情況。
  • 進一步降低α= 0.0001,非零特徵= 22.訓練和測試分數與基本線性迴歸情況類似。
  • 在右圖中,對於alpha = 0.0001,Lasso迴歸和線性迴歸的係數顯示出非常相似。

到目前為止,我們已經完成了Ridge和Lasso迴歸的基礎知識,並看到了一些瞭解應用程序的例子。現在,我將嘗試解釋為什麼Lasso迴歸可以導致特徵選擇,並且嶺迴歸僅將係數減小到接近零,但不是零。下面的說明圖將幫助我們更好地理解,我們將假設只有兩個特徵的假設數據集。使用Ridge和Lasso迴歸係數的約束(如補充1和2所示),我們可以繪製下圖

Ridge和Lasso迴歸:Python Scikit-Learn的完整指南

圖3:為什麼LASSO可以減少特徵空間的維數?2D特徵空間示例

對於二維特徵空間,對於具有青色和綠色的Lasso和Ridge迴歸繪製約束區域(參見補充1和2)。橢圓輪廓是線性迴歸的成本函數(方程1.2)。現在,如果我們對係數有寬鬆的條件,那麼約束區域可以變大,最終它們將到達橢圓的中心。當Ridge和Lasso迴歸類似於線性迴歸結果時就是這種情況。否則,兩種方法都是通過找到橢圓輪廓接觸約束區域的第一個點來確定係數。與圓不同,鑽石形狀(Lasso)在軸上有角,每當橢圓區域到達這一點時,其中一個特徵就會完全消失!對於更高維度的特徵空間,使用Lasso迴歸可以在軸上有許多解決方案,因此我們只獲得所選擇的重要特徵。

最後,為讓我們總結一下到目前為止我們學到了什麼

  • Ridge和Ridge迴歸的成本函數及正則化項的重要性。
  • 通過一些使用簡單數據集的例子來理解線性迴歸作為Lasso和Ridge迴歸的極限情況。
  • 理解為什麼Lasso迴歸可以導致特徵選擇,而Ridge只能縮小接近零的係數。


分享到:


相關文章: