【机器学习实战】10分钟学会Python怎么用Ridge岭回归进行正则化(十三)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【机器学习实战】10分钟学会Python怎么用Ridge岭回归进行正则化(十三)

[toc]

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回归,或者结合两者的方法,可以更好地处理线性回归问题,并获得更准确和稳定的模型。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
19天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
59 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
21天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
41 2
|
23天前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
48 1
|
23天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
54 1
|
29天前
|
机器学习/深度学习 TensorFlow API
机器学习实战:TensorFlow在图像识别中的应用探索
【10月更文挑战第28天】随着深度学习技术的发展,图像识别取得了显著进步。TensorFlow作为Google开源的机器学习框架,凭借其强大的功能和灵活的API,在图像识别任务中广泛应用。本文通过实战案例,探讨TensorFlow在图像识别中的优势与挑战,展示如何使用TensorFlow构建和训练卷积神经网络(CNN),并评估模型的性能。尽管面临学习曲线和资源消耗等挑战,TensorFlow仍展现出广阔的应用前景。
55 5
|
29天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
38 3
|
12天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
18天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
18天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
18天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!