Press "Enter" to skip to content

从过拟合到卓越:利用正则化的力量

正则化的作用:在机器学习中平衡复杂性和泛化能力

来源:Pixabay上的Andrew Martin的图像

在机器学习中,我们的目标是找到在没有进行训练的数据上进行最佳预测的机器学习模型。

为了实现这一目标,我们首先使用训练数据训练机器学习模型,并观察其在预测方面的性能。然后,我们比较模型在训练集和测试集(即包含新数据的集合)上的预测性能,以确定哪个机器学习模型是解决我们所面临问题的最佳选择。

本文将描述机器学习中的正则化作为一种避免过拟合的方法。

机器学习中的过拟合问题

过拟合是一种在机器学习中出现的问题,是由于模型对其训练的特定数据“过于专门化和专注”,导致其泛化能力较差。

让我们通过一张图片来描述机器学习中的三种拟合条件:过拟合、欠拟合和良好拟合。

机器学习中数据拟合的三种条件。来源:作者提供的图像。

因此,过拟合就像学生记住了特定问题的答案一样:很可能他们在考试中失败,因为他们并没有理解这门学科,只是记住了如何回答某些问题。

从性能的角度来看,一般情况下,当我们选择的评估机器学习模型的指标在训练集和测试集上都非常高(接近100%)时,我们可以认为该模型存在过拟合问题。

因此,过拟合(以及欠拟合)是我们作为数据科学家必须避免的问题。

通过正则化可以避免过拟合。让我们来看看如何实现。

通过正则化解决过拟合问题

在模型训练过程中,正则化向损失函数中添加了一个惩罚项,这样可以“抑制”模型过于复杂。

正则化的想法是通过限制模型对训练数据的过度拟合,也能减少其对数据中的噪声或随机变化的拟合能力,从而避免过拟合。

因此,假设我们有一个定义如下的代价函数:

我们的代价函数。来源:作者提供的图像。

其中:

  • `Theta`是一个估计器。
  • `x`和`y`分别是模型的特征和标签。

如果我们将正则化参数定义为`lambda`,正则化函数定义为`omega`,则正则化的目标函数为:

正则化的目标函数。来源:作者提供的图像。

因此,现在要研究的函数是代价函数加上正则化函数的总和。

正则化函数和正则化参数可以根据我们想要使用的正则化类型而有所不同。

在下一段中,我们将描述机器学习中使用最多的两种正则化函数:Lasso正则化和Ridge正则化。

描述Lasso和Ridge正则化

Lasso正则化模型

Lasso(最小绝对值和选择操作)正则化执行L1正则化,即添加一个等于系数幅值绝对值的惩罚。这种正则化方法通过添加一个正则化项将权重拉近到原点:

Lasso模型的正则化项。来源:作者提供的图片。

我们可以像这样为MSE(或任何其他成本函数)添加L1正则化惩罚:

带有Lasso正则化项的均方误差(MSE)度量。来源:作者提供的图片。

其中:

  • `n`是我们研究的数据点/数据的总数
  • `yi`是实际值
  • “hat yi”是我们模型预测的值

Lasso正则化的几何解释

Lasso正则化在内部执行我们所谓的特征选择。让我们给出Lasso正则化的几何解释以理解这个事实。为了简单起见,我们将创建一个有两个权重w_1和w_2的二维图形:

Lasso正则化的几何解释。来源:作者提供的图片。

橙色同心椭圆是我们选择的成本函数(在我们的情况下是MSE)的几何表示,而浅蓝色菱形是惩罚函数(L1)的几何解释。

我们的目标是最小化损失函数;从上面的插图可以看出,椭圆可以刚好在菱形的一个角落处与其相切。在这些角落处,其中一个权重为0。下面的图像可能更好地可视化了切点,因为最小化发生在函数的切点上,而不是它们的交点上:

损失函数和惩罚函数之间的切点。来源:作者提供的图片。

现在,想象我们为所有权重w_i执行此过程;最终,我们将拥有我们所称的稀疏模型,这意味着模型的特征少于初始特征数量——因为Lasso正则化通过将最大的权重设为0来惩罚权重。这意味着我们的模型已经执行了特征选择,舍弃了一些特征(因为它们的权重被设置为0以简化初始模型)。

从数学上讲,记住我们必须计算函数的梯度来最小化它,我们应该计算以下内容:

带有梯度的Lasso正则化公式。来源:作者提供的图片。

在这种情况下,稀疏性指的是某些参数的最优值为零。换句话说,这个方程可以有一个数值解:某些特征可以被设置为0,这就是特征选择。

岭回归模型。

岭模型执行L2正则化,即添加一个等于系数幅值的平方的惩罚。这种正则化策略通过添加一个正则化项将权重w_i拉近到原点。

Ridge模型的正则化项。来源:作者提供的图片。

我们可以添加L2正则化惩罚项(例如,对MSE或其他成本函数)的方式如下:

带有Ridge正则化项的均方误差(MSE)度量。来源:作者提供的图片。

Ridge正则化的几何解释

我们可以给出Ridge正则化的图形解释,以理解这个事实。为了简单起见,我们将创建一个带有两个权重w_1和w_2的二维图形:

Ridge正则化的几何解释。来源:作者提供的图片。

与Lasso正则化相比,Ridge不执行特征选择。Ridge通过减少模型的复杂性,而不减少独立变量的数量,因为它永远不会将系数值缩减为0。让我们通过以下图片来可视化:

