• 机器学习实战:Python基于Ridge岭回归进行正则化(十三)


    1.前言

    1.1 岭回归的介绍

    岭回归(Ridge Regression)是一种常用的线性回归方法,用于处理具有共线性(collinearity)问题的数据集。在普通最小二乘线性回归中,如果自变量之间存在高度相关性,会导致估计的回归系数不稳定,甚至无法准确估计。岭回归通过引入一个正则化项来解决这个问题。

    岭回归的关键思想是在最小二乘目标函数中添加一个L2正则化项,该项对回归系数进行惩罚。这个正则化项是通过对回归系数的平方和进行惩罚,乘以一个调节参数alpha。当alpha为0时,岭回归等效于普通最小二乘回归;而当alpha趋近于无穷大时,回归系数趋近于0。因此,岭回归通过控制alpha的取值,平衡了回归系数的拟合能力和稳定性。

    优点

    • 解决共线性问题:岭回归能够有效降低多重共线性对回归系数估计的影响。在存在高度相关的自变量的情况下,岭回归可以提供更稳定和可靠的回归系数估计。

    • 可控制的正则化参数:通过调节正则化参数alpha的取值,可以控制模型的拟合程度和回归系数的收缩程度。这使得岭回归具有灵活性,可以根据具体问题和数据来平衡模型的复杂性和拟合能力。

    • 适用于高维数据:当数据集中存在大量自变量或特征时,岭回归可以提供更稳定的回归系数估计。它通过控制回归系数的大小来减少对噪声和不相关特征的过度拟合,从而提高模型的泛化能力。

    缺点

    • 引入偏差:岭回归通过对回归系数进行惩罚,可能引入一定的偏差。正则化项的存在会导致回归系数的估计偏离普通最小二乘估计,可能造成一定的信息损失。

    • 需要设置正则化参数:岭回归的性能受到正则化参数alpha的影响。选择合适的alpha值需要一定的经验或调参过程。过大或过小的alpha值可能导致模型性能下降或过拟合的问题。

    • 不具备特征选择能力:与Lasso回归相比,岭回归不具备显式的特征选择能力。它对所有的自变量都进行了收缩,而不会将某些系数缩减到零。因此,在需要进行特征选择的情况下,Lasso回归可能更适合。

    一张图看懂LASSO回归和岭回归

    1.2 岭回归的应用

    1. 经济学和金融学:岭回归可用于建立资产定价模型、预测经济指标、研究金融市场的因素影响等。在金融领域,岭回归可以帮助识别并分析相关因素对金融市场和资产价格的影响。

    2. 医学和生物学:岭回归可应用于医学和生物学领域中的数据分析和预测任务。例如,在基因表达分析中,岭回归可以帮助识别与特定疾病或生物过程相关的基因,并预测基因表达与相关结果之间的关系。

    3. 社会科学:岭回归可用于社会科学领域中的数据分析和建模,如人口统计学、社会经济学、心理学等。它可以帮助研究人口特征、社会经济指标等与特定社会现象或行为之间的关联性。

    4. 工程和物理学:岭回归在工程和物理学领域中也有广泛应用。例如,在信号处理中,岭回归可用于信号恢复和噪声滤波任务。在材料科学中,岭回归可用于建立材料性能与各种特征参数之间的关系模型。

    5. 数据分析和预测:由于岭回归在处理多重共线性和高维数据方面的优势,它在数据分析和预测任务中被广泛使用。岭回归可以帮助建立准确和稳定的预测模型,适用于各种应用领域,如销售预测、市场分析、房地产估价等。

    2.自定义数据集实战演示

    2.1 导入函数

    from sklearn.datasets import make_regression
    from matplotlib import pyplot as plt
    import numpy as np
    from sklearn.linear_model import Ridge
    
    • 1
    • 2
    • 3
    • 4

    2.2 创建数据集

    A, b, coefficients = make_regression(
        n_samples=50,
        n_features=1,
        n_informative=1,
        n_targets=1,
        noise=5,
        coef=True,
        random_state=1
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3 alpha=0、1、10、100的分别情况

    当alpha等于0时,岭回归退化为最小二乘法(Ordinary Least Squares, OLS)回归。在岭回归中,正则化项的系数为0,不会对回归系数施加任何约束或惩罚。

    alpha = 0
    n, m = A.shape
    
    I = np.identity(m)
    w = np.dot(np.dot(np.linalg.inv(np.dot(A.T, A) + alpha * I), A.T), b)
    plt.scatter(A, b)
    plt.plot(A, w*A, c='red')
    
    ## w = array([89.22901347])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    alpha=1时:

    rr = Ridge(alpha=1)
    rr.fit(A, b)
    w = rr.coef_
    print(w)
    ## Output w = array([87.39928165])
    
    plt.scatter(A, b)
    plt.plot(A, w*A, c='red')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    alpha=10时:

    rr = Ridge(alpha=10)
    rr.fit(A, b)
    w = rr.coef_
    print(w)
    ## Output w = array([73.60064637])
    
    plt.scatter(A, b)
    plt.plot(A, w*A, c='red')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    alpha=100时:

    rr = Ridge(alpha=100)
    rr.fit(A, b)
    w = rr.coef_
    print(w)
    ## Output w = array([28.54061056])
    
    plt.scatter(A, b)
    plt.plot(A, w*A, c='red')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    不难理解,当alpha值较大时,正则化项对回归系数的惩罚力度增加,使得回归系数更接近于零。回归线的斜率接近于零意味着预测函数对输入特征的影响减小,因此回归线可以看作是在整个数据集上取平均值为零的平面。这样可以有效地最小化不同数据集之间的方差。

    通过增加alpha值,岭回归模型会更强调对训练数据整体的拟合,并减小对特定样本或异常值的过度拟合。这样可以提高模型的泛化能力,使其对新数据的预测更稳定,并减少模型在不同数据集上的变化。

    3.Dushanbe_house数据集实战演示

    3.1 导入函数和数据

    import io
    import urllib3
    import pandas as pd
    
    
    http = urllib3.PoolManager()
    r = http.request('GET', 'https://hands-on.cloud/wp-content/uploads/2022/04/Dushanbe_house.csv')
    Dushanbe = pd.read_csv(io.StringIO(r.data.decode('utf-8')))
    
    # 查看数据示例
    Dushanbe.head()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.2 剔除空值及可视化

    # 删除空值
    Dushanbe.dropna(axis=0, inplace=True)
    
    # 如果存在空值,显示空值数量
    Dushanbe.isnull().sum()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    # 使用 plotly.express 导入模块
    import plotly.express as px
    
    # 绘制三维散点图
    fig = px.scatter_3d(Dushanbe, x='number_of_rooms', y='area', z='price',
                        color='price')
    fig.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.3 整理数据

    # 提取数据集的列名
    columns = Dushanbe.columns
    
    # 存储输入和输出变量
    Inputs = Dushanbe[columns[0:-1]]  # 输入变量
    outputs = Dushanbe[columns[-1]]  # 输出变量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.4 训练和测试数据集

    from sklearn.model_selection import train_test_split
    
    # 导入模块
    from sklearn.model_selection import train_test_split
    
    # 拆分训练数据和测试数据
    X_train, X_test, y_train, y_test = train_test_split(Inputs, outputs, test_size=0.3, random_state=42)
    
    # 导入 Ridge 模型
    from sklearn.linear_model import Ridge
    # 设置 alpha 参数为 0.9 并初始化 Ridge 回归模型
    model = Ridge(alpha=0.9)
    # 使用训练数据拟合 Ridge 回归模型
    model.fit(X_train, y_train)
    
    # 预测
    y_pred = model.predict(X_test)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.5 评估数据集

    from sklearn.metrics import r2_score
    print('R-square score is:', r2_score(y_test, y_pred))
    ## R-square score is : 0.3787461308826928
    
    import matplotlib.pyplot as plt
    # 设置图形大小
    plt.figure(figsize=(15, 8))
    # 绘制实际值和预测值的图形
    plt.plot([i for i in range(len(y_test))], y_test, label="实际值")
    plt.plot([i for i in range(len(y_test))], y_pred, label="预测值")
    # 添加图例
    plt.legend()
    # 显示绘图结果
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    此外还可以用多个矩阵评估指标评估模型性能:

     from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
    # 计算均方误差(MSE)
    mse = mean_squared_error(y_test, y_pred)
    # 计算均方根误差(RMSE)
    rmse = mean_squared_error(y_test, y_pred, squared=False)
    # 计算决定系数(R^2)
    r2 = r2_score(y_test, y_pred)
    # 计算平均绝对误差(MAE)
    mae = mean_absolute_error(y_test, y_pred)
    
    # 打印评估结果
    print("Mean Squared Error (MSE):", mse)
    print("Root Mean Squared Error (RMSE):", rmse)
    print("R-squared (R^2):", r2)
    print("Mean Absolute Error (MAE):", mae)
    
    ## 结果
    # Mean Squared Error (MSE): 138264386141.42395
    # Root Mean Squared Error (RMSE): 371839.1939285367
    # R-squared (R^2): 0.3787461308826928
    # Mean Absolute Error (MAE): 143605.94681857855
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    4.讨论

    岭回归是一种基于正则化的线性回归技术,通过引入L2范数惩罚项来平衡模型的拟合能力和复杂度。它在处理多重共线性和高维数据时具有显著优势,可以提高模型的稳定性和泛化能力。岭回归通过约束系数的大小,减小了变量间的相关性对模型预测的影响,避免了过拟合的问题。通过调节正则化参数alpha,可以控制岭回归模型的收缩程度,从而平衡模型的偏差和方差。

    岭回归和Lasso回归在某种程度上是互补的,它们各自在特征选择和系数缩小方面有不同的优势。因此,根据具体问题的特点和数据集的情况,选择使用岭回归或Lasso回归,或者结合两者的方法,可以更好地处理线性回归问题,并获得更准确和稳定的模型。

  • 相关阅读:
    python 安装环境 初版
    【活动通知】2023 Elastic Meetup 北京站将于12月2日下午1点30在北京召开
    git分布式管理-头歌实验合并远程分支、rebase、储藏
    【24种设计模式】责任链模式(Chain of Responsibility Pattern)
    PASCAL VOC数据集格式文件夹下文件配置
    使用 vscode 插件可视化制作和管理脚手架及原理解析
    介绍一个开源IOT组态项目
    Day 46 | 139.单词拆分 & 多重背包理论基础 & 背包问题总结
    屏幕亮度调节保护您的眼睛
    0822学习笔记(Linux)
  • 原文地址:https://blog.csdn.net/weixin_48093827/article/details/131785505