我的编程空间,编程开发者的网络收藏夹
学习永远不晚

多元线性回归LinearRegression

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

多元线性回归LinearRegression

目录

1.1多元线性回归的基本原理

1.2 最小二乘法求解多元线性回归的参数

1.3 linear_model.LinearRegression

1.4 案例

1.5 多元线性回归的模型评估指标

1.5.1 MSE均方误差&MAE绝对均值误差

1.5.2 ​R^{2}


1.1多元线性回归的基本原理

        线性回归是机器学习中最简单的回归算法,多元线性回归指的就是一个样本有多个特征的线性回归问题。对于一个有n个特征的样本i而言,它的回归结果如下方程:

\hat{y}={w_{0}}+{w_{1}}{x_{i1}}+{w_{2}}{x_{i2}}+...+{w_{n}}{x_{in}}

在这个表达式中,w被统称为模型的参数,其中{w_{0}}^{}被称为截距(intercept),{w_{0}}^{}~{w_{n}}^{}被称为回归系数(regression coefficient),有时也用\theta表示。其中y是目标变量,{x_{i1}}^{}~{x_{in}}^{}是样本i上的不同特征。

         如果考虑有m个样本,y是包含了m个全部样本的回归结果列向量,我们可以使用矩阵来表示这个方程,其中w可以被看做是一个结构为(1,n)的列矩阵,X是一个结构为(m,n)的特征矩阵,则有:

\begin{bmatrix} \hat{​{y_{0}}^{}}\\ \hat{​{y_{1}}^{}}\\ \hat{​{y_{2}}^{}}\\ ...\\ \hat{​{y_{m}}^{}} \end{bmatrix}=\begin{bmatrix} 1 &1 &1 &... &1\\ {x_{11}} &{x_{12}} &{x_{13}} &...&{x_{1n}} \\ {x_{21}} &{x_{22}} &{x_{23}} &...&{x_{2n}} \\ & &... & & \\ {x_{m1}} &{x_{m2}} &{x_{m3}} &...&{x_{mn}} \\ \end{bmatrix}*\begin{bmatrix} {w_{0}} \\ {w_{1}} \\ {w_{2}} \\ ...\\ {w_{n}} \\ \end{bmatrix}

 \hat{y}=Xw

线性回归的任务,就是构造一个预测函数来映射输入的特征矩阵X和标签值y的线性关系,而构造预测模型的核心就是找出模型的参数向量w。在多元线性回归中,我们将损失函数定义为: \sum_{i-1}^{m}({y_{i}}-\hat{​{y_{i}}})^{2} \sum_{i=1}^{m}({y_{i}}-{X_{i}}w)^{2} 其中 {y_{i}}^{}是样本 i对应的真实标签, \hat{​{y_{i}}^{}}={X_{i}}^{}w是样本 i在一组参数 w下的预测标签。首先,这个损失函数代表了 y-\hat{​{y_{i}}^{}}的L2范式的平方结果,L2范式的本质就是欧氏距离,,即两个向量上的每个点对应相减后的平方和再开平方,而这里的损失函数只实现了向量上每个点对应相减后的平方和,并没有开方,因此损失函数就是L2范式,即欧氏距离的平方结果。在这个平方结果下, y\hat{y}分别是真实标签和预测值,也就是说,这个损失函数是在计算真实标签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,我们也固然希望预测结果和真实值差异越小越好,所以我们的求解目标就可以转化成: min\left | \left | y-Xw \right | \right |{_{2}}^{2} 其中右下角的2表示向量 y-Xw的L2范式,即损失函数所代表的的含义。在L2范式上开平方,就是损失函数,这个式子,也正是在sklearn当中,用在类Linear_model.LinearRegression背后的损失函数。这个式子通常被称作SSE(Sum of Squared Error,误差平方和)或者RSS(Residual Sum of  Squares,残差平方和)。

