回归案例②

数据集来源:
从UCI数据集库下载得到的关于建筑物的供暖负荷和冷负荷要求(即能效)与建筑参数的关系
数据集信息:
我们使用Ecotect中模拟的12种不同建筑形状进行能量分析。建筑物在玻璃窗区域,玻璃区域分布和方向以及其他参数方面不同。我们模拟各种设置作为上述特征的函数,以获得768个建筑形状。该数据集包括768个样本和8个特征,旨在预测两个实值响应。如果响应四舍五入到最接近的整数,它也可以用作多类分类问题。
属性信息:
数据集包含八个属性(或特征,由X1 … X8表示)和两个响应(或结果,由y1和y2表示)。目的是使用八个特征来预测两个响应中的每一个。

具体为:

X1相对紧凑度 X2表面积 X3壁面积 X4屋顶面积 X5总高度 X6方向 X7玻璃面积 X8玻璃面积分布 y1加热负荷 y2冷负荷

import pandas as pd
import numpy as np
dataset = pd.read_excel('ENB2012_data.xlsx')
dataset.head()

数据集描述

#设置x,y对应的列,并进行特征缩放
x = dataset.iloc[:,0:-2]
y1 = dataset.iloc[:,-2]
y2 = dataset.iloc[:,-1]
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
x = ss.fit_transform(x)
'''
做反向淘汰的准备工作,为常数项构造系数。
关于反向淘汰可以看之前的文章,也可以自行搜索更多的资料
这里还是简单的提一下,比较各个变量的P_value与预设的显著水平(这里是0.05)进行比较,高于的说明该变量对结果的影响闭关不是很显著,可以考虑淘汰该变量,是模型更加简洁
'''
x = np.append(arr=np.ones((x.shape[0],1)),values=x,axis=1)

y1的回归:

#将数据集分割成训练集,测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y1_train,y1_test = train_test_split(x,y1,test_size = 0.25,random_state = 0)
#拟合数据,并查看回归器的信息
import statsmodels.formula.api as sm
x_opt = x_train[:,[0,1,2,3,4,5,6,7,8]]
regressor = sm.OLS(endog=y1_train,exog=x_opt).fit()
regressor.summary()
#R-squared: 0.917    Adj. R-squared:    0.916   AIC:    2864

这里写图片描述
淘汰x_6

x_opt = x_train[:,[0,1,2,3,4,5,7,8]]
regressor = sm.OLS(endog=y1_train,exog=x_opt).fit()
regressor.summary()  
#R-squared: 0.917    Adj. R-squared:    0.916   AIC:    2863

可以看到,我们的模型的决定系数R2与校正的决定系数R_adj^2都表现不错,可以进行预测了

y1_pre = regressor.predict(x_test[:,[0,1,2,3,4,5,7,8]])
print(y1_pre)

y2的回归:

from sklearn.model_selection import train_test_split
x_train,x_test,y2_train,y2_test = train_test_split(x,y2,test_size = 0.25,random_state = 0)

import statsmodels.formula.api as sm
x_opt = x_train[:,[0,1,2,3,4,5,6,7,8]]
regressor = sm.OLS(endog=y2_train,exog=x_opt).fit()
regressor.summary()   #R-squared:   0.886   Adj. R-squared: 0.885   AIC:    2987.


x_opt = x_train[:,[0,1,2,3,4,5,6,7]]
regressor = sm.OLS(endog=y2_train,exog=x_opt).fit()
regressor.summary()   #R-squared:   0.886   Adj. R-squared: 0.885    AIC:   2985

x_opt = x_train[:,[0,1,2,4,5,6,7]]
regressor = sm.OLS(endog=y2_train,exog=x_opt).fit()
regressor.summary()   #R-squared:   0.886   Adj. R-squared: 0.885   AIC:    2985

x_opt = x_train[:,[0,1,2,4,5,7]]
regressor = sm.OLS(endog=y2_train,exog=x_opt).fit()
regressor.summary()   #R-squared:   0.886   Adj. R-squared: 0.885   AIC:    2984.

#x_opt = x_train[:,[0,1,4,5,7]]
#regressor = sm.OLS(endog=y2_train,exog=x_opt).fit()
#regressor.summary()   #R-squared:  0.885   Adj. R-squared: 0.885   AIC:    #2987
#剔除后发现决定系数R2有所下降,而校正的决定系数R_adj^2变化不大,所以选择上一个结果
y2_pre = regressor.predict(x_test[:,[0,1,4,5,7]])
print(y2_pre)

关于数据可视化这一点,还不是很熟悉,所以未能很直观的反应预测的结果,只能通过模型的指标来考虑模型好坏。后续会学习,然后在展示。

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/82683544
今日推荐