当前位置:   article > 正文

机器学习实战之用 Scikit-Learn 正则化方法解决过拟合详解_sklearn正则化

sklearn正则化

f8e94cbab3c740c294d52f7baa6919f7.jpg


 

你是不是在模型训练中遇到过这样的问题:在训练集上表现得极好,但在测试集上效果不佳?这就是过拟合的问题。

过拟合是模型在训练过程中学到了数据的“噪声”而非规律,导致在未知数据上表现不佳。那么怎么解决这个问题呢?今天我们就来聊聊 Scikit-Learn 的正则化方法吧!

小提示: 如果你还没有接触过 Scikit-Learn,可以先了解一下这个强大的 Python 机器学习库。本文会带你领略它的神奇之处!


一、正则化:是什么?为什么?

1.1 正则化的定义

正则化(Regularization)是一种降低模型复杂度的方法,通过给损失函数(Loss Function)加上一个惩罚项(Penalty Term),使得模型在拟合数据的同时避免过度复杂。

1.2 为什么需要正则化?

想象一下,你正在参加一个猜谜游戏。你猜了一个谜题,获得了一点提示。然后你开始构思一个解决方案,但太过复杂,包含了许多不必要的细节。这时,你可能需要简化你的思路,才能找到真正的答案。就像这个游戏一样,当我们的模型过于复杂时,可能会导致过拟合。而正则化就是我们的“简化”大师!

二、Scikit-Learn 的正则化方法

Scikit-Learn 提供了多种正则化方法,如 L1 正则化、L2 正则化和 Elastic Net。在这里,我们会分别介绍这三种方法,并给出实际应用示例。

2.1 L1 正则化

L1 正则化通过在损失函数中添加 L1 范数来实现,公式如下:

Loss_with_L1 = Loss + λ * L1_Norm(Weights)

其中,L1_Norm 是权重的 L1 范数(权重的绝对值之和),λ 是正则化强度(一个超参数)。

L1 正则化的特点是能将一些权重参数压缩至0,从而实现特征选择(Feature Selection)。

示例:使用 Scikit-Learn 的 Lasso 回归实现 L1 正则化。

  1. from sklearn.linear_model import Lasso
  2. # 创建 Lasso 对象,设置正则化强度
  3. lasso = Lasso(alpha=0.1)
  4. # 训练模型
  5. lasso.fit(X_train, y_train)
  6. # 预测
  7. y_pred = lasso.predict(X_test)

2.2 L2 正则化

L2 正则化通过在损失函数中添加 L2 范数来实现,公式如下:

Loss_with_L2 = Loss + λ * L2_Norm(Weights)

其中,L2_Norm 是权重的 L2 范数(权重的平方和的平方根),λ 是正则化强度(一个超参数)。

L2 正则化的特点是能够减小权重的值,但不会将其压缩至0。

示例:使用 Scikit-Learn 的 Ridge 回归实现 L2 正则化。

  1. from sklearn.linear_model import Ridge
  2. # 创建 Ridge对象,设置正则化强度
  3. ridge = Ridge(alpha=0.1)
  4. # 训练模型
  5. ridge.fit(X_train, y_train)
  6. # 预测
  7. y_pred = ridge.predict(X_test)

2.3 Elastic Net

Elastic Net 是 L1 正则化和 L2 正则化的组合,可以通过调整两者的权重来平衡特征选择与权重减小。公式如下:

Loss_with_ElasticNet = Loss + λ1 * L1_Norm(Weights) + λ2 * L2_Norm(Weights)

其中,λ1 和 λ2 分别是 L1 正则化和 L2 正则化的强度。

示例:使用 Scikit-Learn 的 ElasticNet 回归实现 Elastic Net。

  1. from sklearn.linear_model import ElasticNet
  2. # 创建 ElasticNet 对象,设置正则化强度
  3. elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
  4. # 训练模型
  5. elastic_net.fit(X_train, y_train)
  6. # 预测
  7. y_pred = elastic_net.predict(X_test)

三、实战:用 Scikit-Learn 正则化方法解决过拟合

接下来,让我们通过一个实际例子来看看如何使用 Scikit-Learn 的正则化方法解决过拟合问题

假设我们要预测一辆汽车的价格,给定了一些特征,如车龄、行驶里程、燃油类型等。我们将使用一个包含这些特征的数据集来训练一个回归模型。

3.1 数据准备

首先,我们需要加载数据并分割成训练集和测试集

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. # 加载数据
  4. data = pd.read_csv("car_data.csv")
  5. # 分割特征和目标变量
  6. = data.drop("price", axis=1)
  7. = data["price"]
  8. # 分割训练集和测试集
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2random_state=42)

3.2 使用正则化方法训练模型

接下来,我们将分别使用 Lasso、Ridge 和 ElasticNet 三种正则化方法训练模型,并比较它们的性能。

  1. from sklearn.metrics import mean_squared_error
  2. # Lasso
  3. lasso = Lasso(alpha=0.1)
  4. lasso.fit(X_train, y_train)
  5. y_pred_lasso = lasso.predict(X_test)
  6. mse_lasso = mean_squared_error(y_test, y_pred_lasso)
  7. # Ridge
  8. ridge = Ridge(alpha=0.1)
  9. ridge.fit(X_train, y_train)
  10. y_pred_ridge = ridge.predict(X_test)
  11. mse_ridge = mean_squared_error(y_test, y_pred_ridge)
  12. # ElasticNet
  13. elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
  14. elastic_net.fit(X_train, y_train)
  15. y_pred_elastic_net = elastic_net.predict(X_test)
  16. mse_elastic_net = mean_squared_error(y_test, y_pred_elastic_net)
  17. print("MSE of Lasso: ", mse_lasso)
  18. print("MSE of Ridge: ", mse_ridge)
  19. print("MSE of ElasticNet: ", mse_elastic_net)

3.3 结果分析

通过对比三种正则化方法的均方误差(MSE),我们可以了解到哪种方法在解决过拟合问题上表现得更好。例如,如果 ElasticNet 的 MSE 最低,说明它在平衡特征选择和权重减小方面做得更好。

四、技术总结

通过本文,我们了解了正则化的概念、原因以及 Scikit-Learn 提供的三种正则化方法。实际案例也展示了如何使用这些方法来解决过拟合问题。

但正则化并非万能,有时还需要结合其他方法,如交叉验证(Cross-Validation)或早停(Early Stopping)等…

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/688172
推荐阅读
  

闽ICP备14008679号