线性回归模型

news/2024/7/16 8:39:07 标签: sm, 线性回归模型, python, 机器学习

一元线性回归模型的介绍与应用

一元线性回归模型

回归方程形式:y_{i}=\beta _{0}+\beta _{1}x_{i}+\varepsilon_{i},i=1,2,...n,其中\varepsilon_{1},\varepsilon_{2},...\varepsilon_{n}需满足以下四个假设条件

a.正态性假设,即\varepsilon_{i}是服从正态分布的随机变量

b.无偏性假设,即E(\varepsilon_{i})=0

c.同方差性假设,即所有\varepsilon_{i}的方差都相同;同时也说明了\varepsilon_{i}与自变量,因变量之间都是相互独立的

d.独立性假设,\varepsilon_{i}之间相互独立,且满足COV(\varepsilon_{i},\varepsilon _{j})=0(i\neqj)

根据误差平方和最小的原则,用最小二乘法求解参数a,b:

 

一元回归模型python的实现:

python">import pandas as pd
import statsmodels.api as sm
income = pd.read_csv(r'D:\download\python数据分析与挖掘\第11章 线性回归模型\Salary_Data.csv')
# 构建回归模型
fit = sm.formula.ols('Salary~YearsExperience',data = income).fit()
fit.params  # 返回参数


'''
sm.ols(formula, data, subset=None, drop_cols=None)

formula:以字符串的形式指定线性回归模型的公式,如'y~x'就表示简单线性回归模型
data:指定建模的数据集
subset:通过bool类型的数组对象,获取data的子集用于建模
drop_cols:指定需要从data中删除的变量
'''

数据集:

结果:

查看两变量相关性:

python">income.Salary.corr(income.YearsExperience) #0.98

多元线性回归模型的系数推导

多元回归模型的定义

 

多元回归模型python的实现:

数据集:

查看相关性

python">profit.drop('State',axis=1).corrwith(profit.Profit) # Profit变量与其他三个连续变量的相关性

 

python">profit.drop('State',axis=1).corr() # 四个连续变量两两之间的相关性

 

python">from sklearn import model_selection
profit = pd.read_excel(r'D:\download\python数据分析与挖掘\第11章 线性回归模型\Predict to Profit.xlsx')
# profit.head(1)

# 将数据拆分为训练集和测试集
train,test = model_selection.train_test_split(profit,test_size = 0.2,random_state=1234)
# 根据train数据建模
model = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+C(State)',data=train).fit() # State加C()表示分类变量,State有三个类别
print("模型的偏回归系数分别为:\n",model.params)

# 删除test数据集中的Profit变量,用剩下的自变量进行预测
test_X = test.drop(labels='Profit',axis=1)
pred=model.predict(exog=test_X)
print("对比预测值和实际值的差异:\n",pd.DataFrame({'Prediction':pred,'Real':test.Profit}))

结果如下,state默认将离散变量State的California作为对照组(共生性)。下面另一段代码是手动为State设置哑变量,并砍掉New York做的预测结果

python"># 生成哑变量
dummies = pd.get_dummies(profit.State)
# 新增哑变量列,生成新数据
profit_new = pd.concat([profit,dummies],axis=1)
# 删除State变量和California变量(因为State变量已被分解为哑变量,New York变量需要作为参照组)
profit_new.drop(labels = ['State','New York'],axis = 1,inplace = True)
train,test=model_selection.train_test_split(profit_new,test_size=0.2,random_state=1234)
model = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California',data = train).fit()
print('模型的偏回归系数分别为:\n',model.params)

 

线性回归模型的假设检验

模型的F检验

  1. 提出问题的原假设和备择假设
  2. 在原假设的条件下,构造统计量F
  3. 根据样本信息,计算统计量的值
  4. 对比统计量的值和理论F分布的值,当统计量值超过理论值时,拒绝原假设,否则接受原假设

python"># 模型的F检验

# 1.计算F统计量
import numpy as np
# 计算建模数据中因变量的均值
ybar = train.Profit.mean()
# 统计模型model中变量个数以及训练集观测个数
p = model.df_model
n = train.shape[0]
# 计算回归平方和
RSS = np.sum((model.fittedvalues-ybar)**2)
# 计算残差平方和
ESS = np.sum(model.resid**2)
# 计算F统计量
F = (RSS/p)/(ESS/(n-p-1))
print(F,"直接得到F:",model.fvalue) #174.63721716844725 174.6372171570355

