前面介绍了线性回归的理论知识后,有些朋友建议我写一篇实战篇,这样可以方便理解。今天我们就来使用Python实现多元线性回归模型的落地。
本次数据集如下链接:
https://pan.baidu.com/s/16w8-snxnTKtU3boAJGN1Cgpan.baidu.com提取码:3udf
各个变量解释为
- AT:温度
- V:压力
- AP:相对湿度
- RH:排气量
- PE:发电量(因变量)
下面正式开始吧!
1,导入包
# 导入第三方包
import pandas as pd
import numpy as np
from patsy import dmatrices
from statsmodels.stats.outliers_influence import variance_inflation_factor
import statsmodels.api as sm
import scipy.stats as stats
from sklearn.metrics import mean_squared_error
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
2,读取数据
raw = pd.read_excel('CCPP.xlsx')
raw.describe()
通过数据的面属性统计分析,我们可以得到这些数值变量的基本统计值,如均值、最小值、最大值、下四分位、上四分位、标准差,而这些统计值有助于你对数据的理解和分布的解读。
下面我们绘制各变量之间的散点图,对各变量的相关关系有个大概印象。
sns.pairplot(ccpp)
plt.show()
从上面的散点图来看,似乎AP(相对湿度)和RH(排气量)与PE(发电量)之间并不存在明显的线性关系。
3,建模
接下来需要根据读取进来的数据构造回归模型,但建模之前,我们一般需要将数据集拆分成训练集(用于建模)和测试集(用于模型的评估)两个部分。
Train,Test = train_test_split(ccpp, train_size = 0.8, random_state=1234)
建模
fit_train = ols('PE~AT+V+AP' , data = ccpp).fit()
fit_train.summary()
通过模型反馈的结果我们可知,R_squared的值为0.918。说明模型是通过显著性检验的,即F统计量所对应的P值是远远小于0.05这个阈值的,说明需要拒绝原假设(即认为模型的所有回归系数都不全为0),但模型的显著性通过检验并不代表每个变量都对因变量是重要的,所以还需要进行偏回归系数的显著性检验。通过上图的检验结果显示,P>|t|这一栏,结果都小于0.05,均通过显著性检验。说明温度AT,压力A,相对湿度AP都影响到排气量PE的变动,故不需要将其中的变量从模型中剔除。
4,变量筛选
多元线性回归能够按照一些方法筛选建立回归的自变量,这些方法包括:向前法,向后法,逐步法。这三种方法进入或者剔除变量的一个标准是AIC准则,即最小信息准则。AIC值越小说明模型效果越好,越简洁。
#自定义一个通过AIC进行变量向前筛选的函数
def forward_select(data, response):
remaining = set(data.columns)
remaining.remove(response)
selected = []
current_score, best_new_score = float('inf'), float('inf')
while remaining:
aic_with_candidates=[]
for candidate in remaining:
formula = "{} ~ {}".format(
response,' + '.join(selected + [candidate]))
aic = ols(formula=formula, data=data).fit().aic
aic_with_candidates.append((aic, candidate))
aic_with_candidates.sort(reverse=True)
best_new_score, best_candidate=aic_with_candidates.pop()
if current_score > best_new_score:
remaining.remove(best_candidate)
selected.append(best_candidate)
current_score = best_ne