python3 线性回归验证方法


Posted in Python onJuly 09, 2019

如下所示:

#-*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from patsy.highlevel import dmatrices
#2.7里面是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
import matplotlib
 
#数据获取
ccpp = pd.read_excel('CCPP.xlsx')
ccpp.describe()
#绘制各变量之间的散点图
sns.pairplot(ccpp)
plt.show()
#发电量(PE)与自变量之间的相关系数
a = ccpp.corrwith(ccpp.PE)
print(a)
#将因变量PE,自变量AT,V,AP和截距项(值为1的1维数值)以数据框的形式组合起来
y,x = dmatrices('PE~AT+V+AP',data = ccpp,return_type = 'dataframe')
#构造空的数据框
vif = pd.DataFrame()
vif[""VIF Factor""] = [variance_inflation_factor(x.values,i) for i in range(x.shape[1])]
vif[""features""] = x.columns
print (vif)
 
#构建PE与AT,V和AP之间的线性模型
fit = sm.formula.ols('PE~AT+V+AP',data=ccpp).fit()
b = fit.summary()
# print(b)
#计算模型的RMSE值
pred = fit.predict()
c = np.sqrt(mean_squared_error(ccpp.PE,pred))
print(c)
#离群点检验
outliers = fit.get_influence()
#高杠杆值点(帽子矩阵)
leverage = outliers.hat_matrix_diag
#dffits值
dffits = outliers.dffits[0]
#学生化残差
resid_stu = outliers.resid_studentized_external
#cook距离
cook = outliers.cooks_distance[0]
#covratio值
covratio = outliers.cov_ratio
#将上面的几种异常值检验统计量与原始数据集合并
contat1 = pd.concat([pd.Series(leverage,name = 'leverage'),pd.Series(dffits,name ='dffits'),
pd.Series(resid_stu,name = 'resid_stu'),pd.Series(cook,name = 'cook'),
pd.Series(covratio,name ='covratio'),],axis = 1)
ccpp_outliers = pd.concat([ccpp,contat1],axis = 1)
d = ccpp_outliers.head()
print(d)
 
#计算异常值数量的比例
outliers_ratio = sum(np.where((np.abs(ccpp_outliers.resid_stu)>2),1,0))/ccpp_outliers.shape[0]
e = outliers_ratio
print(e)
#删除异常值
ccpp_outliers = ccpp_outliers.loc[np.abs(ccpp_outliers.resid_stu)<=2,]
#重新建模
fit2 = sm.formula.ols('PE~AT+V+AP',data = ccpp_outliers).fit()
f = fit2.summary()
# print(f)
pred2 = fit2.predict()
g = np.sqrt(mean_squared_error(ccpp_outliers.PE,pred2))
print(g)
#
#残差的正态性检验(直方图法)
resid = fit2.resid
#中文和负号的正常显示
# plt.rcParams['font.sans=serif'] = ['Microsoft YaHei']
plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.rcParams['font.sans=serif'] = 'sans-serif'
plt.rcParams['axes.unicode_minus'] = False
plt.hist(resid,bins = 100,normed = True,color = 'steelblue',edgecolor = 'k')
#设置坐标轴标签和标题
plt.title('残差直方图')
plt.ylabel('密度值')
#生成正态曲线的数据
x1 = np.linspace(resid.min(),resid.max(),1000)
normal = mlab.normpdf(x1,resid.mean(),resid.std())
#绘制正态分布曲线
plt.plot(x1,normal,'r-',linewidth = 2,label = '正态分布曲线')
#生成核密度曲线的数据
kde = mlab.GaussianKDE(resid)
x2 = np.linspace(resid.min(),resid.max(),1000)
#绘制核密度曲线
plt.plot(x2,kde(x2),'k-',linewidth = 2,label = '核密度曲线')
#去除图形顶部边界和右边界的刻度
plt.tick_params(top = 'off',right = 'off')
#显示图例
plt.legend(loc='best')
#显示图形
plt.show()
#生成的正态曲线的数据
pp_qq_plot = sm.ProbPlot(resid)
pp_qq_plot.ppplot(line = '45')
plt.title('P-P图')
pp_qq_plot.qqplot(line = 'q')
plt.title('Q-Q图')
plt.show()
#残差的正态性检验(非参数法)
standard_resid = (resid-np.mean(resid))/np.std(resid)
g = stats.kstest(standard_resid,'norm')
print(g)
# 总结:由于shapiro正态性检验对样本量的需求是5000以内,而本次数据集样本量有9000多,故选择k-s来完成正态性检验。
# 从k-s检验的p值来看,拒绝了残差服从正态分布的假设,即认为残差并不满足正态性假设这个前提。
# 如果残差不服从正态分布的话,建议对Y变量进行box-cox变换处理。
# 由于fit2模型的残差并没有特别明显的偏态(偏度为0.058,接近于0),故这里就不对Y进行变换。
 
# 
# import scipy.stats as stats
# #找到box-cox变换的Lambda系数
# lamd = stats.boxcox_normmax(vif.y,method = 'mle')
# #对y进行变换
# vif['trans_y'] = stats.boxcox(vif.y,lamd)
# #建模
# fit3 = sm.formula.ols('y~x1+x2...',data = vif).fit()
# fit3.summary()

以上这篇python3 线性回归验证方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 学习笔记
Dec 27 Python
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
python实现查询IP地址所在地
Mar 29 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
python开发环境PyScripter中文乱码问题解决方案
Sep 11 Python
pandas 使用apply同时处理两列数据的方法
Apr 20 Python
python opencv读mp4视频的实例
Dec 07 Python
Python内存管理实例分析
Jul 10 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
python time.sleep()是睡眠线程还是进程
Jul 09 #Python
python logging模块的使用总结
Jul 09 #Python
Django中如何使用sass的方法步骤
Jul 09 #Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 #Python
使用python socket分发大文件的实现方法
Jul 08 #Python
python查看文件大小和文件夹内容的方法
Jul 08 #Python
python 搜索大文件的实例代码
Jul 08 #Python
You might like
关于js和php对url编码的处理方法
2014/03/04 PHP
php实现递归的三种基本方式
2020/07/04 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
详解Python中for循环的使用方法
2015/05/14 Python
python集合用法实例分析
2015/05/30 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
Python如何实现动态数组
2019/11/02 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
教师绩效工资方案
2014/02/01 职场文书
应届生面试求职信
2014/07/02 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers