当前位置: 首页 > article >正文

机器学习系列----岭回归(Ridge Regression)简介及实现

目录

一.什么是岭回归?

二.岭回归的数学原理

三.实现岭回归

 四.岭回归的实际应用

项目一

项目二


一.什么是岭回归?

岭回归(Ridge Regression),也被称为Tikhonov正则化,是一种线性回归的变体。它通过在普通最小二乘法(OLS)回归中加入L2正则化项来解决多重共线性问题,从而提高模型的泛化能力和鲁棒性。岭回归的核心思想是通过惩罚模型的参数,使得它们保持较小的值,从而减少过拟合的风险。

岭回归适用于当特征之间高度相关时(即多重共线性问题),普通的线性回归模型可能会变得不稳定,并且模型的系数可能会变得非常大。岭回归通过加上一个正则化项,约束了模型参数的大小,从而使得模型更加稳健。

二.岭回归的数学原理

 

三.实现岭回归


下面我们通过Python代码实现岭回归,使用sklearn中的Ridge类来进行模型训练。

数据准备
我们首先使用sklearn.datasets中的make_regression生成一个简单的回归问题数据集。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# 生成回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 可视化数据
plt.scatter(X, y, color='blue')
plt.title("Generated Data for Regression")
plt.xlabel("Feature")
plt.ylabel("Target")
plt.show()

岭回归模型训练与预测
接下来,我们使用Ridge类来训练岭回归模型,并对测试集进行预测。

from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

# 初始化岭回归模型,设置正则化参数alpha(对应于λ)
ridge_reg = Ridge(alpha=1.0)

# 训练模型
ridge_reg.fit(X_train, y_train)

# 对测试集进行预测
y_pred = ridge_reg.predict(X_test)

# 输出回归系数和截距
print(f"回归系数: {ridge_reg.coef_}")
print(f"截距: {ridge_reg.intercept_}")

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse}")

# 可视化结果
plt.scatter(X_test, y_test, color='blue', label='True values')
plt.plot(X_test, y_pred, color='red', label='Predicted values')
plt.title("Ridge Regression Results")
plt.xlabel("Feature")
plt.ylabel("Target")
plt.legend()
plt.show()

 调整正则化参数 (\lambda)
我们可以尝试不同的(\lambda)值,观察正则化强度对回归结果的影响。

# 不同lambda值下的岭回归
alphas = [0.1, 1.0, 10.0]
plt.figure(figsize=(10, 6))

for alpha in alphas:
    ridge_reg = Ridge(alpha=alpha)
    ridge_reg.fit(X_train, y_train)
    y_pred = ridge_reg.predict(X_test)
    
    plt.plot(X_test, y_pred, label=f'alpha={alpha}')

plt.scatter(X_test, y_test, color='blue', label='True values')
plt.title("Effect of Different Lambda (Alpha) on Ridge Regression")
plt.xlabel("Feature")
plt.ylabel("Target")
plt.legend()
plt.show()

 四.岭回归的实际应用

项目一

项目背景
我们将使用波士顿房价数据集来进行岭回归的分析。波士顿房价数据集包含了13个特征,用来预测波士顿地区房价中位数。

步骤:
加载数据:使用sklearn加载波士顿房价数据集。
数据预处理:包括数据标准化和数据拆分。
岭回归建模:训练岭回归模型并调优超参数。
模型评估:计算并可视化模型的性能。
超参数选择:使用交叉验证来选择最佳的正则化参数。
代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import cross_val_score

# 1. 加载波士顿房价数据集
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)
y = boston.target

# 查看数据集的一些基本信息
print("数据集特征:", boston.feature_names)
print("数据集大小:", X.shape)
print("前5行数据:\n", X.head())

# 2. 数据预处理
# 标准化特征数据,岭回归对特征的尺度敏感
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 将数据集拆分为训练集和测试集,80%训练集,20%测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 3. 岭回归建模
ridge_reg = Ridge()

