【Python】实训8:企业所得税回归模型(Pearson相关系数、Lasso、灰色预测模型、SVR)

题目来源:
《Python数据分析与应用》第8章 财政收入预测分析 实训部分(注意:我目前看的版本此章节错误较多)
【 黄红梅、张良均主编 中国工信出版集团和人民邮电出版社】

本博客题目内容来自:QQ组合键“ctrl+alt+o”截取书本PDF文件获取的
(敲题目是不能敲题目的)(这个组合键贼好用)

数据集下载链接(下载后找到第8章->实训数据)

数据特征预览:
在这里插入图片描述

实训1 求取企业所得税各特征间的相关系数

1.训练要点
(1)掌握Python中的相关性分析方法,对每种分析方法进行比较。
(2)理解并会用Python实现企业所得税预测相关特征的相关性分析。
(3)对相关性分析结果进行解读。

2.需求说明.
对影响企业所得税的原始特征进行相关性分析,对原始特征间的相关性和原始特征与目标特征之间的相关性进行解读。

3.实现思路及步骤
(1)求取原始数据特征之间的Pearson相关系数。
(2)判断各特征之间的相关性。

1)实验源代码 :

#实训1 求取企业所得税各特征间的相关系数
import numpy as np
import pandas as pd
inputfile = './第八章 实验数据/实训数据/income_tax.csv' #读取数据文件
data = pd.read_csv(inputfile) #读取数据
#输出Pearson相关系数,并保留两位小数
print('相关系数矩阵为:','\n',np.round(data.iloc[1:,1:].corr(method = 'pearson'), 2))

2)实验结果:
在这里插入图片描述
3) 实验分析:
由结果可知,规模以上国有及国有控股工业企业亏损面(x6 )与企业所得税(y)的线性关系不显著,呈现负相关。其余特征均与财政收人呈现高度的正相关关系,但与此同时,各特征之间存在着严重的多重共线性。分析可知,选取的各特征除了x6 外,其他特征与y的相关性很强,可以用作企业所得税预测分析的关键特征,但这些特征之间存在着信息的重复,需要对特征进行进一步筛选。

实训2 选取企业所得税预测关键特征

1.训练要点
(1 )理解Lasso回归模型,掌握其适用场景及优缺点。
(2)掌握使用Lasso回归进行特征选取的方法。
(3)理解并掌握上述过程的Python 代码实现。

2.需求说明
对影响企业所得税的因素进行特征筛选,选取出对企业所得税有关键影响的特征,为
下一步的模型构建奠定基础。

3.实现思路及步骤
(1)建立Lasso回归模型。
(2)对Lasso回归结果进行解读。

1)实验源代码 :

#实训2 选取企业所得税预测关键特征
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
inputfile = './第八章 实验数据/实训数据/income_tax.csv' #输入的数据文件
data = pd.read_csv(inputfile) #读取数据
lasso = Lasso(1000,random_state=6666)  #调用Lasso()函数,设置λ的值为1000
lasso.fit(data.iloc[:,1:11],data['y'])  #本题中第一列为年份,应该排除
print('相关系数为:',np.round(lasso.coef_,5))  #输出结果,保留五位小数

#计算相关系数非零的个数
print('相关系数大于零个数为:',np.sum(lasso.coef_ >0))


mask = lasso.coef_ > 0  #返回一个相关系数大于零的布尔数组
print('相关系数是否大于零:',mask)#这时输出的mask为对应特征是否保留的布尔值
mask=np.insert(mask,0,[False]) #第一列为年份,在读入新表格的时候要排除

outputfile = './tmp/new_income_tax.csv'  #输出数据文件
new_income_tax = data.iloc[:, mask]  #返回相关系数大于零的数据
new_income_tax.to_csv(outputfile)  #存储数据
print('输出数据的维度为:',new_income_tax.shape)  #查看输出数据的维度

2)实验结果:
在这里插入图片描述
输出的new_income_tax.csv表格:
在这里插入图片描述
3) 实验分析:
分析实验结果可知,利用Lasso回归方法可知,相关系数大于零的个数为6个,即为影响企业所得税的关键因素,分别是第二产业增加值(x1)、全社会固定资产投资额(x3)、城市商品零售价格指数(x4)、 建筑业企业利润总额(x5)、限额以上连锁店(公司)零售额(x9)、地方财政总收入(x10)。

实训3 构建企业所得税预测模型

1.训练要点
(1)了解灰色预测模型,掌握其适用场景及优缺点。
(2)了解支持向量回归预测的由来,掌握其使用方法。
(3 )理解并掌握回归预测模型评价指标。
(4)掌握此过程中所有的Python代码实现。

2.需求说明
在对影响企业所得税的因素进行特征选取的基础上,建立单个特征的灰色预测模型和
支持向量回归预测模型,对2014年及2015年的企业所得税进行预测,并对模型进行评价。(题目有误)

3.实现思路及步骤
(1)使用灰色预测模型对各特征在2014年及2015年的值进行预测。
(2)建立支持向量回归预测模型。
(3)对上述建立的企业所得税预测模型进行评价。

1)实验源代码 :

