5.1 多元线性回归分析

在本章中,我们将从线性回归模型开始,它是最简单的模型之一。
数据集来自于UIC数据集中的能效数据集,该数据及用来分析建筑的供热负荷能效和制冷负荷能效,其中自变量有8个,因变量有两个,实例主要分析8个自变量和供热负荷Y1之间的回归模型,使用ststsmodels
分析建筑物的供热负荷和制冷负荷要求(即能源效率)与建筑参数的关系。
能效数据集http://archive.ics.uci.edu/ml/datasets/Energy+efficiency
X1相对紧凑
X2表面积
X3墙面积
X4屋顶区域
X5总高度
X6方向
X7玻璃区域
X8玻璃面积分布
y1加热负载
y2冷却负荷

多元线性回归分析

# 多元线性回归分析
## 加载包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
## 图像在jupyter notebook中显示
%matplotlib inline
## 显示的图片格式(mac中的高清格式),还可以设置为"bmp"等格式
%config InlineBackend.figure_format = "retina"
## 输出图显示中文
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = "D:\Desktop\python在机器学习中的应用\方正粗黑宋简体.ttf",size=14)
import statsmodels.api as sm
import statsmodels.formula.api as smf
from sklearn import metrics
from sklearn.model_selection import train_test_split
## 忽略提醒
import warnings
warnings.filterwarnings("ignore")
Enb = pd.read_excel("D:\Desktop\python在机器学习中的应用\ENB2012_data.xlsx")
print(Enb.sample(5)) #抽样查看五个数据

在这里插入图片描述

## 查看数据是否有缺失值
Enb.info()

在这里插入图片描述
没有缺失值

## 分析数据间的相关性
datacor = np.corrcoef(Enb,rowvar=0)
datacor = pd.DataFrame(data=datacor,columns=Enb.columns,index=Enb.columns)
## 热力图可视化相关系数
plt.figure(figsize=(8,8))
ax = sns.heatmap(datacor,square=True,annot=True,fmt = ".3f",
                 linewidths=.5,cmap="YlGnBu",
                 cbar_kws={"fraction":0.046, "pad":0.03})
ax.set_title("数据变量相关性",fontproperties = fonts)
plt.show()

在这里插入图片描述

## 多元回归
formula = "Y1 ~ X1 + X2 + X3 + X4 + X5+ X6 + X7 + X8"
lm = smf.ols(formula, Enb).fit()
print(lm.summary()) #输出回归模型结果

在这里插入图片描述

  1. R-squared: 0.916接近于1,拟合效果好
  2. Prob (F-statistic): 0.00小于0.05说明模型是显著的
  3. 分析各个系数的显著性,X6 P值0.805大于0.05,说明X6不显著,模型需要进一步优化在这里插入图片描述
  4. Cond. No. 1.62e+16,结果非常大,说明存在自变量之间的多重共线性问题,需要使用逐步回归等方法
  5. 综上,虽然模型拟合效果较好,但还是需要完善,需要用逐步回归筛选特征,建立更合适的模型

逐步回归

# 逐步回归
from itertools import combinations
## 根据BIC和Cond. No.(条件数)根据参与回归的自变量个数来找到合适的回归模型
variable = []
aic = []
bic = []
Cond = []
R_squared = []
for ii in range(1,len(Enb.columns.values[0:-2])): 
    var = list(combinations(Enb.columns.values[0:-2],ii)) #循环模型中自变量的个数
    for v in var: #8个自变量在指定变量个数的所有组合,计算出回归模型指定的四个参数
        formulav = "Y1"+"~"+"+".join(v)
        lm = smf.ols(formulav, Enb).fit()
        bic.append(lm.bic)
        aic.append(lm.aic)
        variable.append(v)
        Cond.append(lm.condition_number)
        R_squared.append(lm.rsquared)
## 将输出的参数组合成数据表,并根据bic排序
df = pd.DataFrame()
df["variable"] = variable
df["bic"] = bic
df["aic"] = aic
df["Cond"] = Cond
df["R_squared"] = R_squared
df.sort_values("bic",ascending=True)[df.Cond<300].head(5) #按照BIC排序
df.sort_values("bic",ascending=True).head(5)

在这里插入图片描述
可以发现bic最小的回归方程只用到了(X1, X4, X5, X7, X8)5个自变量,并且R2 = 0.9157,接下来使用5个自变量进行多元回归分析

formula = "Y1 ~ X1 + X4 + X5+ X7 + X8"
lm = smf.ols(formula, Enb).fit()
print(lm.summary())

在这里插入图片描述

# 数据预测
#输出预测结果和原始数据的平均绝对值误差
Y_pre = lm.predict(Enb)
metrics.mean_absolute_error(Y_pre,Enb.Y1) 

2.0853894644526623

## 绘制回归的预测结果和原始数据的差异
Y_pre = lm.predict(Enb)
index = np.argsort(Enb.Y1)
plt.figure(figsize=(12,5))
plt.plot(np.arange(Enb.shape[0]),Enb.Y1[index],"r",label = "Original Y1")
plt.plot(np.arange(Enb.shape[0]),Y_pre[index],"b--",label = "Prediction")
plt.legend()
plt.grid("on")
plt.xlabel("Index")
plt.ylabel("Y1")
plt.title("多元回归预测结果图",FontProperties = fonts)
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值