多元线性回归python实现代码,python编程实现线性回归
我将介绍线性回归的概念,但主要讨论Python的实现。线性回归是一种统计模型,用于检查两个(简单线性回归)或多个(多元线性回归)变量(一个因变量和一个或多个自变量)之间的线性关系。
线性关系基本上是指当一个(或多个)自变量增加(或减少)时,因变量也会增加(或减少):
如上图,线性关系可能是正的(自变量上升,因变量上升),也可能是负的(自变量上升,因变量下降)。
我会重点讲回归模型在Python中的实现,所以不想在回归模型中深入研究数学,就写一点。
一点数学知识
变量y和x之间的关系由以下等式表示:
y是因变量——或者是我们试图预测或估计的变量。
x是独立变量——我们用来做预测的变量。
m是回归线的斜率——代表x对y的影响,换句话说,x增加1个单位,y就增加m个单位。(“充分披露”:只有当我们知道X和y之间存在线性关系时才成立,几乎所有线性回归的情况下,这都不成立!)
b是一个常数,也称为y截距。如果X等于0,Y就等于b,这在现实生活中不一定适用——我们并不总是知道X和Y之间的确切关系或者有确切的线性关系。
现在做简单线性回归(SLR):在SLR模型中,我们建立了一个基于数据的模型——斜率M和y截距都来自数据;另外,我们不需要x和y的关系是完全线性的。
简单回归还包括数据中的误差(也称为残差)。现在不做过多解释,以后再写。但是残差基本上就是Y的真值和Y的预测/估计值之差。
重要的是,在线性回归中,我们希望预测一个连续变量。
在回归模型中,我们试图通过找到“最佳拟合线”来最小化这些误差。我们试图最小化红线和蓝点之间的距离,尽可能接近零。它使均方误差(MSE)或误差平方和(SSE)最小化,也称为“残差平方和”(RSS),但这超出了本文的范围:-)
在大多数情况下,我们会有多个独立变量,这些变量可以少至两个,也可以多达数百个(理论上甚至数千个)。在这些情况下,我们将使用多元线性回归模型(MLR)。
多元线性回归方程与简单线性回归方程几乎相同,但变量更多:
本文数学部分到此结束:)。接下来,我们将用Python实现它。
Python中的线性回归
在Python中实现线性回归主要有两种方法——使用Statsmodels和scikit-learn。Scipy库也可以用,但是我觉得没有其他两个库普遍。我们来看看这两个库的线性回归:Statsmodels是一个Python模块,它提供了用于评估许多不同统计模型的类和函数,以及统计测试和统计数据探索。"
像Pandas和NumPy一样,获取或安装Statsmodels最简单的方法是通过Anaconda软件包。如果您有兴趣以其他方式安装,请检查此链接。安装后,您需要在每次需要时导入它:
将statsmodels.api作为sm导入
让我们看看如何实际使用Statsmodels进行线性回归。
首先,我们从sklearn导入一个数据集:
从sklearn导入数据集##从scikit-learn导入数据集
data=datasets.load_boston() ##从数据集库中加载波士顿数据集
这是波士顿房价的一组数据。由于它是用于测试机器学习工具的数据集,因此它附带了对数据集的描述。我们可以使用命令数据。DESCR查看(这只适用于sklearn数据集,不是每个数据集)。
为了更好地理解变量,我添加了描述的开头:
波士顿房价数据集
===========================
笔记
-
数据集特征:
:实例数量:506
:属性数量:13个数字/分类预测
:中值(属性14)通常是目标
:属性信息(按顺序):
-按城镇分列的人均犯罪率
- ZN面积超过25,000平方英尺的住宅用地比例
-每个城镇的非零售营业面积所占的比例
- CHAS Charles River虚拟变量(=1,如果区域边界为河流;否则为0)
-氮氧化物浓度(百万分之一)
-每所住宅的房间平均数量
-1940年之前建造的业主自用单元的楼龄比例
- DIS加权到五个波士顿就业中心的距离
径向公路可达性的RAD指数
-每10,000美元征收全价值财产税
- PTRATIO按城镇分列的学生-教师比率
- B 1000(Bk - 0.63)^2其中Bk是按城镇划分的黑人比例
- LSTAT %较低的人口地位
- MEDV以千美元为单位的自有住房中值
:缺少属性值:无
:创作者:哈里森博士和鲁宾菲尔德博士
这是UCI ML住房数据集的副本。
http://archive.ics.uci.edu/ml/datasets/Housing
这个数据集取自卡内基梅隆大学的StatLib图书馆。
运行data.feature_names和data.target将分别打印自变量和因变量的列名。这意味着Scikit-learn已经将房价/价格数据设置为目标变量,并将13个其他变量设置为预测变量。让我们看看如何对这个数据集进行线性回归。
首先,我们应该将数据加载为Pandas DataFrame以便于分析,并将房价设置为我们的目标变量:
将numpy作为np导入
进口熊猫作为pd
#将数据/预测值定义为预设特征名称
df=pd。DataFrame(data.data,columns=data.feature _ names)
#将目标(住房价值- MEDV)放入另一个数据框架
目标=pd。DataFrame(data.target,columns=[MEDV])
我们在这里所做的是获取数据集并将其作为数据帧加载;
然后,我们设置预测变量(比如df)——数据集中预设的自变量。我们还设置目标相关变量或我们试图预测/估计的变量。
接下来,我们将训练一个线性回归模型。我们需要选择我们认为可以预测因变量的变量——这可以通过检查变量之间的相关性、绘制数据和直观地查找关系来完成。
我们来考虑RM(平均房间数)和LSTAT(生活水平低的人的百分比)。
请注意,默认情况下,Statsmodels不添加常数。
##没有常数
将statsmodels.api作为sm导入
X=df[RM]
y=目标[MEDV]
#注意参数顺序的不同
型号=sm。OLS(y,X)。适合()
predictions=model.predict(X) #根据模型进行预测
#打印出统计数据
模型.摘要()
输出:第一张表,无常数
解释表
首先,我们知道什么是因变量、模型和方法。OLS代表普通最小二乘法,“最小二乘法”是指我们试图拟合一条回归线,它可以最小化回归线距离的平方(参见本文的前一部分)
日期、时间和观察次数(编号观察)都是字面意思。
而残差模型的Df与自由度有关——“统计量最终计算中可以随意变化的值的个数。
系数3.6534意味着RM变量增加1,MDEV的预测值增加3.6534。
其他一些重要的值是R的平方——我们的模型解释的方差百分比。
标准差(是统计抽样分布的标准差,最常见的是平均值)
t评分和p值,用于假设检验——RM具有统计学显著性p值;
不存在95%的置信区间RM(意味着我们预测95%置信的值RM在3.548-3.759之间)。
如果我们想给模型添加一个常量,我们必须使用命令来设置它,
X=sm.add_constant(X)
其中x是包含输入(独立)变量的数据帧的名称。
将statsmodels.api作为sm #导入statsmodels
X=df[RM] ## X通常指我们的输入变量(或自变量)
y=目标[MEDV] ## Y通常指我们的输出/因变量
X=sm.add_constant(X) ##让我们在模型中添加一个截距(beta_0)
#注意参数顺序的不同
型号=sm。OLS(y,X)。fit() ## sm。OLS(输出,输入)
预测=model.predict(X)
#打印出统计数据
模型.摘要()
输出:包含常量的第二个表。
解释表
不同于上表中使用的常数项的系数。如果没有常数,我们强制我们的模型通过原点,但是现在我们有一个y截距(const)为-34.67。我们还将RM预测的斜率从3.634更改为9.1021。
现在让我们尝试使用多个变量来拟合回归模型——我们将使用前面提到的RM和LSTAT。模型拟合是相同的:
X=df[["RM "," LSTAT"]]
y=目标["MEDV"]
型号=sm。OLS(y,X)。适合()
预测=model.predict(X)
模型.摘要()
输出:表3,使用多个独立变量(2)
解释表
我们在这里可以看到,这个模型具有更高的R平方值-0.948,这意味着这个模型解释了因变量的94.8%的方差。每当我们在回归模型中加入变量时,R-square会更高,但这是一个相当高的R-square。
我们可以看到,RM和LSTAT在预测(或估计)房屋的中值方面具有统计显著性;我们看到,当RM增加1时,MEDV将增加4.9069,当LSTAT增加1时,MEDV将减少-0.6557。
LSTAT是生活水平低的人所占的百分比。不幸的是,我们可以用它来降低房子的中值。同样,房子的房间越多,价值越高。
这是Statsmodels中一元和多元线性回归的一个例子。我们可以在我们的回归模型中使用尽可能少或尽可能多的变量(最多13个变量)!
接下来,我将演示如何在SKLearn中运行线性回归模型。
SKLearn中的线性回归
谈到Python中的机器学习,SKLearn几乎是黄金标准。它有许多学习算法,可用于回归、分类、聚类和降维。
为了使用线性回归,我们需要导入它:
从sklearn导入线性模型
我们用之前用过的同一个数据集,就是波士顿房价。该过程的前一部分是相同的-从SKLearn导入数据集并将其加载到波士顿数据集中:
从sklearn导入数据集##从scikit-learn导入数据集
data=datasets.load_boston() ##从数据集库中加载波士顿数据集
接下来,我们将数据加载到Pandas中(和以前一样)
#将数据/预测值定义为预设特征名称
df=pd。DataFrame(data.data,columns=data.feature _ names)
#将目标(住房价值- MEDV)放入另一个数据框架
目标=pd。DataFrame(data.target,columns=[MEDV])
现在,和以前一样,我们有一个带自变量的数据框架(标为“df”)和一个带因变量的数据框架(标为“target”)。我们使用SKLearn来拟合回归模型。
首先,我们将定义x和y,这一次我将使用DataFrame中的所有变量来预测房价:
X=df
y=目标["MEDV"]
然后我会训练一个模型:
lm=线性模型。线性回归()
model=lm.fit(X,y)
lm.fit()函数适用于线性模型。我们希望使用模型进行预测,因此我们将使用lm.predict():
预测值=lm.predict(X)
打印(预测)[0:5]
打印功能将打印Y的前5个预测(为了“节省空间”,我没有打印整个列表,删除[0: 5]将打印整个列表):
[30.00821269 25.0298606 30.5702317 28.60814055 27.94288232]
记住,lm.predict()使用我们拟合的线性模型来预测y(因变量)。
你一定注意到了,当我们用SKLearn运行线性回归时,我们没有得到像Statsmodels一样漂亮的表格(好吧,没那么漂亮.但是很有用)。
我们能做的是使用内置函数返回分数、系数和估计截距。让我们看看它是如何工作的:
lm.score(X,y)
该输出:
0.7406077428649428
这是我们模型的R分。如前所述,R是预测解释方差的百分比。如果你有兴趣,请阅读这里。接下来,让我们看看预测变量的系数:
lm.coef_
将给出以下输出:
数组([-1.07170557e-01,4.63952195e-02,2.08602395e-
02,2.68856140e 00,-1.77957587e 01,3.2466 e
00,7.51061703e-04,-1.47575880e 00,3.05655038e-01,
-1.23293463e-02,-9.53463555e-01,9.39251272e-03,
-5.25466633e-01])
看一下截距大小:
lm.intercept_
这将产生这样一个结果:
36.491103280363134
这些都是我前面提到的多元回归方程的(估计/预测)部分。
好了,你已经了解到如果你用Sklean做线性回归,你还可以查看更多关于coef_和intercept_的信息
这是一个关于如何在Python中进行线性回归的快速(但漫长)的研究。
在实践中,您不会使用整个数据集,但您会将数据分为一个训练数据来训练您的模型和一个测试数据来测试您的模型。
在下一篇文章中,我将介绍Python中的其他机器学习模型(* *)
历史提交的图片或压缩文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。