# 使用网格搜索交叉验证来寻找最佳的正则化参数 alpha
param_grid = {'alpha': np.logspace(-6, 6, 13)}  # alpha的范围从1e-6到1e6
grid_search = GridSearchCV(ridge_reg, param_grid, cv=10, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳的超参数值
print(f"最佳正则化参数 (alpha): {grid_search.best_params_['alpha']}")
print(f"最佳交叉验证得分: {-grid_search.best_score_:.4f}")

# 使用找到的最佳参数训练模型
best_ridge = grid_search.best_estimator_

# 4. 评估模型
# 预测测试集
y_pred = best_ridge.predict(X_test)

# 计算均方误差和R^2
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"测试集上的均方误差: {mse:.4f}")
print(f"测试集上的R^2得分: {r2:.4f}")

# 5. 可视化模型预测与实际值的比较
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue', edgecolor='black')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('Ridge Regression: Predicted vs Actual')
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.grid(True)
plt.show()

# 6. 模型系数的可视化
plt.figure(figsize=(10, 6))
plt.bar(X.columns, best_ridge.coef_)
plt.title('Ridge Regression: Feature Coefficients')
plt.xlabel('Features')
plt.ylabel('Coefficients')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

# 7. 交叉验证评估模型
cv_scores = cross_val_score(best_ridge, X_scaled, y, cv=10, scoring='neg_mean_squared_error')
print(f"交叉验证的平均MSE: {-cv_scores.mean():.4f}")

# 8. 训练集与测试集的学习曲线
train_errors, test_errors = [], []
alpha_values = np.logspace(-6, 6, 13)

for alpha in alpha_values:
    ridge_reg = Ridge(alpha=alpha)
    ridge_reg.fit(X_train, y_train)
    train_errors.append(mean_squared_error(y_train, ridge_reg.predict(X_train)))
    test_errors.append(mean_squared_error(y_test, ridge_reg.predict(X_test)))

# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(alpha_values, train_errors, label='Train Error', color='blue', marker='o')
plt.plot(alpha_values, test_errors, label='Test Error', color='red', marker='o')
plt.xscale('log')
plt.title('Learning Curve: Train vs Test Error for Different Alpha')
plt.xlabel('Alpha (Regularization Parameter)')
plt.ylabel('Mean Squared Error')
plt.legend()
plt.grid(True)
plt.show()

代码解释
1. 加载波士顿房价数据集
首先,我们使用sklearn.datasets.load_boston()加载波士顿房价数据集,并查看数据集的基本信息。该数据集包含506个样本和13个特征,目标变量是房价中位数。

2. 数据预处理
由于岭回归对特征的尺度非常敏感,所以我们首先对特征进行标准化处理。使用StandardScaler对数据进行标准化,使得每个特征的均值为0,标准差为1。然后,将数据拆分为训练集和测试集,其中80%用于训练,20%用于测试。

3. 岭回归建模与超参数调整
我们使用Ridge类来创建岭回归模型,并通过GridSearchCV对超参数(\alpha)(正则化参数)进行调优。我们使用交叉验证来选择最佳的(\alpha)值,参数范围从(1e-6)到(1e6)。通过GridSearchCV的best_params_方法,我们可以获得最佳的正则化参数。

4. 模型评估
在找到最佳的(\alpha)值后,我们训练最终模型,并计算在测试集上的均方误差(MSE)和R²得分。然后,我们绘制预测值与实际值的对比图,帮助可视化模型的性能。

5. 可视化模型系数
由于岭回归会对回归系数进行正则化,我们可以通过可视化回归系数来分析每个特征的影响力。通过条形图,我们能够看到哪些特征对预测有较大影响,哪些特征影响较小。

6. 交叉验证评估
我们使用交叉验证评估最终模型的性能。通过cross_val_score函数,计算在10折交叉验证下的均方误差(MSE)平均值,进一步评估模型的稳定性。

7. 学习曲线
最后,我们绘制了不同(\alpha)值下的训练误差和测试误差,帮助我们了解正则化强度对模型性能的影响。通过学习曲线,我们可以看到随着(\alpha)的增大,训练误差增加,测试误差呈现U型趋势,最佳的(\alpha)值会带来最优的泛化能力。

