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

线性回归(Linear Regression)与 scikit-learn线性回归函数详解

一、线性回归的定义

线性回归 是一种用来确定两种或两种以上变量间相互依赖的定量关系的统计分析方法。
其核心思想是:通过寻找一个或多个自变量(或特征)与一个因变量(或目标)之间的线性关系,来对因变量进行预测。
这个线性关系用一个线性方程来表示:

  • 简单线性回归(只有一个自变量): y=β0+β1xy = \beta_0 + \beta_1xy=β0+β1x
  • 多元线性回归(有多个自变量): y=β0+β1x1+β2x2+...+βnxn=y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n=y=β0+β1x1+β2x2+...+βnxn=

其中:

  • y: 我们要预测的因变量(例如:房价)。
  • x,x1,x2,...,xnx, x_1, x_2, ..., x_nx,x1,x2,...,xn: 用于进行预测的自变量(例如:房屋面积、卧室数量、地段等)。
  • β0\beta_0β0截距偏置项。表示当所有自变量都为0时,因变量的预测值。
  • β1,β2,...,βn\beta_1, \beta_2, ..., \beta_nβ1,β2,...,βn权重系数。表示每个自变量对因变量影响的方向和大小。例如,β1\beta_1β1表示 x1x_1x1每增加一个单位,y会平均变化 β1\beta_1β1个单位。

在实际问题中,这个线性关系几乎不可能是完美的。因此,模型会引入一个误差项 ϵ\epsilonϵ 来捕捉所有未考虑出的因素和随机噪声。所以,完整的多元线性回归模型是:
y=β0+β1x1+β2x2+...+βnxn+ϵy = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n + \epsilony=β0+β1x1+β2x2+...+βnxn+ϵ

我们的目标就是找到一组最佳的参数(β0,β1,...,βn\beta_0, \beta_1, ..., \beta_nβ0,β1,...,βn),使得这个线性方程能最好地拟合我们已有的数据。

二、相关参数详解

在构建和评估线性回归模型时,我们主要关注以下几类参数:

1. 模型参数

这些是模型需要学习的内在参数,也就是我们要求解的对象。

  • 权重/系数: 如上所述,它们量化了每个特征的重要性。一个正系数意味着该特征与目标变量正相关,反之亦然。系数的绝对值越大,表示该特征的影响越大。
  • 截距: 模型的基准线。

2. 损失函数(主要是对于训练数据集)

为了找到最佳的参数,我们需要一个标准来衡量模型预测的好坏。这个标准就是损失函数(或成本函数)。在线性回归中,最常用的损失函数是均方误差

  • 均方误差: 计算所有数据点的预测值真实值 之差的平方的平均值。
    • 公式MSE=1m∑i=1m(yi−y^i)2MSE = \frac{1}{m}\sum_{i=1}^{m}(y_i - \hat{y}_i)^2MSE=m1i=1m(yiy^i)2
    • 其中,m是样本数量,yiy_iyi 是第 ( i ) 个样本的真实值,y^i\hat{y}_iy^i 是模型对第 ( i ) 个样本的预测值。
    • 为什么用平方? (1) 避免正负误差相互抵消;(2) 平方会放大较大误差的惩罚,使模型对异常值更敏感。

因此,线性回归求解参数的问题,就转化为了一个优化问题:找到一组参数 (β0,β1,...,βn)(\beta_0, \beta_1, ..., \beta_n)(β0,β1,...,βn),使得 MSE 损失函数的值最小。

3. 评价指标(主要是对于测试数据集)

损失函数用于模型训练,而评价指标用于模型训练好之后,评估其在未知数据(测试集)上的表现。常用指标有:

  • 均方误差: 与损失函数相同,值越小越好。
  • 均方根误差: $RMSE = \sqrt{MSE} $。它的单位与因变量 ( y ) 相同,解释性更强。
  • 平均绝对误差MAE=1m∑i=1m∣yi−y^i∣MAE = \frac{1}{m}\sum_{i=1}^{m}|y_i - \hat{y}_i|MAE=m1i=1myiy^i。对异常值不如MSE敏感。
  • R平方: 也称为决定系数。它表示模型能够解释的目标变量的方差比例。取值范围为 [0, 1],越接近1说明模型拟合得越好。R2=1−SS_residualSS_totalR^2 = 1 - \frac{SS\_{residual}}{SS\_{total}}R2=1SS_totalSS_residual

4.损失函数与评价指标的区别与联系

损失函数是给模型“看”的,用于在训练过程中指导参数优化;而评价指标是给人“看”的,用于在评估阶段衡量模型的最终性能。​

