岭回归和 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 回归,您可以提高线性回归模型的性能,并对新数据做出更准确的预测。