结果分析
超参数选择:通过网格搜索,找到最佳的正则化参数(\alpha)。
模型评估:通过均方误差和R²得分,评估岭回归模型的预测能力。
模型系数:通过特征系数的可视化,了解哪些特征对房价预测最重要。
交叉验证:验证模型在不同数据子集上的表现,确保模型的稳健性。
总结
通过以上步骤,我们利用岭回归对波士顿房价数据集进行了详细的分析。岭回归不仅能处理多重共线性问题,还能通过正则化提升模型的泛化能力。在实际应用中,可以通过交叉验证选择最优的正则化参数,并通过学习曲线进一步调整模型的复杂度。

项目二

 项目背景
我们将使用加利福尼亚房价数据集来进行Lasso回归的分析。加利福尼亚房价数据集包含了8个特征,目的是预测加利福尼亚地区的房价中位数。Lasso回归可以通过正则化机制,自动选择特征并且抑制一些不重要的特征,避免过拟合。

步骤:
加载数据:使用sklearn加载加利福尼亚房价数据集。
数据预处理:包括数据标准化和数据拆分。
Lasso回归建模:训练Lasso回归模型并调优超参数。
模型评估:计算并可视化模型的性能。
超参数选择:使用交叉验证来选择最佳的正则化参数。
代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import cross_val_score

# 1. 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target

# 查看数据集的一些基本信息
print("数据集特征:", california.feature_names)
print("数据集大小:", X.shape)
print("前5行数据:\n", X.head())

# 2. 数据预处理
# 标准化特征数据,Lasso回归对特征的尺度敏感
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 将数据集拆分为训练集和测试集,80%训练集,20%测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 3. Lasso回归建模
lasso_reg = Lasso()

# 使用网格搜索交叉验证来寻找最佳的正则化参数 alpha
param_grid = {'alpha': np.logspace(-6, 6, 13)}  # alpha的范围从1e-6到1e6
grid_search = GridSearchCV(lasso_reg, param_grid, cv=10, scoring='neg_mean_squared_error', n_jobs=-1)
grid_search.fit(X_train, y_train)

# 输出最佳的超参数值
print(f"最佳正则化参数 (alpha): {grid_search.best_params_['alpha']}")
print(f"最佳交叉验证得分: {-grid_search.best_score_:.4f}")

# 使用找到的最佳参数训练模型
best_lasso = grid_search.best_estimator_

# 4. 评估模型
# 预测测试集
y_pred = best_lasso.predict(X_test)

# 计算均方误差和R^2
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"测试集上的均方误差: {mse:.4f}")
print(f"测试集上的R^2得分: {r2:.4f}")

# 5. 可视化模型预测与实际值的比较
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue', edgecolor='black')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('Lasso Regression: Predicted vs Actual')
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.grid(True)
plt.show()

# 6. 模型系数的可视化
plt.figure(figsize=(10, 6))
plt.bar(X.columns, best_lasso.coef_)
plt.title('Lasso Regression: Feature Coefficients')
plt.xlabel('Features')
plt.ylabel('Coefficients')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()

# 7. 交叉验证评估模型
cv_scores = cross_val_score(best_lasso, X_scaled, y, cv=10, scoring='neg_mean_squared_error')
print(f"交叉验证的平均MSE: {-cv_scores.mean():.4f}")

# 8. 训练集与测试集的学习曲线
train_errors, test_errors = [], []
alpha_values = np.logspace(-6, 6, 13)

for alpha in alpha_values:
    lasso_reg = Lasso(alpha=alpha)
    lasso_reg.fit(X_train, y_train)
    train_errors.append(mean_squared_error(y_train, lasso_reg.predict(X_train)))
    test_errors.append(mean_squared_error(y_test, lasso_reg.predict(X_test)))

# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(alpha_values, train_errors, label='Train Error', color='blue', marker='o')
plt.plot(alpha_values, test_errors, label='Test Error', color='red', marker='o')
plt.xscale('log')
plt.title('Learning Curve: Train vs Test Error for Different Alpha')
plt.xlabel('Alpha (Regularization Parameter)')
plt.ylabel('Mean Squared Error')
plt.legend()
plt.grid(True)
plt.show()

