系列文章目录
财政收入预测分析(灰色预测)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
财政收入预测分析
前言
本文对财政收入进行预测分析,采用灰色预测
提示:以下是本篇文章正文内容,下面案例可供参考
一、步骤
1.数据探索和预处理
1.1数据探索
#导入所有需要的库
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.svm import LinearSVR
#查看数据
data=pd.read_csv('D:/jupter notebook tmp/data.csv')
data.head()
1.2数据预处理
#计算相关系数
per=data.corr()
lasso=Lasso(1000)# 构建正则回归降维模型,参数可以从较大的开始尝试
lasso.fit(data.iloc[:,:13],data['y'])#对前13列进行正则降维
lasso.coef_#查看系数·
#筛选特征的对应的索引(系数不为0)
mask=lasso.coef_!=0
new_reg_data=data.iloc[:,:13].loc[:,mask]
2.自定义灰色预测模型
#自定义灰色预测模型
def GM21(x0):
#print('x0',x0)
x1=x0.cumsum()#对x0进行进行一次累加所得
#print('x1',x1)
z1=(x1[:len(x1)-1]+x1[1:])/2.0#z1为x1的紧邻均值生成的序列
z1=z1.reshape(len(z1),1)#将z1转换为矩阵
#print('z1',z1)
B=np.append(-z1,np.ones_like(z1),axis=1)#合并z1和形状相同的1矩阵
#print('B',B)
Yn=x0[1:].reshape(len(x0)-1,1)
#print('Yn',Yn)
[[a],[b]]=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Yn)
#np.dot矩阵点积,np.dot([1,2,3][4,,5,6])=1*4+2*5+3*6
#np.linalg.inv 矩阵求逆
f=lambda k:(x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2))
return f,a,b,x0[0]
3.创建2014和2015年数据并对其x值进行预测实验
new_reg_data.index=range(1994,2014)
new_reg_data.loc[2014]=None#创建2014年数据
new_reg_data.loc[2015]=None#创建2015年数据
#实验
f=GM21(new_reg_data.loc[range(1994,2014),'x1'].as_matrix())[0]
#as_matrix()转换为矩阵,因为我们定义的灰色预测函数需要输入矩阵类型
f(len(new_reg_data)-1)#预测2014年x1的值
4.预测2014年和2015年数据x值
col=['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
for i in col:
f=GM21(new_reg_data.loc[range(1994,2014),i].as_matrix())[0]
new_reg_data.loc[2014,i]=f(len(new_reg_data)-1)#预测2014
new_reg_data.loc[2015,i]=f(len(new_reg_data))#预测2015
new_reg_data[i] = new_reg_data[i].round(2) # 保留两位小数
new_reg_data
#添加2014年和2015年y值
y = list(data['y'].values)
y.extend([np.nan,np.nan])
new_reg_data['y']=y
5.构建回归预测模型并预测y值
data_tr=new_reg_data.loc[range(1994,2014)]#提取1994年到2013年数据作为训练集进行训练
data_mean=data_tr.mean()
data_std=data_tr.std()
data_tr=(data_tr-data_mean)/data_std#数据标准化
X_tr=data_tr[col]
y_tr=data_tr['y']
svr = LinearSVR()#模型构建
svr.fit(X_tr,y_tr)#模型训练
# 标准化处理
x = (new_reg_data[col]-data_mean[col])/data_std[col]
# 预测值还原
y_pre = svr.predict(x) * data_std['y'] + data_mean['y']
new_reg_data["y_pre"] = y_pre
6.结果可视化
import matplotlib.pyplot as plt
plt.figure(figsize=(20,8),dpi=80)
plt.plot(new_reg_data["y"],"b-o")
plt.plot(new_reg_data["y_pre"],"r-*")
plt.legend(["y","y_pre"])
plt.show()
总结
本文仅作者的观点,若有异议,欢迎评论