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合并两个字典的常用方法与效率比较
Jun 17 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
使用Python解析JSON数据的基本方法
Oct 15 Python
python距离测量的方法
Mar 06 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
PyQt5实现简单的计算器
May 30 Python
Python能做什么
Jun 02 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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
一些PHP写的小东西
2006/12/06 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
图片之间的切换
2006/06/26 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
Python修改列表值问题解决方案
2020/03/06 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
PHP面试题-$message和$$message的区别
2015/12/08 面试题
同事打架检讨书
2014/02/04 职场文书
工作决心书
2014/03/11 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android