代码解释
1. 加载加利福尼亚房价数据集
使用sklearn.datasets.fetch_california_housing()加载加利福尼亚房价数据集。该数据集包含了8个特征,目标变量是每个区域的房价中位数。

2. 数据预处理
和岭回归类似,Lasso回归对特征的尺度也非常敏感。因此我们对特征数据进行了标准化处理。使用StandardScaler将数据转化为均值为0,方差为1的标准化数据。然后,将数据集拆分为训练集和测试集,80%用于训练,20%用于测试。

3. Lasso回归建模与超参数调整
使用Lasso类来创建Lasso回归模型。Lasso回归中的正则化参数(\alpha)控制着正则化的强度。通过GridSearchCV对(\alpha)参数进行调优,使用10折交叉验证来选择最佳的(\alpha)值。参数范围从(1e-6)到(1e6)。

4. 模型评估
在选择了最佳的(\alpha)值后,我们训练模型并在测试集上进行预测,计算均方误差(MSE)和R²得分。R²得分越高,表示模型的拟合能力越强。

5. 可视化模型系数
Lasso回归有一个独特的性质:它会将一些特征的系数压缩为零,从而实现特征选择。在模型训练完成后,我们绘制了回归系数的条形图,可以看到哪些特征被Lasso回归认为不重要并被抑制。

6. 交叉验证评估
使用cross_val_score函数进行交叉验证,计算不同折数的均方误差(MSE),并取其平均值,帮助验证模型的稳健性。

7. 学习曲线
我们绘制了不同(\alpha)值下的训练误差和测试误差。通过观察学习曲线,我们可以了解正则化参数如何影响模型的表现。随着(\alpha)的增大,训练误差和测试误差的变化趋势可以帮助我们选择合适的正则化强度。

结果分析
超参数选择:通过网格搜索,找到最佳的正则化参数(\alpha),使得模型能够平衡过拟合和欠拟合。
模型评估:计算均方误差(MSE)和R²得分,评估Lasso回归在测试集上的表现。
模型系数:通过可视化回归系数,了解哪些特征对房价预测最重要,Lasso回归能够自动将不重要的特征的系数压缩为零,起到了特征选择的作用。
交叉验证:通过交叉验证来评估模型的稳定性,确保所选模型不会在不同数据集上表现不一致。
学习曲线:绘制学习曲线帮助分析正则化参数的选择,观察训练误差和测试误差的变化。
总结
Lasso回归通过引入L1正则化,不仅可以减少模型的复杂度,还能实现特征选择,尤其适用于高维数据集。在这个项目中,我们使用加利福尼亚房价数据集进行了Lasso回归分析,经过超参数调优后,获得了一个表现较好的模型。


http://www.kler.cn/a/387477.html

相关文章:

  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)
  • OpenEuler 下 Docker 安装、配置与测试实例
  • AI大模型开发架构设计(14)——基于LangChain大模型的案例架构实战
  • 3.2 软件需求:面对过程分析模型
  • 组件间通信(组件间传递数据)
  • 【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)
  • 【复平面】-复数相乘的几何性质
  • 从0开始深度学习(28)——序列模型
  • 在 CIFAR10 数据集上训练 Vision Transformer (ViT)
  • 解释一下Java中的异常处理机制
  • IDM扩展添加到Edge浏览器
  • 怎么给llama3.2-vision:90b模型进行量化剪枝蒸馏
  • 类加载的生命周期?
  • opencv实时弯道检测
  • 1.6K+ Star!Ichigo:一个开源的实时语音AI项目
  • 华为机试HJ29 字符串加解密
  • SDL打开YUV视频
  • AI和大模型技术在网络脆弱性扫描领域的最新进展与未来发展趋势
  • [C++ 核心编程]笔记 4.4.3 成员函数做友元
  • <<零基础C++第一期, C++入门基础>>
  • 打造完整 Transformer 编码器:逐步实现高效深度学习模块
  • 深度学习在大数据处理中的应用
  • 电子电气架构 --- 车载以太网架构安全性要求
  • Qt使用属性树(QtProPertyBrowser)时,引用报错#include “QtTreePropertyBrowser“解决方案
  • HDR视频技术之二:光电转换与 HDR 图像显示
  • python批量合并excel文件