用Python进行AI数据分析进阶教程42:
Python机器学习的线性回归的原理和假设
关键词:线性回归、最小二乘法、误差项、模型拟合、正则化
摘要:本文详细介绍了线性回归的基本原理、数学表达式、核心假设及实现方法。线性回归通过寻找最佳拟合直线或超平面来建立自变量与因变量之间的线性关系,通常使用最小二乘法求解最优系数。文章列出了线性回归的四大假设:线性关系、独立性、同方差性和误差项服从正态分布。此外,还讨论了特征选择、正则化(如岭回归和Lasso回归)以防止过拟合,以及异常值、多重共线性对模型的影响。示例代码展示了如何使用scikit-learn进行数据生成、模型训练、预测与可视化,并通过均方误差(MSE)和决定系数R²评估模型性能,帮助读者全面理解线性回归的应用过程。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
关键词:线性回归、最小二乘法、误差项、模型拟合、正则化
摘要:本文详细介绍了线性回归的基本原理、数学表达式、核心假设及实现方法。线性回归通过寻找最佳拟合直线或超平面来建立自变量与因变量之间的线性关系,通常使用最小二乘法求解最优系数。文章列出了线性回归的四大假设:线性关系、独立性、同方差性和误差项服从正态分布。此外,还讨论了特征选择、正则化(如岭回归和Lasso回归)以防止过拟合,以及异常值、多重共线性对模型的影响。示例代码展示了如何使用scikit-learn进行数据生成、模型训练、预测与可视化,并通过均方误差(MSE)和决定系数R²评估模型性能,帮助读者全面理解线性回归的应用过程
一、线性回归的原理
线性回归是一种用于建立自变量(特征)和因变量(目标)之间线性关系的机器学习算法。其基本思想是通过寻找一条最佳的直线(在二维空间中)或超平面(在多维空间中),使得所有数据点到该直线或超平面的距离之和最小。
1、一元线性回归
对于一个简单的一元线性回归问题,其模型可以表示为:y=β0+β1x+ϵ其中,y 是因变量,x 是自变量,β0 是截距,β1 是斜率,ϵ 是误差项,表示实际值与预测值之间的差异。
2、多元线性回归
对于多元线性回归问题,模型可以表示为:y=β0+β1x1+β2x2+⋯+βnxn+ϵ其中,x1,x2,⋯,xn 是多个自变量,β0,β1,⋯,βn 是对应的系数。
3、线性回归的目标
线性回归的目标是找到一组最优的系数 β0,β1,⋯,βn,使得预测值 y^ 与实际值 y 之间的误差最小。通常使用最小二乘法来求解最优系数,即最小化残差平方和(SSE):其中,m 是样本数量,yi 是第 i 个样本的实际值,y^i 是第 i 个样本的预测值。
二、线性回归假设
- 线性关系:自变量和因变量之间存在线性关系。即因变量的变化可以由自变量的线性组合来解释。
- 独立性:样本之间相互独立,即一个样本的取值不会影响其他样本的取值。
- 同方差性:误差项的方差在所有自变量取值上是恒定的。也就是说,无论自变量取何值,误差的波动程度是相同的。
- 正态性:误差项服从正态分布。这意味着误差的取值是随机的,且大部分误差集中在均值附近。
1、关键点
- 模型拟合
- 线性回归的核心是找到最优的系数,使得模型能够最好地拟合数据。可以使用最小二乘法、梯度下降法等方法来求解系数。
- 拟合程度可以通过决定系数 R2 来评估,R2 越接近 1,表示模型对数据的拟合效果越好。
- 特征选择
- 选择合适的特征对于线性回归模型的性能至关重要。过多的特征可能会导致过拟合,而过少的特征可能会导致欠拟合。
- 可以使用相关性分析、特征重要性排序等方法来选择重要的特征。
- 正则化
- 为了防止过拟合,可以使用正则化方法,如岭回归(Ridge Regression)和 lasso 回归(Lasso Regression)。
- 岭回归通过在损失函数中添加 L2 正则化项来约束系数的大小,而 lasso 回归则添加 L1 正则化项,并且可以实现特征选择。
2、注意点
- 异常值
异常值可能会对线性回归模型的拟合结果产生较大影响,因为最小二乘法对异常值比较敏感。在进行线性回归之前,需要对异常值进行处理,如删除异常值、转换数据等。
- 多重共线性
当自变量之间存在高度相关性时,会出现多重共线性问题。多重共线性会导致系数估计不稳定,并且难以解释每个自变量的影响。可以使用方差膨胀因子(VIF)来检测多重共线性,并通过去除相关特征、主成分分析等方法来解决。
- 数据预处理
线性回归对数据的尺度比较敏感,因此在进行模型训练之前,需要对数据进行标准化或归一化处理,以提高模型的稳定性和收敛速度。
3、示例代码
Python脚本
# 导入 numpy 库,用于进行数值计算和数组操作
import numpy as np
# 导入 matplotlib 库的 pyplot 模块,用于数据可视化
import matplotlib.pyplot as plt
# 从 sklearn 库的 linear_model 模块导入 LinearRegression 类,用于创建线性回归模型
from sklearn.linear_model import LinearRegression
# 从 sklearn 库的 model_selection 模块导入 train_test_split 函数,用于将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
# 从 sklearn 库的 metrics 模块导入 mean_squared_error 函数,用于计算均方误差
from sklearn.metrics import mean_squared_error
# 生成示例数据
# 设置随机种子为 42,保证每次运行代码时生成的随机数相同,使结果可复现
np.random.seed(42)
# 生成一个形状为 (100, 1) 的二维数组 X,数组元素是 0 到 2 之间的随机数
X = 2 * np.random.rand(100, 1)
# 根据线性关系 y = 4 + 3 * X 生成因变量 y,并添加一些符合标准正态分布的随机噪声
# 这里模拟了实际数据中存在的误差
y = 4 + 3 * X + np.random.randn(100, 1)
# 设置支持中文的字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 划分训练集和测试集
# 使用 train_test_split 函数将特征矩阵 X 和目标变量 y 划分为训练集和测试集
# test_size=0.2 表示将 20% 的数据作为测试集,80% 作为训练集
# random_state=42 保证每次划分的结果相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型
# 实例化一个 LinearRegression 对象,用于后续的模型训练和预测
model = LinearRegression()
# 训练模型
# 使用训练集的特征矩阵 X_train 和目标变量 y_train 对线性回归模型进行训练
# 模型会学习到 X 和 y 之间的线性关系,确定最佳的系数和截距
model.fit(X_train, y_train)
# 预测
# 使用训练好的线性回归模型对测试集的特征矩阵 X_test 进行预测
# 得到的 y_pred 是模型对测试集样本的预测结果
y_pred = model.predict(X_test)
# 计算均方误差
# 使用 mean_squared_error 函数计算测试集的实际值 y_test 和预测值 y_pred 之间的均方误差
# 均方误差衡量了模型预测值与实际值之间的平均误差程度,值越小表示模型性能越好
mse = mean_squared_error(y_test, y_pred)
# 打印均方误差
print(f"均方误差: {mse}")
# 打印模型系数和截距
# 线性回归模型的 coef_ 属性存储了自变量的系数
# 由于这里是一元线性回归,所以取 coef_[0][0] 得到唯一的系数值
print(f"系数: {model.coef_[0][0]}")
# 线性回归模型的 intercept_ 属性存储了截距值
print(f"截距: {model.intercept_[0]}")
# 可视化结果
# 使用 plt.scatter 函数绘制测试集的实际值散点图
# color='b' 表示散点的颜色为蓝色,label='实际值' 为图例标签
plt.scatter(X_test, y_test, color='b', label='实际值')
# 使用 plt.plot 函数绘制测试集的预测值折线图
# color='r' 表示折线的颜色为红色,linewidth=2 表示折线的宽度为 2,label='预测值' 为图例标签
plt.plot(X_test, y_pred, color='r', linewidth=2, label='预测值')
# 设置 x 轴的标签为 'X'
plt.xlabel('X')
# 设置 y 轴的标签为 'y'
plt.ylabel('y')
# 设置图表的标题为 '线性回归示例'
plt.title('线性回归示例')
# 显示图例,方便区分实际值和预测值
plt.legend()
# 显示绘制好的图表
plt.show()
输出 / 打印结果及注释
(1)均方误差、系数和截距输出
plaintext
均方误差: 1.13456789 # 示例值,实际值会因随机噪声而有所不同
系数: 2.956789 # 示例值,实际值会因数据和训练过程而有所不同
截距: 4.034567 # 示例值,实际值会因数据和训练过程而有所不同
- 均方误差:衡量了模型预测值与实际值之间的平均误差程度,值越小说明模型的预测效果越好。
- 系数:在一元线性回归中,该系数表示自变量 X 对因变量 y 的影响程度,即 X 每增加 1 个单位,y 平均增加的单位数。理论上这里接近 3,因为数据生成时的系数为 3,但由于随机噪声的存在,实际值会有一定偏差。
- 截距:表示当自变量 X 为 0 时,因变量 y 的预测值。理论上这里接近 4,因为数据生成时的截距为 4,但同样会受随机噪声影响。
(2)可视化结果
运行代码后会弹出一个窗口,显示一个散点图和一条折线图:
- 散点图:蓝色散点代表测试集的实际值,展示了真实数据的分布情况。
- 折线图:红色折线代表模型对测试集的预测值,展示了模型所学习到的线性关系。通过对比散点和折线,可以直观地看到模型的拟合效果。
(3)代码解释
- 数据生成:使用 np.random.rand 生成自变量 X,并根据线性关系 y=4+3X+ϵ 生成因变量 y,其中 ϵ 是服从正态分布的误差项。
- 数据集划分:使用 train_test_split 函数将数据集划分为训练集和测试集。
- 模型训练:创建 LinearRegression 模型,并使用训练集数据进行训练。
- 模型预测:使用训练好的模型对测试集数据进行预测。
- 模型评估:计算预测值和实际值之间的均方误差(MSE),评估模型的性能。
- 可视化:使用 matplotlib 库将实际值和预测值可视化,直观展示模型的拟合效果。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589