1.2 最小二乘法求解多元线性回归的参数

        为了求解让RSS最小化的参数向量w通过最小化真实值和预测值之间的RSS来求解参数的方法叫做最小二乘法。最终得到参数w最优解为w=(X^{T}X)^{-1}X^{T}y

1.3 linear_model.LinearRegression

 class sklearn.linear_model.LinearRegression (fifit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

参数含义
fit_intercept

布尔值,可不填,默认为True

是否计算截距,如果设置为False,则不会计算截距。

normalize

布尔值,可不填,默认为False

当fit_intercept设置为False时,将忽略此参数,如果为True,则特征矩阵X在进入回归之前将会被减去均值(中心化)并除以L2范式(缩放)。

如果要进行标准化,则需在fit数据之前使用preprocessing模块中的标准化专用类StandarScaler

copy_X

布尔值,可不填,默认为True

若为真,则将在X.copy()上进行操作,否则原本的特征矩阵X可能被线性回归影响并覆盖。

n_jobs

整数或None,可不填,默认为None

用于计算的作业数。只有在多标签的回归和数据量足够大的时候才生效。除非None在joblib.parallel_backend上下文中,否则None统一表示为1。如果输入-1,则表示使用全部的cpu来进行计算。

线性回归的类较为简单,仅有四个参数就可以完成一个完整的算法。并且看得出,这些参数中并没有一个是必填的,更没有对我们的模型有不可替代作用的参数。这说明,线性回归的性能,往往取决 于数据本身,而并非是我们的调参能力,线性回归也因此对数据有着很高的要求。幸运的是现实中大部分连续型变量之间,都存在着或多或少的线性联系。所以线性回归虽然简单,却很强大。sklearn 中的线性回归可以处理多标签问题,只需要在fifit 的时候输入多维度标签就可以了。

1.4 案例

from sklearn.linear_model import LinearRegression as LRfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.datasets import fetch_california_housing as fchimport pandas as pdhousevalue=fch()x=pd.DataFrame(housevalue.data)y=housevalue.targetx.columns=housevalue.feature_namesxtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3,random_state=420)# 恢复索引for i in [xtrain,xtest]:    i.index=range(i.shape[0])# 建模reg=LR().fit(xtrain,ytrain)yhat=reg.predict(xtest)#预测yhatreg.coef_  #w,系数向量
array([ 4.37358931e-01,  1.02112683e-02, -1.07807216e-01,  6.26433828e-01,        5.21612535e-07, -3.34850965e-03, -4.13095938e-01, -4.26210954e-01])
reg.intercept_  #截距
-36.256893229203946
[*zip(xtrain.columns,reg.coef_)]
[('MedInc', 0.43735893059684), ('HouseAge', 0.010211268294493828), ('AveRooms', -0.10780721617317682), ('AveBedrms', 0.6264338275363777), ('Population', 5.21612535346952e-07), ('AveOccup', -0.003348509646333501), ('Latitude', -0.41309593789477195), ('Longitude', -0.4262109536208474)]
属性含义
coef_

数组,形状为(n_features),或者(n_taargets,n_features)

线性回归方程中估计出的系数。如果在fit中传递多个标签(当y为二维或以上的时候),则返回的系数形状为(n_targets,n_features)的二维数组,而如果仅传递一个标签,则返回的系数是长度为n_features的数组

intercept_数组,线性回归中的截距项

1.5 多元线性回归的模型评估指标

1.5.1 MSE均方误差&MAE绝对均值误差

        RSS残差平方和,它的本质是我们的预测值与真实值之间的差异,所以RSS既是我们的损失函数,也是我们回归类模型的模型评估指标之一。但是,RSS有着致命的缺点:它是一个无界的和,可以无限地大。我们只知道,我们想要求解最小的RSS,从RSS的公式来看,它不能为负,所以RSS越接近0越好,但我们没有一个概念,究竟多小才算好,多接近0才算好?为了应对这种状况,sklearn中使用RSS的变体,均方误差MSEmean squared error)来衡量我们的预测值和真实值的差异:

MSE=\frac{1}{m}\sum_{i=1}^{m}({y_{i}}^{}-\hat{​{y_{i}}^{}})^{2}

均方误差,本质是在 RSS 的基础上除以了样本总量,得到了每个样本量上的平均误差。有了平均误差,我们就可以将平均误差和我们的标签的取值范围在一起比较,以此获得一个较为可靠的评估依据。在sklearn 当中,我们有两种方式调用这个评估指标,一种是使用sklearn 专用的模型评估模块 metrics 里的类 mean_squared_error ,另一种是调用交叉验证的类cross_val_score 并使用里面的 scoring 参数来设置使用均方误差。 (1)使用sklearn 专用的模型评估模块 metrics 里的类 mean_squared_error
from sklearn.metrics import mean_squared_error as MSEMSE(yhat,ytest)
0.5309012639324575
虽然均方误差永远为正,但是 sklearn 中的参数 scoring 下,均方误差作为评判标准时,却是计算” 负均方误差 neg_mean_squared_error )。这是因为 sklearn 在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn 划分为模型的一种损失 (loss) 。在 sklearn 当中,所有的损失都使用负数表示,因此均方误差也被显示为负数了。真正的均方误差MSE 的数值,其实就是 neg_mean_squared_error去掉负号的数字。
(2) 调用交叉验证的类cross_val_score 并使用里面的 scoring 参数
cross_val_score(reg,x,y,cv=10,scoring="neg_mean_squared_error").mean()
-0.5509524296956613
ytest.mean()
2.0819292877906976

测试集平均值为2.08,而均方误差却达到0.5,可见误差较大


 除了MSE,我们还有与MSE类似的MAEMean absolute error,绝对均值误差):

MAE=\frac{1}{m}\sum_{i=0}^{m-1}\left | {y_{i}}^{}-\hat{y_{i}} \right |

其表达的概念与均方误差完全一致,不过在真实标签和预测值之间的差异外我们使用的是 L1 范式(绝对值)。 现实 使用中, MSE MAE 选一个来使用就好了。 sklearn 当中,我们使用命令 from sklearn.metrics import mean_absolute_error来调用 MAE ,同时,我们也可以使用交叉验证中的 scoring = "neg_mean_absolute_error",以此在交叉验证时调用 MAE

1.5.2 R^{2}

        对于回归类算法而言,只探索数据预测是否准确是不足够的。除了数据本身的数值大小之外,我们还希望我们的模型能够捕捉到数据的”规律,比如数据的分布规律,单调性等等,而是否捕获了这些信息并无法使用MSE来衡量。

这张图中,其中红色线是我们的真实标签,而蓝色线是我们的拟合模型。这是一种比较极端,但的确可能发生的情况。这张图像上,前半部分的拟合非常成功,看上去我们的真实标签和我们的预测结果几乎重合,但后半部分的拟合却非常糟糕,模型向着与真实标签完全相反的方向去了。对于这样的一个拟合模型,如果我们使用MSE来对它进行判断,它的MSE会很小,因为大部分样本其实都被完美拟合了,少数样本的真实值和预测值的巨大差异在被均分到每个样本上之后,MSE就会很小。但这样的拟合结果必然不是一个好结果,因为一旦我的新样本是处于拟合曲线的后半段的,我的预测结果必然会有巨大的偏差,而这不是我们希望看到的。所以,我们希望找到新的指标,除 了判断预测的数值是否正确之外,还能够判断我们的模型是否拟合了足够多的,数值之外的信息。

        为了衡量模型对数据上的信息量的捕捉,我们定义了R^{2}可解释性方差分数(explained_variance_scoreEVS):

R^{2}=1-\frac{\sum_{i=0}^{m}(y_{i}-\hat{y_{i}})^{2}}{​{\sum_{i=0}^{m}(y_{i}-\bar{y})^{2}}}=1-\frac{RSS}{​{\sum_{i=0}^{m}(y_{i}-\bar{y})^{2}}}

