机器学习实战: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

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
)

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])

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')

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')

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')

不难理解,当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()

3.2 剔除空值及可视化

# 删除空值
Dushanbe.dropna(axis=0, inplace=True)

# 如果存在空值,显示空值数量
Dushanbe.isnull().sum()
# 使用 plotly.express 导入模块
import plotly.express as px

# 绘制三维散点图
fig = px.scatter_3d(Dushanbe, x='number_of_rooms', y='area', z='price',
                    color='price')
fig.show()

3.3 整理数据

# 提取数据集的列名
columns = Dushanbe.columns

# 存储输入和输出变量
Inputs = Dushanbe[columns[0:-1]]  # 输入变量
outputs = Dushanbe[columns[-1]]  # 输出变量

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)

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()

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

 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

4.讨论

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

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

猜你喜欢

转载自blog.csdn.net/weixin_48093827/article/details/131785505