LASSO回歸是對回歸算法正則化的一個例子。正則化是一種方法,它通過增加額外參數(shù)來解決過擬合問題,從而減少模型的參數(shù)、限制復(fù)雜度。正則化線性回歸最常用的三種方法是嶺回歸、最小絕對值收斂和選擇算子(LASSO)以及彈性網(wǎng)絡(luò)回歸。
在本文中,我將重點(diǎn)介紹LASSO,并且對嶺回歸和彈性網(wǎng)絡(luò)回歸做簡單的擴(kuò)展。
假設(shè)我們想在一個數(shù)據(jù)集上建立一個正則化回歸模型,這個數(shù)據(jù)集包含n個觀察和m個特征。
LASSO回歸是一個L1懲罰模型,我們只需將L1范數(shù)添加到最小二乘的代價(jià)函數(shù)中:
看這里
通過增大超參數(shù)α的值,我們加強(qiáng)了模型的正則化強(qiáng)度,并降低了模型的權(quán)重。請注意,沒有把截距項(xiàng)w0正則化,還要注意α=0對應(yīng)于標(biāo)準(zhǔn)回歸。
通過調(diào)整正則化的強(qiáng)度,某些權(quán)重可以變?yōu)榱?,這使得LASSO方法成為一種非常強(qiáng)大的降維技巧。
我們將使用郵輪數(shù)據(jù)集cruise_ship_info.csv來演示LASSO技術(shù)
本案例已經(jīng)發(fā)布在實(shí)驗(yàn)平臺,請關(guān)注微信公眾號:老齊教室。并回復(fù): #姓名+手機(jī)號+案例# 獲取。 注意: # 必須要有 。
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
df = pd.read_csv('cruise_ship_info.csv')df.head()
從《數(shù)據(jù)準(zhǔn)備和特征工程》中的有關(guān)闡述可知,協(xié)方差矩陣圖可用于特征選擇和降維。從前述數(shù)據(jù)集中發(fā)現(xiàn),在6個預(yù)測特征( ['age’, 'tonnage’, 'passengers’, 'length’, 'cabins’, 'passenger_density’] )中,如果我們假設(shè)重要特征與目標(biāo)變量的相關(guān)系數(shù)為0.6或更大,那么目標(biāo)變量“crew”與4個預(yù)測變量“tonnage”, “passengers”, “l(fā)ength, and “cabins”的相關(guān)性很強(qiáng)。因此,我們能夠?qū)⑻卣骺臻g的維數(shù)從6減少到4。
cols_selected = ['Tonnage', 'passengers', 'length', 'cabins','crew']df[cols_selected].head()
X = df[cols_selected].iloc[:,0:4].values # features matrix y = df[cols_selected]['crew'].values # target variable
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.4, random_state=0)
from sklearn.preprocessing import StandardScalersc_y = StandardScaler()sc_x = StandardScaler()y_std = sc_y.fit_transform(y_train[:, np.newaxis]).flatten()X_train_std = sc_x.fit_transform(X_train)X_test_std = sc_x.transform(X_test)y_train_std = sc_y.fit_transform(y_train[:, np.newaxis]).flatten()
from sklearn.linear_model import Lassofrom sklearn.metrics import r2_scorealpha = np.linspace(0.01,0.4,10)r2_train =[]r2_test =[]norm = []alpha = np.linspace(0.01,0.4,10)for i in range(10): lasso = Lasso(alpha = alpha[i]) lasso.fit(X_train_std,y_train_std) y_train_std = lasso.predict(X_train_std) y_test_std = lasso.predict(X_test_std) r2_train = np.append(r2_train, r2_score(y_train,sc_y.inverse_transform(y_train_std))) r2_test = np.append(r2_test, r2_score(y_test,sc_y.inverse_transform(y_test_std))) norm = np.append(norm,np.linalg.norm(lasso.coef_))
plt.figure(figsize=(8,6))plt.scatter(alpha,r2_train,label='r2_train')plt.plot(alpha,r2_train)plt.scatter(alpha,r2_test,label='r2_test')plt.plot(alpha,r2_test)plt.scatter(alpha,norm,label = 'norm')plt.plot(alpha,norm)plt.ylim(-0.1,1)plt.xlim(0,.43)plt.xlabel('alpha', size = 14)plt.ylabel('R2_score',size = 14)plt.legend()plt.show()
我們觀察到,隨著正則化參數(shù)α的增加,回歸系數(shù)的范數(shù)變得越來越小。這意味著更多的回歸系數(shù)被強(qiáng)制為零,這會增加偏差(模型過度簡化)。α保持較低值時,比如α=0.1或更低時,是偏差和方差的最佳平衡點(diǎn)。在決定使用哪種降維方法之前,應(yīng)將該方法與主成分分析法(PCA)進(jìn)行比較。
聯(lián)系客服