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深入学习之上下文管理器
Aug 31 Python
python套接字流重定向实例汇总
Mar 03 Python
redis之django-redis的简单缓存使用
Jun 07 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
Python中函数的返回值示例浅析
Aug 28 Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 Python
python 指定源路径来解决import问题的操作
Mar 04 Python
python 统计代码耗时的几种方法分享
Apr 02 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(7) php 字符串相关应用
2010/03/05 PHP
深入apache host的配置详解
2013/06/09 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
JavaScript实现数值自动增加动画
2017/12/28 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
刊首寄语大全
2014/04/11 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书