一、数据预处理
Lasso回归方法以缩小特征集为思想,是一种收缩估计方法。Lasso方法可以将特征的系数进行压缩并使某些回归系数变为0,可以广泛地应用于模型改进和选择。通过选择惩罚函数,借用lasso思想和方法实现特征选择地目的。
使用lasso回归方法进行关键属性选取:
import numpy as np
import pandas as pd
from sklearn.linear_model import Lasso
inputfile = 'D:/a/data.csv'
data = pd.read_csv(inputfile)
lasso = Lasso(1000)
lasso.fit(data.iloc[:,0:14],data['y'])
print('相关系数为:',np.round(lasso.coef_,5))
print('相关系数非零个数为:',np.sum(lasso.coef_!=0))
mask = lasso.coef_!=0
print('相关系数是否为零:',mask)
outputfile = 'D:/a/new_reg_data.csv'
new_reg_data = data.iloc[:, mask]
new_reg_data.to_csv(outputfile)
print('输出数据的维度为:',new_reg_data.shape)
得到各个属性的系数。可以看出利用Lasso回归方法识别影响财政收入的关键影响因素是社会从业人员、社会消费品零售总额、城镇居民人均可支配收入、城镇居民人均消费性支出、全社会固定资产投资额、地区生产总值、第一产业产值和居民消费水平。
二、模型构建——灰色预测算法
灰色预测是一种对含有不确定因素的系统进行预测的方法。在建立灰色预测模型之前,需先对原始时间序列进行数据处理,经过数据处理后的时间序列即称为生成列。
构建财政收入预测模型如下
依据Lasso回归选取的关键变量构建灰色预测模型,并预测2014年和2015年的财政收入
import sys
sys.path.append('D:/a')
import numpy as np
import pandas as pd
from GM11 import GM11
inputfile1 = 'D:/a/new_reg_data.csv'
inputfile2 = 'D:/a/data.csv'
new_reg_data = pd.read_csv(inputfile1)
data = pd.read_csv(inputfile2)
new_reg_data.index = range(1994,2014)
new_reg_data.loc[2014] = None
new_reg_data.loc[2015] = None
cols = ['x1','x4','x5','x6','x7','x8','y']
for i in cols:
f = GM11(new_reg_data.loc[range(1994,2014),i].values)[0]
new_reg_data.loc[2014,i] = f(len(new_reg_data)-1)
new_reg_data.loc[2015,i] = f(len(new_reg_data))
new_reg_data[i] = new_reg_data[i].round(2)
outputfile = 'D:/a/new_reg_data_GM11.xls'
y = list(data['y'].values)
y.extend([np.nan,np.nan])
new_reg_data['y'] = y
new_reg_data.to_excel(outputfile)
print('预测结果为:\n',new_reg_data.loc[2014:2015,:])
得到结果如下:
依据灰色预测的结果构建支持向量回归预测模型,并预测2014年和2015年的财政收入
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.svm import LinearSVR
inputfile = 'D:/a/new_reg_data_GM11.xls'
data = pd.read_excel(inputfile)
data.index = range(1993,2015)
feature = ['x1','x3','x4','x5','x6','x7','x8','x13','y']
data_train = data.loc[range(1994,2014)].copy()
data_mean = data_train.mean()
data_std = data_train.std()
data_train = (data_train - data_mean)/data_std
x_train = data_train[feature].values
y_train = data_train['y'].values
linearsvr = LinearSVR()
linearsvr.fit(x_train,y_train)
x = ((data[feature] - data_mean[feature])/data_std[feature]).values
data[u'y_pred'] = linearsvr.predict(x) * data_std['y']+data_mean['y']
outputfile = 'D:/a/new_reg_data_GM11_revenue.xls'
data.to_excel(outputfile)
print('真实值与预测值分别为:\n',data[['y','y_pred']])
fig = data[['y','y_pred']].plot(subplots = True,style=['b-o','r-*'])
plt.show()
结果分析:
得到预测结果如下: