异方差 Python实现

借鉴一位博主的文章,结合两篇,用于实现Python代码,本人亲测,可以跑通。
这位博主的代码字母有连一起的,以下是我亲测的代码:
http://www.sohu.com/a/203047458_654419
http://www.sohu.com/a/201764621_654419

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
import scipy.io
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数据读取

# #ccpp = pd.read_excel( 'CCPP.xlsx')ccpp.describe()
# data = scipy.io.loadmat('ENCDATA-2hp.mat') # 读取mat文件
# # path = scio.loadmat('FFT-2hp.mat')['FFT-2hp']
# print(data)
# train1=data['train3hp']
# test1=data['test3hp']
# train_y=data['train_y3hp']
# test_y=data['test_y3hp']
# data1=train1[:,1]
# print("train1",train1.shape)
# print("data",data1.shape)
# # sns.pairplot(data)
# # plt.show()
# #y, X = dmatrices( data1, data = train1, return_type= 'dataframe')
# fit2 = sm.formula.ols( data1,data = train1).fit()
# print("fit2",fit2)
# fit2.summary()
# pred2 = fit2.predict()
# print("pred2",pred2)
#
# np.sqrt(mean_squared_error(train1.PE, pred2))
# resid = fit2.resid
# plt.scatter(fit2.predict(), (fit2.resid-fit2.resid.mean())/fit2.resid.std())
# plt.xlabel( '预测值')
# plt.ylabel( '标准化残差')
#
# # 添加水平参考线
#
# plt.axhline(y = 0, color = 'r', linewidth = 2)
# plt.show()

ccpp = pd.read_excel( 'CCPP.xlsx')
ccpp.describe()
sns.pairplot(ccpp)
plt.show()

# 发电量与自变量之间的相关系数
ccpp.corrwith(ccpp.PE)
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.columnsvif
# print(vif[ "features"])
# 构造PE与AT、V和AP之间的线性模型

fit = sm.formula.ols( 'PE~AT+V+AP',data = ccpp).fit()
fit.summary()
print("fit",fit)
# 计算模型的RMSE值

pred = fit.predict()
np.sqrt(mean_squared_error(ccpp.PE, pred))

# 离群点检验

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)
ccpp_outliers.head()
print("contat1",contat1)

# 重新建模

fit2 = sm.formula.ols( 'PE~AT+V+AP',data = ccpp_outliers).fit()
fit2.summary()

# 计算模型的RMSE值

pred2 = fit2.predict()
np.sqrt(mean_squared_error(ccpp_outliers.PE, pred2))
resid = fit2.resid
# 标准化残差与预测值之间的散点图

plt.scatter(fit2.predict(), (fit2.resid-fit2.resid.mean())/fit2.resid.std())
plt.xlabel( '预测值',fontdict={'family' : 'sans-serif', 'size' : 20})
plt.ylabel( '标准化残差',fontdict={'family' : 'sans-serif', 'size' : 20})

# 添加水平参考线

plt.axhline(y = 0, color = 'r', linewidth = 2)
plt.show()
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值