特征损失函数评价指标
目的指导模型训练。通过优化算法(如梯度下降,最小二乘法)最小化损失,从而更新模型参数。评估模型性能。在训练后或验证/测试集上,衡量模型预测效果的好坏,便于人与人、模型与模型之间的比较。
使用者优化算法(模型本身)人类(研究者、工程师、业务方)
阶段训练阶段的核心评估阶段(验证、测试)或监控阶段的核心
数学要求必须可微(大多数情况下),便于计算梯度。例如,MSE 的导数很好计算。不要求可微。更注重直观和可解释性。例如,分类准确率不可微,但是最常用的评价指标。
数值范围数值本身的大小没有绝对意义,我们只关心其下降趋势。不同数据集的损失值无法直接比较。数值通常有明确的业务或统计意义(如准确率 95%),可以在特定上下文中进行比较。
常见例子均方误差(MSE)、平均绝对误差(MAE)、Huber Loss、交叉熵(Cross-Entropy)均方误差(MSE)、平均绝对误差(MAE)、决定系数(R²)、调整后R²

关键点:​​ ​MSE 同时扮演了损失函数和评价指标的角色。这是一种常见情况,但并非总是如此。我们可以用MSE训练模型,但最终用R²和MAE来报告结果,因为这更容易让其他人理解。

三、参数求解方法详解

求解使MSE最小的参数,主要有两种方法:最小二乘法梯度下降法
最小二乘法
这个过程的目标是找到一组参数,使得线性回归模型的残差平方和(RSS)​最小。(​MSE = RSS / n​n是样本数量)

四、scikit-learn 线性回归函数详解

1、类概述

LinearRegression 是 scikit-learn 中用于实现普通最小二乘线性回归的类。

  • 本质: 它通过最小二乘法来拟合一个线性模型,以最小化数据集中观测到的目标值(y)与通过线性近似预测的目标值之间的残差平方和。
  • 模型形式: 拟合的模型与之前理论一致:y^(w,x)=w0+w1x1+...+wpxp\hat{y}(w, x) = w_0 + w_1 x_1 + ... + w_p x_py^(w,x)=w0+w1x1+...+wpxp
    • 其中,向量 w=(w1,...,wp)w = (w_1, ..., w_p)w=(w1,...,wp)coef_ 属性,而 w0w_0w0intercept_ 属性。

2、重要参数详解

from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True,  # 最重要的参数之一copy_X=True,n_jobs=None,positive=False
)
  1. fit_intercept : bool, default=True

    • 作用: 是否计算此模型的截距。
    • fit_intercept=True: 模型会计算并存储 intercept_。这是默认且最常用的设置。如果你的数据没有经过中心化处理,一定要设置为 True。
    • fit_intercept=False: 模型会强制截距为0。这适用于你确信数据本身就应该通过原点(0,0)的特殊情况。一般不推荐使用,除非你有明确的领域知识。
  2. copy_X : bool, default=True

    • 作用: 是否复制特征矩阵 X。
    • 如果为 True,将会被复制一份,原数据不会被修改。
    • 如果为 False,可能会在原数据上覆盖。为了安全起见,通常保持默认的 True。
  3. n_jobs : int, default=None

    • 作用: 设定用于计算的 CPU 核心数,用于并行化计算。
    • n_jobs=None(默认): 使用 1 个核心。
    • n_jobs=-1: 使用所有可用的 CPU 核心。
    • 当样本量或特征数非常大时,设置此参数可以加速计算。对于普通数据集,影响不大。
  4. positive : bool, default=False

    • 作用: 是否强制系数(coef_)为非负数。
    • 当设置为 True 时,所有学习到的系数都将是正数。这在一些特定场景下很有用,比如当你知道特征与目标变量之间在物理或业务上必须是正相关关系时。

3、模型训练后得到的重要属性

在调用 .fit() 方法训练模型之后,模型学到的参数就存储在以下属性中:

  1. coef_ : 一维数组类型

    • 含义: 线性回归模型的估计系数(即权重,w1...wpw_1 ... w_pw1...wp)。
    • 解释: 如果特征叫 x1, x2,那么 coef_[0] 对应 x1 的系数,coef_[1] 对应 x2 的系数。系数的大小和符号表示了特征对目标变量影响的方向和程度。
  2. intercept_ : float类型

    • 含义: 线性模型中的截距项(即 ( w_0 ))。
    • 解释: 当 fit_intercept=False 时,此值被强制为 0.0。
  3. rank_ : int类类型

    • 含义: 特征矩阵 X 的秩(矩阵中线性无关的行/列数)。可用于检测多重共线性。
  4. singular_ : array of shape (min(X, y),)

    • 含义: 特征矩阵 X 的奇异值。对于数值稳定性分析很有用。

4、四、核心方法

线性回归模型的主要方法遵循 scikit-learn 的标准“估计器”接口:

  1. fit(X, y, sample_weight=None)

    • 作用: 训练模型,根据训练数据 (X, y) 拟合线性模型。
    • X: 特征数据,形状为 二维数组或者Dataframe 的数组,训练集。
    • y: 目标值,形状为 一维数组或者Series,训练集对应的目标值。
    • sample_weight: 可选,每个样本的权重。用于在某些样本更重要时,给它们更大的权重。
  2. predict(X)

    • 作用: 使用拟合好的线性模型进行预测。
    • X: 输入样本,形状为 二维数组或者Dataframe 的数组,使用上述训练好(fit)的模型预测对应的目标值
    • 返回: 预测值,形状为 一维数组
  3. score(X, y, sample_weight=None)

    • 作用: 返回预测的决定系数 R²
    • R² 解释: R² 分数越高越好,最佳值为 1.0。它表示模型对目标变量方差的解释比例。基准模型(总是预测 y 的平均值)的 R² 为 0。如果模型更差,R² 可能为负。

    score方法在训练集 vs 测试集

    • 在训练集上计算出的 R²(如上例)通常偏高,因为它衡量的是模型对已知数据的拟合程度。
    • 模型的泛化能力应该通过在测试集(未参与训练的数据)​​ 上计算 R² 来评估。测试集上的 R² 才是衡量模型好坏更可靠的指标
from sklearn.model_selection import train_test_split# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 在训练集上训练
model.fit(X_train, y_train)# 分别在训练集和测试集上评分
train_score = model.score(X_train, y_train)
test_score = model.score(X_test, y_test)print(f"训练集 R²: {train_score:.4f}")
print(f"测试集 R²: {test_score:.4f}")

五、其他相关方法详解

1、r2_score(计算R平方的库函数)r2_score(y_test,y_pred)

r2_score,即 ​决定系数(R-squared)​,是用于评估回归模型性能的一个核心指标。通过计算预测值与实际=值之间的R平方来判断拟合程度,通常用于计算测试集的R平方

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score# 1. 生成示例数据
np.random.seed(42)
X = np.random.randn(100, 1) # 100个样本,1个特征
y = 2 * X.squeeze() + 1 + np.random.randn(100) * 0.5 # 线性关系加噪声# 2. 训练模型
model = LinearRegression()
model.fit(X, y)# 3. 使用模型的 score 方法
r_squared_sklearn = model.score(X, y)
print(f"模型自带的 R² score: {r_squared_sklearn:.4f}")# 4. 手动计算 R² 来验证
y_pred = model.predict(X) # 获取模型预测值
y_mean = np.mean(y) # 计算y的平均值SST = np.sum((y - y_mean) ** 2)
SSR = np.sum((y - y_pred) ** 2)
SSE = np.sum((y_pred - y_mean) ** 2)# 使用两种公式计算
r_squared_manual_1 = 1 - (SSR / SST)
r_squared_manual_2 = SSE / SSTprint(f"手动计算 R² (方法1: 1-SSR/SST): {r_squared_manual_1:.4f}")
print(f"手动计算 R² (方法2: SSE/SST): {r_squared_manual_2:.4f}")
print(f"SST = SSE + SSR 成立吗? {np.isclose(SST, SSE + SSR)}")# 5. 使用 sklearn.metrics 中的 r2_score 函数(与model.score结果一致)
r_squared_metric = r2_score(y, y_pred)
print(f"sklearn.metrics.r2_score 结果: {r_squared_metric:.4f}")

2、mean_squared_error (计算均方误差(MSE)的库函数)mean_squared_error(y_test,y_pred)

用于计算预测值与实际值之间均方误差,通常用于计算测试集的均方误差

import numpy as np
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt# 示例数据
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]# 计算MSE
mse = mean_squared_error(y_true, y_pred)
print(f"MSE: {mse:.4f}")# 手动验证计算过程
errors = np.array(y_true) - np.array(y_pred)
squared_errors = errors ** 2
mse_manual = np.mean(squared_errors)
print(f"手动计算的MSE: {mse_manual:.4f}")
http://www.dtcms.com/a/550050.html

相关文章:

  • 网站开发导向图网页编程html
  • c#+ visionpro汽车行业,机器视觉通用检测程序源码 产品尺寸检测,机械手引导定位等
  • OpenCV调用drawContours后轮廓消失
  • 处理大型excel文件的技术选型
  • [Comake][D1][AI_AO][bf_ssl_demo]
  • 网站建设方案报价一个用vue做的网站
  • 网上书城网站开发的目的与意阜宁城乡建设局网站
  • 数据结构——三十四、Floyd算法(王道408)
  • Linux服务器配置ssh免密登陆
  • JUC(二)-- 并发编程
  • 湖北省住房和城乡建设部网站大连网站建设收费
  • 石家庄网站建设今天改网名做淘宝客没网站
  • DoIP(Diagnostic over IP)路由激活与诊断请求
  • 协议选型框架
  • Double DQN(DDQN)详解与实现
  • 针对Java集合框架的面试题有哪些
  • HashMap 的哈希算法与冲突解决:深入 Rust 的高性能键值存储
  • 甘肃省建设厅官方网站质监局淮安网站优化
  • 网站开发设计电子书wordpress相关文章插件
  • 【Python OOP Diary 3】高级特性与设计模式练习题(七至十三)
  • 音响网站模板镇江网站制作优化
  • 01_Kotlin语言基础学习
  • 运维:部署Jenkins
  • 01_FastMCP 2.x 中文文档之FastMCP的介绍
  • @FeignClient调用超时
  • Ubuntu(②共享剪贴板)
  • 桂林北站有核酸检测点吗app开发的公司
  • apache启动失败Failed to start The Apache HTTP Server.
  • 汕头建设南京网站seo服务
  • 饰品网站模板建立网站的作用