Python 散点图线性拟合_线性回归(实战)

本文通过Python实现多元线性回归模型,分析数据并进行模型诊断。首先,通过散点图观察变量间关系,接着构建模型,进行变量筛选。模型通过显著性检验,R_squared值为0.918。接着检查线性关系、多重共线性、异常点、正态性和方差齐性,最后讨论残差独立性。整个过程详细展示了线性回归的完整流程。
摘要由CSDN通过智能技术生成

v2-a580ea7d1bbb8958ff11c580954a6be0_1440w.jpg?source=172ae18b

前面介绍了线性回归的理论知识后,有些朋友建议我写一篇实战篇,这样可以方便理解。今天我们就来使用Python实现多元线性回归模型的落地。

本次数据集如下链接:

https://pan.baidu.com/s/16w8-snxnTKtU3boAJGN1Cg​pan.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()

v2-ace70e84406caccd357e630ead17c598_b.jpg

通过数据的面属性统计分析,我们可以得到这些数值变量的基本统计值,如均值、最小值、最大值、下四分位、上四分位、标准差,而这些统计值有助于你对数据的理解和分布的解读。

下面我们绘制各变量之间的散点图,对各变量的相关关系有个大概印象。

sns.pairplot(ccpp)
plt.show()

v2-28d37da791ec823b194a18fdc79389e2_b.jpg

从上面的散点图来看,似乎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()

v2-ccd11c42ecd24a27b3f3a6503fd2963d_b.jpg

通过模型反馈的结果我们可知,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值