# 2. 与F分布的理论值对比
# 导入模块
from scipy.stats import f
# 计算F分布的理论值
F_Theroy = f.ppf(q=0.95, dfn = p,dfd = n-p-1)
print('F分布的理论值为:',F_Theroy) # F分布的理论值为: 2.502635007415366

结论:

计算出来的F统计量值174.64远远大于F分布的理论值2.50,所以应当拒绝原假设,即认为多元线性回归模型是显著的,也就是说回归模型的偏回归系数都不全为0

参数的T检验

查看模型的概览信息

从结果可以看出,只有截距项Intercept和研发成本RD_Spend通过了显著性检验,其P值远小于0.05

python">model.summary()
OLS Regression Results
Dep. Variable:ProfitR-squared:0.964
Model:OLSAdj. R-squared:0.958
Method:Least SquaresF-statistic:174.6
Date:Thu, 22 Apr 2021Prob (F-statistic):9.74e-23
Time:23:34:37Log-Likelihood:-401.20
No. Observations:39AIC:814.4
Df Residuals:33BIC:824.4
Df Model:5  
Covariance Type:nonrobust  
 coefstd errtP>|t|[0.0250.975]
Intercept5.807e+046846.3058.4820.0004.41e+047.2e+04
RD_Spend0.80350.04019.9880.0000.7220.885
Administration-0.05780.051-1.1330.265-0.1620.046
Marketing_Spend0.01380.0150.9300.359-0.0160.044
Florida1440.86273059.9310.4710.641-4784.6157666.340
California513.46833043.1600.1690.867-5677.8876704.824
Omnibus:1.721Durbin-Watson:1.896
Prob(Omnibus):0.423Jarque-Bera (JB):1.148
Skew:0.096Prob(JB):0.563
Kurtosis:2.182Cond. No.1.60e+06

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.6e+06. This might indicate that there are
strong multicollinearity or other numerical problems.


http://www.niftyadmin.cn/n/1376588.html

相关文章

java工具类Collections

Collections的常用方法1. sort(list,comparator)sort(list)在使用时,集合中的对象要可序列化,即实现comparable方法或者传入一个已知类型的比较器对象,默认调用的是compareTo()方法2. shuffle(list) 将元素进行随机排列,使顺…

vue引用百度地图,drawingManager.setDrawingMode不能接受参数,否则会报错

直接上部分代码: 引用百度地图后,没报错,但是鼠标绘制线路时报错: // 绘制点线 this.drawingManager new window.BMapLib.DrawingManager(this.map, { isOpen: true, //是否开启绘制模式 //enableDrawingTool: true, //是否显示…

11. Container With Most Water

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多…

核心基础(二)--进制转化以及字符串和格式化

如何表示二进制、八进制和十六进制 二进制:数值前面加0b八进制:数值前面加0o十六进制:数值前面加0x二进制转换函数:bin-->二进制转换函数;int-->十进制转换函数;hex-->十六进制转换函数&#xff…

全能系统监控工具dstat

一、什么是dstat?通过man帮助,可以看到官方对dstat的定义为:多功能系统资源统计生成工具( versatile tool for generating system resource statistics)。在获取的信息上有点类似于top、free、iostat、vmstat等多个工具…

mysql练习题博客集

https://note.youdao.com/share/?id45d4298f42397bd52ccf6fc716e27ee9&typenote#/转载于:https://www.cnblogs.com/yushengzhou/p/9947460.html

字符串格式化的方法

格式化字符串的方式 %格式化模板字符串字符串的format方法fstring print("%s,Its %d dollars"%("wow",4)) # 通过Template对象封装 $放置一些占位符,并通过substitute方法用实际的值替换这些占位符from string import Templatetemplate1 Te…

从“老卡”到“小闪”的华丽转身

“老卡”同学,或者某人称呼的“小卡”同学,名字无所谓了,反正就是很卡。 可能是跟着小仙女太久了,“老卡”同学浑身也带着一股仙气,手感很舒服,打气字来相当lc,比我自己的又黑又傻的破联想&…