嶺迴歸和 Lasso 迴歸詳解


引言

嶺迴歸和 Lasso 迴歸是線性迴歸模型中兩種常用的正則化方法。它們有助於解決過擬合問題,過擬合問題是指模型過於複雜,過度擬合訓練資料,導致在新的資料上效能下降。嶺迴歸透過向線性迴歸的成本函式引入懲罰項來減小系數的大小並防止過擬合。這個懲罰項正比於係數平方和。相反,Lasso 迴歸新增一個懲罰項,該懲罰項正比於係數絕對值之和。這促使一些係數精確地逼近 0,從而使模型的某些方面完全無關緊要。在這篇文章中,我們將更詳細地研究這兩種方法,討論它們的不同之處,並瞭解如何在 Python 中使用 scikit-learn 來應用它們。

嶺迴歸

嶺迴歸是一種正則化方法,用於解決線性迴歸模型中的過擬合問題。它透過向線性迴歸的成本函式新增懲罰項來減小系數的大小並防止過擬合。懲罰項控制模型中係數的大小,並正比於係數平方和。當懲罰項的值增加時,係數收縮到零,降低模型的方差。

嶺迴歸試圖最小化以下成本函式:

$$\mathrm{J(w) = (\frac{1}{2})\:*\:\sum(y\:-\:h(y))^2+\sum|w|^2}$$

其中 y 是實際值,h(y) 表示預測值,w 表示特徵係數。

當存在許多小到中等大小的係數並且所有特徵都很重要時,嶺迴歸效果最好。此外,它比其他正則化方法在計算上更有效。嶺迴歸的主要缺點是它不會消除任何特徵,這並不總是好事。是否使用嶺迴歸或其他正則化方法取決於具體情況和資料的特性。

程式

import numpy as np
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

n_samples, n_features = 100, 10
X = np.random.randn(n_samples, n_features)
w_true = np.random.randn(n_features)
y = X.dot(w_true) + 0.5*np.random.randn(n_samples)

train_size = int(n_samples * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

alpha = 0.1
ridge = Ridge(alpha=alpha)
ridge.fit(X_train, y_train)

y_pred = ridge.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean squared error: {mse:.2f}")

輸出

Mean squared error: 0.36

在這個例子中,我們使用 scikit-learn 的 train_test_split 函式將資料分成訓練集和測試集。之後,我們使用 StandardScaler 縮放資料,以確保每個特徵具有相似的範圍和分佈。

使用 Scikit-learn 的 Ridge 類建立一個嶺迴歸模型後,我們使用 alpha 引數調整正則化強度。alpha 值越大,正則化越強。

使用 fit 方法將模型擬合到訓練資料,並使用 predict 方法對測試資料進行預測。最後,我們使用均方誤差來評估模型的效能,該誤差計算預測值和實際值之間的平均平方差。

需要注意的是,在某些情況下,其他正則化方法如 Lasso 或 Elastic Net 可能更合適,嶺迴歸並不總是能提高線性迴歸模型的效能。此外,應使用交叉驗證來微調正則化強度 alpha 引數,以獲得在模型複雜性和泛化效能之間取得最佳平衡的值。

Lasso 迴歸

Lasso 迴歸,通常稱為 L1 正則化,是一種透過在成本函式中新增懲罰項來停止線性迴歸模型過擬合的方法。與嶺迴歸不同,它新增的是係數絕對值之和,而不是係數平方和。

Lasso 迴歸試圖最小化以下成本函式:

$$\mathrm{J(w) = (\frac{1}{2})\:*\:\sum(y\:-\:h(y))^2+\sum|w|}$$

其中 y 是實際值,h(y) 表示預測值,w 表示特徵係數。

Lasso 迴歸可以將某些係數縮減為零,有效地進行特徵選擇。這在高維資料集(其中許多特徵可能是不必要的或冗餘的)中非常有用。生成的模型更簡單易懂,並且透過減少過擬合,通常表現出改進的預測效能。

程式

import numpy as np
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error

# Generate some random data
n_samples, n_features = 100, 10
X = np.random.randn(n_samples, n_features)
w_true = np.random.randn(n_features)
y = X.dot(w_true) + 0.5*np.random.randn(n_samples)

# Split the data into training and testing sets
train_size = int(n_samples * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]

# Set the regularization strength
alpha = 0.1

# Create the Lasso regression object and fit the model
lasso = Lasso(alpha=alpha)
lasso.fit(X_train, y_train)

# Make predictions on the testing set
y_pred = lasso.predict(X_test)

# Calculate the mean squared error
mse = mean_squared_error(y_test, y_pred)

# Print the mean squared error
print(f"Mean squared error: {mse:.2f}")

輸出

Mean squared error: 0.43

在此程式碼中,我們首先生成一些隨機資料(100 個樣本和 10 個特徵)。然後,我們將資料分成 80/20 的訓練集和測試集。然後,我們將正則化強度設定為 0.1 並建立一個 Lasso 迴歸物件例項。然後,我們使用 fit() 函式將模型擬合到訓練資料。我們使用 predict() 方法對測試資料進行預測,並使用 scikit-learn 的 mean_squared_error() 函式計算預測值和實際值之間的均方誤差。最後,列印均方誤差。

值得注意的是,Lasso 迴歸模型透過將一些係數設定為零來進行特徵選擇。這意味著在存在許多特徵並且我們想要找到對預測目標變數最重要的特徵的情況下,它可能很有效。但是,如果我們認為所有特徵都與預測相關,那麼它可能不是最佳選擇。在這種情況下,嶺迴歸可能是更好的選擇。

嶺迴歸和 Lasso 迴歸的區別

嶺迴歸

Lasso 迴歸

將係數縮減到零

並鼓勵一些係數精確為零

新增一個正比於係數平方和的懲罰項

新增一個正比於係數絕對值之和的懲罰項

不消除任何特徵

可以消除一些特徵

適用於所有特徵都很重要的情況

適用於某些特徵不相關或冗餘的情況

計算效率更高

計算效率較低

需要設定超引數

需要設定超引數

當存在許多小到中等大小的係數時表現更好

當存在一些大的係數時表現更好

結論

嶺迴歸和 Lasso 迴歸是正則化線性迴歸模型和防止過擬合的強大技術。它們都向成本函式新增懲罰項,但方法不同。嶺迴歸將係數縮減到零,而 Lasso 迴歸鼓勵一些係數精確為零。這些技術可以使用 scikit-learn 在 Python 中輕鬆實現,使其能夠被廣泛使用。透過理解和實現嶺迴歸和 Lasso 迴歸,您可以提高線性迴歸模型的效能,並對新資料做出更準確的預測。

更新於:2023年4月13日

17K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.