#实训3:构建企业所得税预测模型
import numpy as np
import pandas as pd
from GM11 import GM11 #引入自编的灰色预测函数  GM11相关源代码请放到当前代码同级目录中
inputfile = './tmp/new_income_tax.csv' #输入的数据文件 在上一个实验中保存到了同级目录tmp中
inputfile1 = './第八章 实验数据/实训数据/income_tax.csv' #输入的原数据文件 
new_income_tax = pd.read_csv(inputfile) # 读取经过特征选择后的数据
data = pd.read_csv(inputfile1) #读取总的数据
#new_income_tax.index = data.loc[:,'year']
new_income_tax.index = range(2004, 2016)
new_income_tax.loc[2016] = None
new_income_tax.loc[2017] = None
l = ['x1', 'x3', 'x4', 'x5', 'x9','x10']
for i in l:
  f = GM11(new_income_tax.loc[range(2004, 2016),i].as_matrix())[0]
  new_income_tax.loc[2016,i] = f(len(new_income_tax)-1)#2016年预测结果
  new_income_tax.loc[2017,i] = f(len(new_income_tax)) ##2017年预测结果
  new_income_tax[i] = new_income_tax[i].round(2) ## 保留两位小数
outputfile = './tmp/new_income_tax_GM11.xls' ## 灰色预测后保存的路径
y = list(data['y'].values) #提取企业所得税入列,合并至新数据框中
y.extend([np.nan,np.nan])
new_income_tax['y'] = y
new_income_tax.to_excel(outputfile) #结果输出
print('预测结果为:','\n',new_income_tax.loc[2016:2017,:]) ##预测结果展示


import pandas as pd
import numpy as np
from sklearn.svm import LinearSVR
import matplotlib.pyplot as plt
from sklearn.metrics import explained_variance_score,\
mean_absolute_error,mean_squared_error,\
median_absolute_error,r2_score
inputfile = './tmp/new_income_tax_GM11.xls' #灰色预测后保存的路径
data = pd.read_excel(inputfile) #读取数据
feature = ['x1', 'x3', 'x4', 'x5', 'x9','x10'] 
#data_train = data.loc[range(2004,2014)].copy()#取2014年前的数据建模,运行有错
data_train = data.loc[0:11,:] #data.iloc[0:12,:] 此行语句类似上行功能
data_mean = data_train.mean()
data_std = data_train.std()
data_train = (data_train - data_mean)/data_std #数据标准化
x_train = data_train[feature].as_matrix() #特征数据
y_train = data_train['y'].as_matrix() #标签数据
linearsvr = LinearSVR()   #调用LinearSVR()函数
linearsvr.fit(x_train,y_train)
x = ((data[feature] - data_mean[feature])/ data_std[feature]).as_matrix()  #预测,并还原结果。
data[u'y_pred'] = linearsvr.predict(x) * data_std['y'] + data_mean['y']
## SVR预测后保存的结果
outputfile = './tmp/new_income_tax_GM11_final.xls'
data.to_excel(outputfile)
print('真实值与预测值分别为:','\n',data[['y','y_pred']])

#绘制图形
x=np.arange(2004,2018)
#plt.xlim((2004,2018))
#x1=np.arange(2004,2016)
#x2=np.arange(2004,2018)
p=plt.figure()
p.add_subplot(2,1,1)
plt.plot(x,data['y'],'ro-')
p.add_subplot(2,1,2)
plt.plot(x,data['y_pred'],'bo-')
#print('预测图为:',data[['y','y_pred']].plot(subplots = True,
#      style=['b-o','r-*'],xticks=[np.arange(1993,2016),np.arange(1993,2016)]))

#附加实验:回归模型评价
print('企业所得税回归模型的平均绝对误差为:',
      mean_absolute_error(data.loc[0:11,'y'],data.loc[0:11,'y_pred']))
print('企业所得税回归模型的均方误差为:',
     mean_squared_error(data.loc[0:11,'y'],data.loc[0:11,'y_pred']))
print('企业所得税回归模型的中值绝对误差为:',
     median_absolute_error(data.loc[0:11,'y'],data.loc[0:11,'y_pred']))
print('企业所得税回归模型的可解释方差值为:',
     explained_variance_score(data.loc[0:11,'y'],data.loc[0:11,'y_pred']))
print('企业所得税回归模型的R方值为:',
     r2_score(data.loc[0:11,'y'],data.loc[0:11,'y_pred']))

2)实验结果:
在这里插入图片描述
在这里插入图片描述
3) 实验分析:
通过模型评估实验结果可知,平均绝对误差与中值绝对误差较小,可解释方差值与R2值十分接近1,表明建立的支持向量回归模型拟合效果优良,可以用于预测企业所得税。

附加代码:自定义灰色预测函数(GM11.py)

当然,此代码可从上面的链接中获取到(就是要找一找)

def GM11(x0): #自定义灰色预测函数
  import numpy as np
  x1 = x0.cumsum() #1-AGO序列
  z1 = (x1[:len(x1)-1] + x1[1:])/2.0 #紧邻均值(MEAN)生成序列
  z1 = z1.reshape((len(z1),1))
  B = np.append(-z1, np.ones_like(z1), axis = 1)
  Yn = x0[1:].reshape((len(x0)-1, 1))
  [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) #计算参数
  f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) #还原值
  delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))
  C = delta.std()/x0.std()
  P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
  return f, a, b, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率
发布了86 篇原创文章 · 获赞 83 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41856733/article/details/103579819