损失函数和惩罚函数之间的相切性。来源:作者提供的图片。

如果我们看上面的图片,我们可以看到椭圆可以在圆(L2惩罚的几何解释)的任意位置相切,这意味着模型会对大权重进行惩罚,而不会将它们缩减为0。这意味着最终的模型将包括所有独立变量。

此外,在这种情况下,我们要记住,我们必须计算函数的梯度来将其最小化,我们应该计算以下内容:

带有梯度的Ridge正则化的公式。来源:作者提供的图片。

与Lasso正则化的不同之处在于,上述方程不一定总是有数值解,这就是为什么它不执行特征选择的原因。

在Python中实现Ridge和Lasso正则化模型

所以,让我们看看如何实现这两种正则化方法。

我们从Lasso正则化开始:

import numpy as np
from sklearn.datasets import make_regression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.linear_model import Lasso
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression

#忽略警告
import warnings
warnings.filterwarnings('ignore')

# 创建数据集
X, y = make_regression(n_samples=100, n_features=5, noise=10, random_state=42)

# 特征缩放
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 对训练数据拟合6次多项式
poly = PolynomialFeatures(degree=6)
X_train_poly = poly.fit_transform(X_train)

# 对训练数据拟合6次多项式
poly_reg = LinearRegression()
poly_reg.fit(X_train_poly, y_train)

# 在训练集和测试集上评估多项式
X_test_poly = poly.transform(X_test)
y_pred_train = poly_reg.predict(X_train_poly)
y_pred_test = poly_reg.predict(X_test_poly)
r2_score_poly_train = r2_score(y_train, y_pred_train)
r2_score_poly_test = r2_score(y_test, y_pred_test)
print(f'训练集上6次多项式的R-squared: {r2_score_poly_train: .3f}')
print(f'测试集上6次多项式的R-squared: {r2_score_poly_test: .3f}')

# 对训练数据拟合正则化的6次多项式
lasso_reg = make_pipeline(PolynomialFeatures(degree=6), Lasso(alpha=1))
lasso_reg.fit(X_train, y_train)

# 在测试集上评估正则化的多项式
y_pred_lasso = lasso_reg.predict(X_test)
r2_score_lasso = r2_score(y_test, y_pred_lasso)
print(f'测试集上正则化的6次多项式的R-squared: {r2_score_lasso: .3f}')

然后我们得到:

训练集上6阶多项式的R²:1.000测试集上6阶多项式的R²:-84.110测试集上正则化的6阶多项式的R²:0.827

所以,我们可以看到,“标准”的6阶多项式过拟合,因为它在训练集上的R²为1,在测试集上为负数。

相反,6阶正则化模型在测试集上有一个可接受的R²,这意味着它具有良好的泛化性能。因此,正则化改善了非正则化模型的性能。

现在,让我们使用岭回归模型进行类似的示例:

import numpy as npfrom sklearn.datasets import make_regressionfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import r2_scorefrom sklearn.linear_model import Ridgefrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.pipeline import make_pipelinefrom sklearn.linear_model import LinearRegression# 创建一个数据集X, y = make_regression(n_samples=100, n_features=3, noise=5, random_state=42)# 缩放特征scaler = StandardScaler()X = scaler.fit_transform(X)# 将数据分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 对训练数据拟合一个6阶多项式poly = PolynomialFeatures(degree=6)X_train_poly = poly.fit_transform(X_train)# 对训练数据拟合一个6阶多项式poly_reg = LinearRegression()poly_reg.fit(X_train_poly, y_train)# 在训练数据和测试数据上评估多项式X_test_poly = poly.transform(X_test)y_pred_train = poly_reg.predict(X_train_poly)y_pred_test = poly_reg.predict(X_test_poly)r2_score_poly_train = r2_score(y_train, y_pred_train)r2_score_poly_test = r2_score(y_test, y_pred_test)print(f'训练集上6阶多项式的R²:{r2_score_poly_train}')print(f'测试集上6阶多项式的R²:{r2_score_poly_test}')# 对训练数据拟合一个正则化的6阶多项式ridge_reg = make_pipeline(PolynomialFeatures(degree=6), Ridge(alpha=1))ridge_reg.fit(X_train, y_train)# 在测试数据上评估正则化的多项式y_pred_ridge = ridge_reg.predict(X_test)r2_score_ridge = r2_score(y_test, y_pred_ridge)print(f'测试集上正则化的6阶多项式的R²:{r2_score_ridge}')

然后我们得到:

训练集上6阶多项式的R²:1.0测试集上6阶多项式的R²:-1612.4842791834997测试集上正则化的6阶多项式的R²:0.9266258222037977

所以,即使在这种情况下,岭回归正则化也提高了非正则化多项式模型的性能。而且,它的性能甚至比套索模型更好。

结论

在本文中,我们解释了过拟合问题以及如何通过正则化来解决它。

但是何时使用一个正则化模型和另一个正则化模型。作为经验法则:

  1. 当特征高度相关时,我们最好使用岭回归正则化。因此,在决定从我们的问题研究中删除哪些特征之前,研究相关矩阵非常重要。
  2. 套索正则化有助于减少数据集中的特征。套索正则化自动选择一组最重要的特征,同时将较不重要的特征的系数收缩为零。因此,套索正则化适用于以下情况:
  3. 对于高维度的数据集。
  4. 当有大量特征相关时。
  5. 对模型系数进行稀疏约束。
Leave a Reply

Your email address will not be published. Required fields are marked *