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应用的教程
Apr 16 Python
python中__call__内置函数用法实例
Jun 04 Python
深入浅出学习python装饰器
Sep 29 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
Pandas透视表(pivot_table)详解
Jul 22 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
在pycharm中创建django项目的示例代码
May 28 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
Python版微信红包分配算法
2015/05/04 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
经典的班主任推荐信
2013/10/28 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
广告学专业求职信
2014/06/19 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
初中毕业生自我评价
2015/03/02 职场文书
2015年电教工作总结
2015/05/26 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书