EVS=1-\frac{Var(y_{i}-\hat{y})}{Var(y_{i})}

其中y是我们的真实标签,\hat{y}是我们的预测结果,\bar{y}是我们的均值, Var 表示方差。方差的本质是任意一个y值和样本均值的差异,差异越大,这些值所带的信息越多。在R^{2} 和EVS 中,分子是真实值和预测值之差的差值,也就是我们的模型没有捕获到的信息总量,分母是真实标签所带的信息量,所以两者都衡量 1 - 我们的模型没有捕获到的信息 量占真实标签中所带的信息量的比例 ,所以,两者都是越接近 1 越好。         R^{2}也可以使用三种方式来调用,一种是直接从metrics中导入 r2_score ,输入预测值和真实值后打分。第二种是直接从线性回归LinearRegression的接口 score 来进行调用。第三种是在交叉验证中,输入 "r2" 来调用。 EVS 有两种调用方法,可以从metrics 中导入,也可以在交叉验证中输入 ”explained_variance“ 来调用。 (1)直接从metrics中导入 r2_score
# 调用R2from sklearn.metrics import r2_scorer2_score(ytest,yhat) # 或:r2_score(y_true=ytest,y_pred=yhat)
0.6043668160178813

(2)从线性回归LinearRegression的接口score来进行调用

r2=reg.score(xtest,ytest)r2
0.6043668160178813

(3)EVS调用方法,可以从metrics中导入,也可以在交叉验证中输入”explained_variance“来调用。

from sklearn.metrics import explained_variance_score as EVSEVS(Ytest,Yhat)
0.6046102673854398
cross_val_score(reg,x,y,cv=10,scoring="explained_variance").mean()
0.5384986901370823
我们观察到,虽然我们在加利福尼亚房子价值数据集上的 MSE相当小,但R^{2}却不高,这证明我们的模型比较好地拟合了数据的数值,却没有能正确拟合数据的分布。让我们与绘图来看看,究竟是不是这样一回事。通过绘制一张图上的两条曲线,一条曲线是真实标签Ytest ,另一条曲线是预测结果 yhat ,两条曲线的交叠越多,说明模型拟合就越好。
import matplotlib.pyplot as pltplt.plot(range(len(ytest)),sorted(ytest),c="black",label="data")plt.plot(range(len(yhat)),sorted(yhat),c="red",label="data")plt.legend()plt.show()

可见,虽然我们的大部分数据被拟合得比较好,但是图像的开头和结尾处却又着较大的拟合误差。如果我们在图像右侧分布着更多的数据,我们的模型就会越来越偏离我们真正的标签。这种结果类似于我们前面提到的,虽然在有限的数据集上将数值预测正确了,但却没有正确拟合数据的分布,如果有更多的数据进入我们的模型,那数据标签被预测错误的可能性是非常大的。

 PS:EVS和R^{2}是异曲同工的,两者都是衡量 1 - 没有捕获到的信息占总信息的比例,EVS和R^{2}难道不应该相等吗?但从我们的结果来看,两者虽然相似,但却并不完全相等,这中间的差值究竟是什么呢?R^{2}和EVS有什么不同?

首先看一组有趣的情况:

import numpy as nprng=np.random.RandomState(42)x=rng.randn(100,80)y=rng.randn(100)cross_val_score(LR(),x,y,cv=5,scoring='r2')
array([-178.71468148,   -5.64707178,  -15.13900541,  -77.74877079,        -60.3727755 ])

以上说明了R^{2}也可以为负!!! 

除了 RSS 之外,我们还有解释平方和 ESS Explained Sum of Squares ,也叫做 SSR 回归平方和)以及总离差平方和TSS( Total Sum of Squares ,也叫做 SST 总离差平方和)。解释平方和 ESS 定义了我们的预测值和样本均值之间的差异,而总离差平方和定义了真实值和样本均值之间的差异,两个指标分别写作: \left\{\begin{matrix} TSS=\sum_{i=0}^{m}(y_{i}-\bar{y})^{2}\\ ESS=\sum_{i=0}^{m}(\hat{y_{i}}-\bar{y})^{2}\\ \end{matrix}\right. 又: TSS=RSS+ESS 如果将 R^{2}带入TSS和ESS,那么就有: R^{2}=1-\frac{RSS}{TSS}=\frac{TSS-RSS}{TSS}=\frac{ESS}{TSS} 而ESS和TSS都带平方,所以必然是正数,那么 R^{2}怎么可能为负呢? 因为公式TSS=RSS+ESS不是永远成立的! 因为公式TSS=RSS+ESS不是永远成立的! 因为公式TSS=RSS+ESS不是永远成立的! 许多教材和博客中让2\sum_{i=0}^{m}(y_{i}-\hat{y_{i}})(\hat{y_{i}}-\bar{y}) 这个式子为0,公式TSS=RSS+ESS自然就成立了,但要让这个式子成立是有条件的。现在有了这个式子的存在, R^{2} 就可以是一个负数了。只要我们的(y_{i}-\hat{y_{i}}) 衡量的是真实值到预测值的距离,而(\hat{y_{i}}-\bar{y}) 衡量的是预测值到均值的距离,只要当这两个部分的符号不同的时候,而 R^{2} 就有机会是一个负数。          R^{2} 显示为负的时候,这证明我们的模型对我们的数据的拟合非常糟糕,模型完全不能使用。 所以,一个负的 R^{2} 是合理的。当然了,现实应用中,如果你发现你的线性回归模型出现了负的 R^{2} ,不代表你就要接受他了,首先检查你的建模过程和数据处理过程是否正确,也许你已经伤害了数据本身,也许你的建模过程是存在bug 的。如果你检查了所有的代码,也确定了你的预处理没有问题,但你的 也还是负的,那这就证明,线性回归模型不适合你的数据。

来源地址:https://blog.csdn.net/weixin_60200880/article/details/127909423

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

多元线性回归LinearRegression

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

pytorch实现线性回归和多元回归的方法

本篇内容介绍了“pytorch实现线性回归和多元回归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近在学习pytorch,现在把学习
2023-06-14

rstudio多元线性回归怎么构建

在RStudio中进行多元线性回归可以使用lm()函数来构建模型。以下是构建多元线性回归模型的步骤:1. 准备数据:将要用于回归的自变量和因变量整理为一个数据框或数据矩阵。2. 使用lm()函数构建模型:使用lm()函数来拟合多元线性回归模
2023-08-18

python多元线性回归怎么实现

在Python中,可以使用`scikit-learn`库来实现多元线性回归。首先,需要导入所需的库和模块:```pythonfrom sklearn.linear_model import LinearRegressionfrom skle
2023-08-18

怎么用Python进行多元线性回归

本篇内容介绍了“怎么用Python进行多元线性回归”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!图1. 多元回归模型中要用到的公式如图1所示
2023-06-16

线性回归

传送门:人工智能视频列表-尚学堂,点开任意一个之后会发现他们会提供系列课程整合到一起的百度网盘下载,包括视频+代码+资料,都是免费的这里:博客园小技巧,我觉得这个很好玩,可以拿来用。对于机器学习、深度学习的什么介绍,百度吧,有很多,这里不说
2023-01-30

python一元线性回归怎么实现

在Python中,可以使用NumPy和Scikit-learn库来实现一元线性回归。以下是一元线性回归的实现步骤:1. 导入所需的库:```pythonimport numpy as npfrom sklearn.linear_model
2023-08-18

Python实现多元线性回归模型的方法详解

多元线性回归是一种广泛应用于数据分析和机器学习的统计模型。它通过使用多个自变量来预测一个或多个因变量的值。在Python中,我们可以使用许多不同的库和框架来实现多元线性回归模型,例如NumPy、Pandas和Scikit-Learn等。下面
Python实现多元线性回归模型的方法详解
2024-01-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录