• 影响因素模型有哪些
千次阅读
2019-10-07 12:18:47

# 1. 背景与挖掘目标

• 项目为《Python 数据分析与挖掘实战》第 13 章：财政收入影响因素分析及预测模型，内容参考了书中源代码及 u012063773 的博客
• 挖掘目标为分析地方财政收入的关键特征，筛选特征进行分析建模，然后对财政收入进行预测

# 2. 分析方法与过程

## 2.1 数据探索

1. 主要变量描述性分析：可以看出 y 的波动很大
'''原始数据概括性度量'''
import numpy as np
import pandas as pd

inputfile = 'chapter13/demo/data/data1.csv'
r = [data.min(), data.max(), data.mean(), data.std()]
r = pd.DataFrame(r, index=['Min', 'Max', 'Mean', 'STD']).T
r = np.round(r, 2)    # 保留两位小数
r

MinMaxMeanSTD
x13831732.007599295.005579519.951262194.72
x2181.542110.78765.04595.70
x3448.196882.852370.831919.17
x47571.0042049.1419644.6910203.02
x56212.7033156.8315870.958199.77
x66370241.008323096.007350513.60621341.85
x7525.714454.551712.241184.71
x8985.3115420.145705.804478.40
x960.62228.46129.4950.51
x1065.66852.56340.22251.58
x1197.50120.00103.315.51
x121.031.911.420.25
x135321.0041972.0017273.8011109.19
y64.872088.14618.08609.25
1. 原始数据相关性分析：可以看出 x11 与 y 相关性不大，且为负相关
'''原始数据求解 Pearson 相关系数'''
pear = np.round(data.corr(method = 'pearson'), 2)
pear

x1x2x3x4x5x6x7x8x9x10x11x12x13y
x11.000.950.950.970.970.990.950.970.980.98-0.290.940.960.94
x20.951.001.000.990.990.920.990.990.980.98-0.130.891.000.98
x30.951.001.000.990.990.921.000.990.980.99-0.150.891.000.99
x40.970.990.991.001.000.950.991.000.991.00-0.190.911.000.99
x50.970.990.991.001.000.950.991.000.991.00-0.180.900.990.99
x60.990.920.920.950.951.000.930.950.970.96-0.340.950.940.91
x70.950.991.000.990.990.931.000.990.980.99-0.150.891.000.99
x80.970.990.991.001.000.950.991.000.991.00-0.150.901.000.99
x90.980.980.980.990.990.970.980.991.000.99-0.230.910.990.98
x100.980.980.991.001.000.960.991.000.991.00-0.170.900.990.99
x11-0.29-0.13-0.15-0.19-0.18-0.34-0.15-0.15-0.23-0.171.00-0.43-0.16-0.12
x120.940.890.890.910.900.950.890.900.910.90-0.431.000.900.87
x130.961.001.001.000.990.941.001.000.990.99-0.160.901.000.99
y0.940.980.990.990.990.910.990.990.980.99-0.120.870.991.00

## 2.2 模型构建

1. Lasso 变量选择模型（备注：书中使用的是 Adaptive-Lasso 变量选择，这个函数多处查找都没找到，因此直接使用 Lasso，得到的结果和书中略有不同，后面保留的变量暂时以书中的为准）

'''Lasson 变量选择'''
from sklearn.linear_model import Lasso
model = Lasso(alpha=0.1, max_iter=100000)
model.fit(data.iloc[:, 0:13], data['y'])
print(model.coef_)

[-3.88351082e-04 -5.85234238e-01  4.38483025e-01 -1.25563758e-01
1.74517446e-01  8.19661325e-04  2.67660850e-01  2.89486267e-02
-7.55994563e+00 -8.62534215e-02  3.37878229e+00  0.00000000e+00
-7.70629587e-03]


2. 财政收入及各类别收入预测模型：各类别收入预测方法一样，因此以财政收入为例，描述灰色模型的计算过程，然后建立灰色预测与神经网络的组合预测模型，参数设置为误差精度10^-7，学习次数 10000 次，神经元个数为 6 个

• 灰色预测原理

灰色预测对原始数据进行生成处理如累加，生成有较强规律性的数据序列，然后建立相应的微分方程模型，从而预测事物未来发展趋势的状况。

设变量 X ( 0 ) = { X ( 0 ) ( i ) , i = 1 , 2 … n } X^{(0)} = \{X^{(0)}(i), i=1,2\dots n\} 为一非负单调原始数据数列，对 X ( 0 ) X^{(0)} 进行 1 次累加得到 X ( 1 ) = { X ( 1 ) ( k ) , k = 1 , 2 … n } X^{(1)} = \{X^{(1)}(k), k=1,2\dots n\} ，对 X ( 1 ) X^{(1)} 建立一阶线性微分方程，其中 a , u a, u 为常数：
d X ( 1 ) d t + a X ( 1 ) = u \frac{dX^{(1)}}{dt} + aX^{(1)} = u
求解微分方程，得到
X ( 1 ) ( t ) = [ ∫ e ∫ a ⋅ d x ⋅ u ⋅ d x + C ] ⋅ ∫ e ∫ − a ⋅ d x … … … … … … （1） X^{(1)}(t) = [\int e^{\int a\cdot dx} \cdot u \cdot dx+ C] \cdot \int e^{\int -a\cdot dx}\text {………………（1）}
⟹    X ( 1 ) ( t ) = ( u a ⋅ e a t + C ) ⋅ e − a t … … … … … … （2） \implies X^{(1)}(t) = (\frac {u}{a} \cdot e^{at} + C) \cdot e^{-at}\text {………………（2）}
X ( 1 ) ( t 0 ) X^{(1)}(t_0) 代入（2），求解 C C ，得到：
C = ( X ( 1 ) ( t 0 ) − u a ) ⋅ e − a t 0 … … … … … … （3） C = (X^{(1)}(t_0) - \frac{u}{a}) \cdot e^{-at_0}\text {………………（3）}
将（3）代入（2），得到：
X ( 1 ) ( t ) = [ X ( 1 ) ( t 0 ) − u a ] ⋅ e − a ( t − t 0 ) + u a … … … … … … （4） X^{(1)}(t) = [X^{(1)}(t_0) - \frac{u}{a}]\cdot e^{-a(t-t_0)} + \frac{u}{a}\text {………………（4）}
对于离散值：
X ( 1 ) ( k + 1 ) = [ X ( 1 ) ( 1 ) − u a ] ⋅ e − a k + u a … … … … … … （5） X^{(1)}(k+1) = [X^{(1)}(1) - \frac{u}{a}]\cdot e^{-ak} + \frac{u}{a}\text {………………（5）}
灰色预测中对于 a , u a, u 的求解使用的是最小二乘法。由于：
X ( 1 ) ( k ) − X ( 1 ) ( k − 1 ) = Δ X ( 1 ) ( k ) Δ k = X ( 0 ) ( k ) , Δ k = 1 … … … … … … （6） X^{(1)}(k) - X^{(1)}(k-1) = \frac{\Delta X^{(1)}(k)}{\Delta k} = X^{(0)}(k), \Delta k = 1\text {………………（6）}
将（6） 代入微分方程，得到：
X ( 0 ) ( k ) = − a X ( 1 ) ( k ) + u … … … … … … （7） X^{(0)}(k) = -aX^{(1)}(k)+u \text {………………（7）}
由于 Δ X ( 1 ) ( k ) Δ k \frac{\Delta X^{(1)}(k)}{\Delta k} 涉及 X ( 1 ) ( k ) X^{(1)}(k) 两个时刻的值，因此将（7）中的 X ( 1 ) ( k ) X^{(1)}(k) 换为两个时刻的均值更为合理，得到：
Y = B U Y = BU
即：
[ X ( 0 ) ( 2 ) X ( 0 ) ( 3 ) ⋮ X ( 0 ) ( N ) ] = [ − 1 2 ( X ( 1 ) ( 2 ) + X ( 1 ) ( 1 ) ) 1 − 1 2 ( X ( 1 ) ( 3 ) + X ( 1 ) ( 2 ) ) 1 ⋮ ⋮ − 1 2 ( X ( 1 ) ( N ) + X ( 1 ) ( N − 1 ) ) 1 ] [ a u ] … … … … … … （8） \begin{bmatrix} X^{(0)}(2)\\ X^{(0)}(3)\\ \vdots\\ X^{(0)}(N)\\ \end{bmatrix} = \begin{bmatrix} -\frac{1}{2}(X^{(1)}(2) + X^{(1)}(1)) & 1 \\ -\frac{1}{2}(X^{(1)}(3) + X^{(1)}(2)) & 1 \\ \vdots & \vdots \\ -\frac{1}{2}(X^{(1)}(N) + X^{(1)}(N-1)) & 1 \\ \end{bmatrix} \begin{bmatrix} a \\ u \\ \end{bmatrix}\text {………………（8）}
由最小二乘法，得到：
U ^ = [ a ^ u ^ ] = ( B T B ) − 1 B T Y … … … … … … （9） \hat{U} = \begin{bmatrix} \hat{a} \\ \hat{u} \\ \end{bmatrix} = (B^TB)^{-1}B^TY\text {………………（9）}
将（9）代入（5），得到：
X ( 1 ) ( k + 1 ) = [ X ( 1 ) ( 1 ) − u ^ a ^ ] ⋅ e − a ^ k + u ^ a ^ … … … … … … （10） X^{(1)}(k+1) = [X^{(1)}(1) - \frac{\hat{u}}{\hat{a}}]\cdot e^{-\hat{a}k} + \frac{\hat u}{\hat a}\text {………………（10）}
将（10）代入（6）：
X ( 0 ) ( k + 1 ) = ( 1 − e a ^ ) [ X ( 0 ) ( 1 ) − u ^ a ^ ] e − a ^ k … … … … … … （11） X^{(0)}(k+1) = (1-e^{\hat{a}})[X^{(0)}(1) - \frac{\hat{u}}{\hat{a}}]e^{-\hat{a}k}\text {………………（11）}

'''灰色预测函数'''
def GM11(x0): #自定义灰色预测函数
import numpy as np
x1 = x0.cumsum() # 生成累加序列
z1 = (x1[:len(x1)-1] + x1[1:])/2.0 # 生成紧邻均值（MEAN）序列，比直接使用累加序列好，共 n-1 个值
z1 = z1.reshape((len(z1),1))
B = np.append(-z1, np.ones_like(z1), axis = 1)    # 生成 B 矩阵
Y = x0[1:].reshape((len(x0)-1, 1))    # Y 矩阵
[[a],[u]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)    #计算参数
f = lambda k: (x0[0]-u/a)*np.exp(-a*(k-1))-(x0[0]-u/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, u, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率

'''地方财政收入灰色预测'''
import numpy as np
import pandas as pd

inputfile = 'chapter13/demo/data/data1.csv'
outputfile = 'chapter13/demo/tmp2/data1_GM11.xls'
modelfile = 'chapter13/demo/tmp2/net.model'

x1x2x3x4x5x6x7x8x9x10x11x12x13y
03831732181.54448.197571.006212.706370241525.71985.3160.6265.66120.01.029532164.87
13913824214.63549.979038.167601.736467115618.251259.2073.4695.46113.51.051652999.75
23928907239.56686.449905.318092.826560508638.941468.0681.1681.16108.21.064700888.11
34282130261.58802.5910444.608767.986664862656.581678.1285.7291.70102.21.0927694106.07
44453911283.14904.5711255.709422.336741400758.831893.5288.88114.6197.71.2008027137.32
data.index = range(1994, 2014)
data.loc[2014] = None
data.loc[2015] = None

# 模型精度评价
l = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']
for i in l:
GM = GM11(data[i][list(range(1994, 2014))].values)
f = GM[0]
c = GM[-2]
p = GM[-1]
data[i][2014] = f(len(data)-1)
data[i][2015] = f(len(data))
data[i] = data[i].round(2)
if (c < 0.35) & (p > 0.95):
print('对于模型{}，该模型精度为---好'.format(i))
elif (c < 0.5) & (p > 0.8):
print('对于模型{}，该模型精度为---合格'.format(i))
elif (c < 0.65) & (p > 0.7):
print('对于模型{}，该模型精度为---勉强合格'.format(i))
else:
print('对于模型{}，该模型精度为---不合格'.format(i))

data[l+['y']].to_excel(outputfile, )

对于模型x1，该模型精度为---好
对于模型x2，该模型精度为---好
对于模型x3，该模型精度为---好
对于模型x4，该模型精度为---好
对于模型x5，该模型精度为---好
对于模型x7，该模型精度为---好

'''神经网络'''
inputfile2 = outputfile
outputfile2 = 'chapter13/demo/tmp2/revenue.xls'
modelfile = 'chapter13/demo/tmp2/1-net.model'

# 提取数据
feature = list(data2.columns[:len(data2.columns)-1])
train = data2.loc[list(range(1994, 2014))].copy()
mean = train.mean()
std = train.std()
train = (train - mean) / std    # 数据标准化，这里使用标准差标准化
x_train = train[feature].values
y_train = train['y'].values

# 建立神经网络模型
from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()
model.fit(x_train, y_train, epochs=10000, batch_size=16)
model.save_weights(modelfile2)


## 2.3 数据预测

• 从结果可以看到，1994～2013 预测值和实际值几乎重合，因此数据预测可信度较高
# 预测，并还原结果
x = ((data2[feature] - mean[feature]) / std[feature]).values
data2['y_pred'] = model.predict(x) * std['y'] + mean['y']
data2.to_excel(outputfile2)

import matplotlib.pyplot as plt
%matplotlib notebook
p = data2[['y', 'y_pred']].plot(style=['b-o', 'r-*'])
p.set_ylim(0, 2500)
p.set_xlim(1993, 2016)
plt.show()


源代码及数据文件参考：https://github.com/Raymone23/Data-Mining

更多相关内容

# 案例背景

• 在我国现行的分税制财政管理体制下，地方财政收人不仅是国家财政收入的重要组成部分，而且具有其相对独立的构成内容。如何有效的利用地方财政收入，合理的分配，来促进地方的发展，提高市民的收入和生活质量是每个地方政府需要考虑的首要问题。因此，对地方财政收人进行预测，不仅是必要的，而且也是可能的。科学、合理地预测地方财政收人，对于克服年度地方预算收支规模确定的随意性和盲目性，正确处理地方财政与经济的相互关系具有十分重要的意义。
• 某市作为改革开放的前沿城市，其经济发展在全国经济中的地位举足轻重。目前，该市在财政收入规模、结构等方面与北京、上海、深圳等城市仍有一定差距，存在不断完善的空间。本案例旨在通过研究，发现影响该市目前以及未来地方财源建设的因素，并对其进行深入分析，提出对该市地方财源优化的具体建议，供政府决策参考，同时为其他经济发展较快的城市提供借鉴。

# 原始数据情况

考虑到数据的可得性，本案例所用的财政收入分为地方一般预算收入和政府性基金收入。地方一般预算收入包括：(1)税收收入，主要包括企业所得税和地方所得税中中央和地方共享的40%，地方享有的 25%的增值税、营业税、印花税等；(2)非税收入，包括专项收入、行政事业性收费、罚没收入、国有资本经营收入和其他收入等。政府性基金收入是国家通过向社会征收以及出让土地、发行彩票等方式取得收入，并专项用于支持特定基础设施建设和社会事业发展的收入。

由于1994年我国对财政体制进行了重大改革，开始实行分税制财政体制，影响了财政收入相关数据的连续性，在1994年前后不具有可比性。由于没有合适的数学手段来调整这种数据的跃变，仅对1994年及其以后的数据进行分析，本案例所用数据均来自《某市统计年鉴》(1995-2014)。

某市1994-2013年财政收入以及相关因素的数据

# 挖掘目标

1. 梳理影响地方财政收入的关键特征，分析、识别影响地方财政收入的关键特征的选择模型；
2. 结合目标1的因素分析，对某市2015年的财政总收入及各个类别收入进行预测。

# 初步分析

• 在以往的文献中，对影响财政收入的因素的分析中大多使用普通最小二乘法来对回归模型的系数进行估计，预测变量的选取则采用的是逐步回归。然而，无论是最小二乘法还是逐步回归，都有其不足之处。它们一般都局限于局部最优解而不是全局最优解。

# 总体流程

 1)	从某市统计局网站以及各统计年鉴搜集到该市财政收入以及各类别收入相关数据；

3)	在2）的基础上建立单变量的灰色预测模型以及人工神经网络预测模型；

4)	利用3）的预测值代入构建好的人工神经网络模型中，从而得到2014/2015年某市财政收入以及各类别收入的预测值。


# 数据探索分析

影响财政收入(y)的因素有很多，通过经济理论对财政收入的解释以及对实践的观察，考虑一些与能源消耗关系密切并且直观上有线性关系的因素，选取以下因素为自变量，分析它们之间的关系。

• 社会从业人数(x1)：就业人数的上升伴随着居民消费水平的提高，从而间接影响财政收入的增加。
• 在岗职工工资总额(x2)：反映的是社会分配情况，主要影响财政收入中的个人所得税、房产税以及潜在消费能力。
• 社会消费品零售总额(x3)：代表社会整体消费情况，是可支配收入在经济生活中的实现。当社会消费品零售总额增长时，表明社会消费意愿强烈，部分程度上会导致财政收入中增值税的增长；同时当消费增长时，也会引起经济系统中其他方面发生变动，最终导致财政收入的增长。
• 城镇居民人均可支配收入(x4)：居民收入越高消费能力越强，同时意味着其工作积极性越高，创造出的财富越多，从而能带来财政收入的更快和持续增长。
• 城镇居民人均消费性支出(x5)：居民在消费商品的过程中会产生各种税费，税费又是调节生产规模的手段之一。在商品经济发达的如今，居民消费的越多，对财政收入的贡献就越大。
• 年末总人口(x6)：在地方经济发展水平既定的条件下，人均地方财政收入与地方人口数呈反比例变化。
• 全社会固定资产投资额(x7)：是建造和购置固定资产的经济活动，即固定资产再生产活动。主要通过投资来促进经济增长，扩大税源，进而拉动财政税收收入整体增长。
• 地区生产总值(x8)：表示地方经济发展水平。一般来讲，政府财政收入来源于即期的地区生产总值。在国家经济政策不变、社会秩序稳定的情况下，地方经济发展水平与地方财政收入之间存在着密切的相关性，越是经济发达的地区，其财政收入的规模就越大。
• 第一产业产值(x9)：取消农业税、实施三农政策，第一产业对财政收入的影响更小。
• 税收(x10)：由于其具有征收的强制性、无偿性和固定性特点，可以为政府履行其职能提供充足的资金来源。因此，各国都将其作为政府财政收入的最重要的收入形式和来源。
• 居民消费价格指数(x11)：反映居民家庭购买的消费品及服务价格水平的变动情况，影响城乡居民的生活支出和国家的财政收入。
• 第三产业与第二产业产值比(x12)：表示产业结构。三次产业生产总值代表国民经济水平，是财政收入的主要影响因素，当产业结构逐步优化时，财政收入也会随之增加。
• 居民消费水平(x13)：在很大程度上受整体经济状况GDP的影响，从而间接影响地方财政收入。

## 描述分析

#-*- coding: utf-8 -*-
import numpy as np
import pandas as pd
inputfile = '../data/data1.csv' #输入的数据文件
r = [data.min(), data.max(), data.mean(), data.std()] #依次计算最小值、最大值、均值、标准差
r = pd.DataFrame(r, index = ['Min', 'Max', 'Mean', 'STD']).T  #计算相关系数矩阵
np.round(r, 2) #保留两位小数


对已有数据进行描述性统计分析，获得对数据的整体性认识。

可见财政收入（y）的均值和标准差分别为618.08和609.25，这说明:第一，某市各年份财政收入存在较大差异。第二，2008年后，某市各年份财政收入大幅上升。

## 相关分析

相关系数可以用来描述定量变量之间的关系，初步判断因变量与解释变量之间是否具有线性相关性。

#-*- coding: utf-8 -*-
import numpy as np
import pandas as pd
inputfile = '../data/data1.csv' #输入的数据文件
np.round(data.corr(method = 'pearson'), 2) #计算相关系数矩阵，保留两位小数


由相关矩阵可以看出居民消费价格指数(x11) 与财政收入的线性关系不显著，而且呈现负相关。其余变量均与财政收入呈现高度的正相关关系。

## 变量选择

#-*- coding: utf-8 -*-
import pandas as pd
inputfile = '../data/data1.csv' #输入的数据文件

model.fit(data.iloc[:,0:13],data['y'])
model.coef_ #各个特征的系数


## 财政收入及各类别收入预测模型:

某市财政收入预测模型

#-*- coding: utf-8 -*-

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、首项、方差比、小残差概率

#-*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from GM11 import GM11 #引入自己编写的灰色预测函数

inputfile = '../data/data1.csv' #输入的数据文件
outputfile = '../tmp/data1_GM11.xls' #灰色预测后保存的路径
data.index = range(1994, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']
for i in l:
f = GM11(data[i][range(1994, 2014)].as_matrix())[0]
data[i][2014] = f(len(data)-1) #2014年预测结果
data[i][2015] = f(len(data)) #2015年预测结果
data[i] = data[i].round(2) #保留两位小数

data[l+['y']].to_excel(outputfile) #结果输出


将数据零均值标准化后，代入地方财政收入所建立的三层神经网络预测模型（输入层6节点，隐藏层12节点，输出层1节点），得到某市财政收入2015年的预测值为2366.42亿元。

#-*- coding: utf-8 -*-
import pandas as pd
inputfile = '../tmp/data1_GM11.xls' #灰色预测后保存的路径
outputfile = '../data/revenue.xls' #神经网络预测后保存的结果
modelfile = '../tmp/1-net.model' #模型保存路径
feature = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7'] #特征所在列

data_train = data.loc[range(1994,2014)].copy() #取2014年前的数据建模
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() #标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential() #建立模型
model.fit(x_train, y_train, nb_epoch = 10000, batch_size = 16) #训练模型，学习一万次
model.save_weights(modelfile) #保存模型参数

#预测，并还原结果。
x = ((data[feature] - data_mean[feature])/data_std[feature]).as_matrix()
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data.to_excel(outputfile)

import matplotlib.pyplot as plt #画出预测结果图
p = data[['y','y_pred']].plot(subplots = True, style=['b-o','r-*'])
plt.show()

  同时得到地方财政收入真实值与预测值对比图。


其它类别的收入分析过程也是一样的，这里就不一 一实现了

展开全文
• 财政收入影响因素分析及预测模型

# 财政收入影响因素分析及预测模型

## 背景

在我国现行的分税制财政管理体制下，地方财政收入不仅是国家财政收入的重要组成部分，还具有其相对独立的构成内容。如何有效地利用地方财政收入，合理地分配来促进地方的发展，提高市民的收入和生活质量是每个地方政府需要考虑的首要问题。因此，对地方财政收入进行预测，不但是必要的，而且是可能的。科学、合理地预测地方财政收入，对于克服年度地方预算收支规模的随意性和盲目性，正确处理地方财政与经济的相互关系具有十分重要的意义。某市作为改革开放的前沿城市，其经济发展在全国经济中的地位举足轻重。目前，该市在财政收入规模、结构等方面与北京、深圳和上海等城市仍有一定差距，存在不断完善的空间。

## 目标

本案例旨在通过研究，发现影响该市目前以及未来地方财源建设的因素，并对其进行深入分析，提出对该市地方财源优化的具体建议，供政府决策参考，同时为其他经济发展较快的城市提供借鉴。

考虑到数据的可得性，本案例所用的财政收入分为地方一般预算收入和政府性基金收入。

地方一般预算收入包括：1.税收收入，主要包括企业所得税和地方所得税中中央和地方共享的40%，地方享有的25%的增值税、营业税和印花税等；2.非税收入，包括专项收入、行政事业费收入、罚没收入、国有资本经营收入和其他收入等。政府性基金收入是国家通过向社会征收以及出让土地、发行彩票等方式取得的收入，并专项用于支持特定基础设施建设和社会事业发展的收入。由于1994年财政体制重大改革，所以1994年前后不具有可比性，仅对1994年后的进行分析，本案例数据来自《某市统计年鉴》（1995-2014）

## 挖掘目标

梳理影响地方财政收入的关键特征，分析、识别影响地方财政收入的关键特征的选择模型。结合目标1的因素分析，对某市2015年的财政总收入及各个类别收入进行预测。

## 分析

在以往的文献中，对影响财政收入的因素的分析大多采用普通最小二乘法来对回归模型的系数进行估计，预测变量的选取采用的则是逐步回归。然而，不论是最小二乘法还是逐步回归，都有其不足之处。它们一般都局限于局部最优解而不是全局最优解。如果预测变量过多，子集选择的计算过程具有不可实行性，且子集选择具有内在的不连续性，从而导致子集选择极度多变。

下面是基于数据挖掘技术的财政收入分析预测模型流程

1. 从某市统计局网站以及各统计年鉴搜集到该市财政收入以及各类别收入相关数据。
3. 在步骤2）的基础上建立单变量的灰色预测模型以及人工神经网络预测模型。
4. 利用步骤3）的预测值代入构建好的人工神经网络模型中，从而得到2014/2015年某市财政收入及各个类别的收入。

## 处理过程

• 数据获取
• 已提供。
• 数据探索
• 描述分析
• 相关分析
• 数据预处理
• 处理好的数据给出了。
• 数据挖掘建模
• 财政收入及各类别收入预测模型
• 某市财政收入预测模型
• 真实值与预测值对比
• 增值税预测模型
• 真实值与预测值对比
• 营业税预测模型
• 真实值与预测值对比
• 企业所得税预测模型
• 真实值与预测值对比
• 个人所得税预测模型
• 真实值与预测值对比
• 政府性基金收入预测模型
• 真实值与预测值对比

## 代码

import pandas as pd
import numpy as np
from GM11 import GM11

'''
:return:
'''
inputfile = 'data/data1.csv'
from sklearn.linear_model import LassoLars
model = LassoLars()
model.fit(data.iloc[:, 0:13], data['y'])
print(model.coef_)

def huise():
'''
地方财政收入灰色预测
:return:
'''
inputfile = 'data/data1.csv'
outputfile = 'data/data1_GM11.xls'
data.index = range(1994, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']
for i in l:
f = GM11(data[i][np.arange(1994, 2014)].values)[0]
# 2014年预测结果
data[i][2014] = f(len(data) - 1)
# 2015年预测结果
data[i][2015] = f(len(data))
data[i] = data[i].round(2)

data[l + ['y']].to_excel(outputfile)
print(data)

def yuce():
'''
地方财政收入神经网络预测模型
:return:
'''
inputfile = 'data/data1_GM11.xls'  # 灰色预测后保存的路径
outputfile = 'data/revenue.xls'  # 神经网络预测后保存的结果
modelfile = 'data/1-net.model'  # 模型保存路径
feature = ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']  # 特征所在列

data_train = data.loc[range(1994, 2014)].copy()  # 取2014年前的数据建模
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  # 标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()  # 建立模型
model.fit(x_train, y_train, nb_epoch=10000, batch_size=16)  # 训练模型，学习一万次
model.save_weights(modelfile)  # 保存模型参数

# 预测，并还原结果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).values
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data.to_excel(outputfile)

import matplotlib.pyplot as plt  # 画出预测结果图
p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])
plt.show()

'''
:return:
'''

inputfile = 'data/data2.csv'  # 输入的数据文件
model.fit(data.iloc[:, 0:6], data['y'])
model.coef_  # 各个特征的系数

def huise2():
'''
增值税灰色预测
:return:
'''
inputfile = 'data/data2.csv'  # 输入的数据文件
outputfile = 'data/data2_GM11.xls'  # 灰色预测后保存的路径
data.index = range(1999, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x3', 'x5']
for i in l:
f = GM11(data[i][np.arange(1999, 2014)].values)[0]
data[i][2014] = f(len(data) - 1)  # 2014年预测结果
data[i][2015] = f(len(data))  # 2015年预测结果
data[i] = data[i].round(6)  # 保留六位小数
data[l + ['y']].to_excel(outputfile)  # 结果输出
print(data)

def yuce2():
'''
增值税神经网络预测模型
:return:
'''
inputfile = 'data/data2_GM11.xls'  # 灰色预测后保存的路径
outputfile = 'data/VAT.xls'  # 神经网络预测后保存的结果
modelfile = 'data/2-net.model'  # 模型保存路径
feature = ['x1', 'x3', 'x5']  # 特征所在列

data_train = data.loc[np.arange(1999, 2014)].copy()  # 取2014年前的数据建模
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  # 标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()  # 建立模型
model.fit(x_train, y_train, nb_epoch=10000, batch_size=16)  # 训练模型，学习一万次
model.save_weights(modelfile)  # 保存模型参数

# 预测，并还原结果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).values
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data[u'y_pred'] = data[u'y_pred'].round(2)
data.to_excel(outputfile)

import matplotlib.pyplot as plt  # 画出预测结果图
p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])
plt.show()

'''
:return:
'''
inputfile = 'data/data3.csv'  # 输入的数据文件

model.fit(data.iloc[:, 0:10], data['y'])
model.coef_  # 各个特征的系数

def huise3():
'''
营业税灰色预测
:return:
'''
inputfile = 'data/data3.csv'  # 输入的数据文件
outputfile = 'data/data3_GM11.xls'  # 灰色预测后保存的路径
data.index = range(1999, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x3', 'x4', 'x6', 'x8']
for i in l:
f = GM11(data[i][np.arange(1999, 2014)].values)[0]
data[i][2014] = f(len(data) - 1)  # 2014年预测结果
data[i][2015] = f(len(data))  # 2015年预测结果
data[i] = data[i].round()  # 取整

data[l + ['y']].to_excel(outputfile)  # 结果输出
print(data)

def yuce3():
'''
营业税神经网络预测模型
:return:
'''
inputfile = 'data/data3_GM11.xls'  # 灰色预测后保存的路径
outputfile = 'data/sales_tax.xls'  # 神经网络预测后保存的结果
modelfile = 'data/3-net.model'  # 模型保存路径
feature = ['x3', 'x4', 'x6', 'x8']  # 特征所在列

data_train = data.loc[range(1999, 2014)].copy()  # 取2014年前的数据建模
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  # 标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()  # 建立模型
model.fit(x_train, y_train, nb_epoch=10000, batch_size=16)  # 训练模型，学习一万次
model.save_weights(modelfile)  # 保存模型参数

# 预测，并还原结果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).values
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data[u'y_pred'] = data[u'y_pred'].round(2)
data.to_excel(outputfile)

import matplotlib.pyplot as plt  # 画出预测结果图
p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])
plt.show()

'''
:return:
'''
inputfile = 'data/data4.csv'  # 输入的数据文件

model.fit(data.iloc[:, 0:10], data['y'])
model.coef_  # 各个特征的系数

def huise4():
'''
企业所得税灰色预测
:return:
'''
inputfile = 'data/data4.csv'  # 输入的数据文件
outputfile = 'data/data4_GM11.xls'  # 灰色预测后保存的路径
data.index = range(2002, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x2', 'x3', 'x4', 'x6', 'x7', 'x9', 'x10']
for i in l:
f = GM11(data[i][np.arange(2002, 2014)].values)[0]
data[i][2014] = f(len(data) - 1)  # 2014年预测结果
data[i][2015] = f(len(data))  # 2015年预测结果
data[i] = data[i].round(2)  # 保留两位小数
data[l + ['y']].to_excel(outputfile)  # 结果输出
print(data)

def yuce4():
'''
企业所得税神经网络预测模型
:return:
'''
inputfile = 'data/data4_GM11.xls'  # 灰色预测后保存的路径
outputfile = 'data/enterprise_income.xls'  # 神经网络预测后保存的结果
modelfile = 'data/4-net.model'  # 模型保存路径
feature = ['x1', 'x2', 'x3', 'x4', 'x6', 'x7', 'x9', 'x10']  # 特征所在列

data_train = data.loc[range(2002, 2014)].copy()  # 取2014年前的数据建模
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  # 标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()  # 建立模型
model.fit(x_train, y_train, nb_epoch=5000, batch_size=16)  # 训练模型，学习五千次
model.save_weights(modelfile)  # 保存模型参数

# 预测，并还原结果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).values
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data[u'y_pred'] = data[u'y_pred'].round()
data.to_excel(outputfile)

import matplotlib.pyplot as plt  # 画出预测结果图
p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])
plt.show()

'''
:return:
'''
inputfile = 'data/data5.csv'  # 输入的数据文件

model.fit(data.iloc[:, 0:7], data['y'])
model.coef_  # 各个特征的系数

def huise5():
'''
个人所得税灰色预测
:return:
'''
inputfile = 'data/data5.csv'  # 输入的数据文件
outputfile = 'data/data5_GM11.xls'  # 灰色预测后保存的路径
data.index = range(2000, 2014)

data.loc[2014] = None
data.loc[2015] = None
l = ['x1', 'x4', 'x5', 'x7']
for i in l:
f = GM11(data[i][np.arange(2000, 2014)].values)[0]
data[i][2014] = f(len(data) - 1)  # 2014年预测结果
data[i][2015] = f(len(data))  # 2015年预测结果
data[i] = data[i].round()  # 取整

data[l + ['y']].to_excel(outputfile)  # 结果输出
print(data)

def yuce5():
'''
个人所得税神经网络预测模型
:return:
'''
inputfile = 'data/data5_GM11.xls'  # 灰色预测后保存的路径
outputfile = 'data/personal_Income.xls'  # 神经网络预测后保存的结果
modelfile = 'data/5-net.model'  # 模型保存路径
feature = ['x1', 'x4', 'x5', 'x7']  # 特征所在列

data_train = data.loc[range(2000, 2014)].copy()  # 取2014年前的数据建模
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  # 标签数据

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()  # 建立模型
model.fit(x_train, y_train, nb_epoch=15000, batch_size=16)  # 训练模型，学习一万五千次
model.save_weights(modelfile)  # 保存模型参数

# 预测，并还原结果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).values
data[u'y_pred'] = model.predict(x) * data_std['y'] + data_mean['y']
data[u'y_pred'] = data[u'y_pred'].round()
data.to_excel(outputfile)

import matplotlib.pyplot as plt  # 画出预测结果图
p = data[['y', 'y_pred']].plot(subplots=True, style=['b-o', 'r-*'])
plt.show()

def huise6():
'''
政府性基金收入灰色预测
:return:
'''
x0 = np.array([3152063, 2213050, 4050122, 5265142, 5556619, 4772843, 9463330])
f, a, b, x00, C, P = GM11(x0)
print(u'2014年、2015年的预测结果分别为：\n%0.2f万元和%0.2f万元' % (f(8), f(9)))
print(u'后验差比值为：%0.4f' % C)
p = pd.DataFrame(x0, columns=['y'], index=range(2007, 2014))
p.loc[2014] = None
p.loc[2015] = None
p['y_pred'] = [f(i) for i in range(1, 10)]
p['y_pred'] = p['y_pred'].round(2)
p.index = pd.to_datetime(p.index, format='%Y')

import matplotlib.pylab as plt
p.plot(style=['b-o', 'r-*'], xticks=p.index)
plt.show()

if __name__ == '__main__':
# huise()
# yuce()
# huise2()
# yuce2()
# huise3()
# yuce3()
# huise4()
# yuce4()
# huise5()
# yuce5()
huise6()



应用模型进行推理。

## 补充说明

案例参考书《Python数据分析与挖掘实战》，与原书有借鉴，但是较大改动代码，修复了原书一些旧版本代码错误，具体数据集和代码可以查看我的Github，欢迎star或者fork。再次补充，相关数据集的获取直接clone整个仓库即可。

展开全文
• 以往对财政收入的分析会使用 多元线性回归模型和最小二乘估计方法来估计回归模型的系数，通过系数能否通过检验来检验它们之间的关系，但这样的结果对数据依赖程度很大，并且求得的往往只是局部最优解，后续的检验...

案例来源自《Python 数据分析与挖掘实战》第 13 章：财政收入影响因素分析及预测模型

案例目的：预测财政收入

# 1 数据的基本描述性分析

数据

字段含义
社会从业人数(x1 )、 在岗职工工资总额（x2）、社会消费品零售总额(x3)、城镇居民人均可支配收人(x4)、 城镇居民人均消费性支出(x5)、年末总人口(x6)、全社会固定资产投资额(x7)、地区生产总值（x8）、第一产业产值（x9）、税收（x10）、居民消费价格指数（x11）、第三产业与第二产业产值比（x12）地区生产总值(x8)和居民消费水平(x13)。

导包与读取数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pylab import mpl
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x)

# 读入数据


数据的基本情况

data.shape # (20, 14)
data.info()
'''
<class 'pandas.core.frame.DataFrame'>
Int64Index: 20 entries, 1994 to 2013
Data columns (total 14 columns):
#   Column  Non-Null Count  Dtype
---  ------  --------------  -----
0   x1      20 non-null     int64
1   x2      20 non-null     float64
2   x3      20 non-null     float64
3   x4      20 non-null     float64
4   x5      20 non-null     float64
5   x6      20 non-null     int64
6   x7      20 non-null     float64
7   x8      20 non-null     float64
8   x9      20 non-null     float64
9   x10     20 non-null     float64
10  x11     20 non-null     float64
11  x12     20 non-null     float64
12  x13     20 non-null     int64
13  y       20 non-null     float64
dtypes: float64(11), int64(3)
'''

# 描述性分析
data.describe().T


或更简洁一点

r = [data.min(), data.max(), data.mean(), data.std()]
r = pd.DataFrame(r, index=['Min', 'Max', 'Mean', 'STD']).T
r = np.round(r, 2)
r


结果

            Min         Max        Mean         STD
x1   3831732.00  7599295.00  5579519.95  1262194.72
x2       181.54     2110.78      765.04      595.70
x3       448.19     6882.85     2370.83     1919.17
x4      7571.00    42049.14    19644.69    10203.02
x5      6212.70    33156.83    15870.95     8199.77
x6   6370241.00  8323096.00  7350513.60   621341.85
x7       525.71     4454.55     1712.24     1184.71
x8       985.31    15420.14     5705.80     4478.40
x9        60.62      228.46      129.49       50.51
x10       65.66      852.56      340.22      251.58
x11       97.50      120.00      103.31        5.51
x12        1.03        1.91        1.42        0.25
x13     5321.00    41972.00    17273.80    11109.19
y         64.87     2088.14      618.08      609.25


变量的分布情况

from sklearn.preprocessing import MinMaxScaler
#实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit，在这里本质是生成min(x)和max(x)
data_scale = pd.DataFrame(scaler.transform(data)) #通过接口导出结果
data_scale.columns = data.columns

import joypy
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
import seaborn as sns
fig, axes = joypy.joyplot(data_scale, alpha=.5, color='#FFCC99')#连续值的列为一个"脊"


data_scale.plot()


相关性分析

pear = np.round(data.corr(method = 'pearson'), 2)
pear

plt.figure(figsize=(12,12))
sns.heatmap(data.corr(), center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5},annot=True, fmt='.1f')
#设置x轴
plt.xticks(fontsize=15)
#设置y轴
plt.yticks(fontsize=15)
plt.tight_layout()
plt.savefig('a.png')


由图可知，居民消费价格指数（x11）与财政收入的线性关系不显著，而且呈现负相关。其余变量均与财政收入呈现高度的正相关关系。

# 2 数据的预处理

变量的筛选

对于Lasso，这里参考书中的理论知识

Lasso全称最小绝对收缩和选择算子，和岭回归一样，Lasso是被创造来作用于多重共线性问题的算法，不过Lasso使用的是系数 β \beta 的L1范式（L1范式则是系数 β \beta 的绝对值）乘以正则化系数

不太严谨说法是，Lasso与岭回归非常相似，都是利用正则项来对原本的损失函数形成一个惩罚，以此来防止多重共线性。

Lasso 虽然是为了限制多重共线性被创造出来的，但其实并不使用它来抑制多重共线性，反而接受了它在其他方面的优势，

由于，L2正则化只会将系数压缩到尽量接近0，但L1正则化主导稀疏性，因此会将系数压缩到0。

因此，Lasso成为了线性模型中的特征选择工具首选

Lasso回归的特点是在拟合广义线性模型的同时进行变量筛选和复杂度调整。 因此，不论目标因变量是连续的，还是二元或者多元离散的，都可以用Lasso回归建模然后预测。

这里的变量筛选是指不把所有的变量都放入模型中进行拟合，而是有选择的把变量放入模型从而得到更好的性能参数。

Lasso变量选择模型

from sklearn.linear_model import Lasso
model = Lasso(alpha=0.1, max_iter=100000)
model.fit(data.iloc[:, 0:13], data['y'])
q=model.coef_#各特征的系数
q=pd.DataFrame(q,index=data.columns[:-1])
q
'''
0
x1  -0.00
x2  -0.59
x3   0.44
x4  -0.13
x5   0.17
x6   0.00
x7   0.27
x8   0.03
x9  -7.56
x10 -0.09
x11  3.38
x12  0.00
x13 -0.01
'''


计算出某变量的特征值非零，则表示该变量对预测变量存在较大影响，而如果某变量的特征值为零，则表示该变量对预测变量影响很小。

调整参数值（参照：https://blog.csdn.net/weixin_43746433/article/details/100047231）

from sklearn.linear_model import Lasso
lasso = Lasso(1000)  #调用Lasso()函数，设置λ的值为1000
lasso.fit(data.iloc[:,0:13],data['y'])
print('相关系数为：',np.round(lasso.coef_,5))  #输出结果，保留五位小数
## 计算相关系数非零的个数
print('相关系数非零个数为：',np.sum(lasso.coef_ != 0))
mask = lasso.coef_ != 0  #返回一个相关系数是否为零的布尔数组

new_reg_data = pd.concat([new_reg_data,data.y],axis=1)
new_reg_data.to_excel('new_reg_data.xlsx')

相关系数为：
[-1.8000e-04 -0.0000e+00  1.2414e-01 -1.0310e-02  6.5400e-02  1.2000e-04
3.1741e-01  3.4900e-02 -0.0000e+00  0.0000e+00  0.0000e+00  0.0000e+00
-4.0300e-02]
相关系数非零个数为： 8
相关系数是否为零： [ True False  True  True  True  True  True  True False False False False  True]


根据非零的系数，最终通过Lasso筛选出的变量如下

变量筛选好之后，接下来的开始建模

# 3 建立财政收入预测模型

这里使用的预测方法是，灰色预测 + 神经网络预测 的组合模型

基本思路是

（1）首先是在前面的变量选择结果基础上，对单个选定的影响因素建立灰色预测模型，得到它们在2014年及2015年的预测值。

（2）然后，通过神经网络对历史数据（ X 1994 − 2003 X_{1994-2003} Y 1994 − 2003 Y_{1994-2003} ）建立训练模型。

（3）把 X 1994 − 2003 X_{1994-2003} 以及灰色预测的数据结果 X 2004 − 2005 X_{2004-2005} 一并代人训练好的模型中，得到预测值。

### 灰色预测模型

灰色模型学习资料（自己推荐自己*-*）

灰色预测函数

def GM11(x0): #自定义灰色预测函数
import numpy as np
x1 = x0.cumsum() # 生成累加序列
z1 = (x1[:len(x1)-1] + x1[1:])/2.0 # 生成紧邻均值（MEAN）序列，比直接使用累加序列好，共 n-1 个值
z1 = z1.reshape((len(z1),1))
B = np.append(-z1, np.ones_like(z1), axis = 1)    # 生成 B 矩阵
Y = x0[1:].reshape((len(x0)-1, 1))    # Y 矩阵
[[a],[u]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)    #计算参数
f = lambda k: (x0[0]-u/a)*np.exp(-a*(k-1))-(x0[0]-u/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, u, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率


data.index = range(1994, 2014)
data.loc[2014] = None
data.loc[2015] = None

# 模型精度评价
# 被lasso筛选出来的6个变量
l = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
for i in l:
GM = GM11(data[i][list(range(1994, 2014))].values)
f = GM[0]
c = GM[-2]
p = GM[-1]
data[i][2014] = f(len(data)-1)
data[i][2015] = f(len(data))
data[i] = data[i].round(2)
if (c < 0.35) & (p > 0.95):
print('对于模型{}，该模型精度为---好'.format(i))
elif (c < 0.5) & (p > 0.8):
print('对于模型{}，该模型精度为---合格'.format(i))
elif (c < 0.65) & (p > 0.7):
print('对于模型{}，该模型精度为---勉强合格'.format(i))
else:
print('对于模型{}，该模型精度为---不合格'.format(i))

data[l+['y']].to_excel('data2.xlsx')

对于模型x1，该模型精度为---好
对于模型x3，该模型精度为---好
对于模型x4，该模型精度为---好
对于模型x5，该模型精度为---好
对于模型x6，该模型精度为---好
对于模型x7，该模型精度为---好
对于模型x8，该模型精度为---好
对于模型x13，该模型精度为---好


预测值如下：

### 神经网络预测模型

下面用历史数据建立神经网络模型

其参数设置为误差精度107，学习次数10000次，神经元个数为Lasso变量选择方法选择的变量个数8。

'''神经网络'''
# 提取数据
feature = list(data2.columns[:len(data2.columns)-1]) # ['x1', 'x2', 'x3', 'x4', 'x5', 'x7']
train = data2.loc[list(range(1994, 2014))].copy()
mean = train.mean()
std = train.std()
train = (train - mean) / std    # 数据标准化，这里使用标准差标准化
x_train = train[feature].values
y_train = train['y'].values

# 建立神经网络模型
from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()
model.fit(x_train, y_train, epochs=10000, batch_size=16)
model.save_weights('net.model')


训练好模型后，将 X 1994 − 2005 X_{1994-2005} 全部带入模型中作预测，结果如下：

# 将整个变量矩阵标准化
x = ((data2[feature] - mean[feature]) / std[feature]).values
# 预测，并还原结果
data2['y_pred'] = model.predict(x) * std['y'] + mean['y']
data2.to_excel('data3.xlsx')


预测结果

绘制真实值与预测值之间的折线图

import matplotlib.pyplot as plt
p = data2[['y', 'y_pred']].plot(style=['b-o', 'r-*'])
p.set_ylim(0, 2500)
p.set_xlim(1993, 2016)
plt.show()


从结果中，比较预测值与真实值基本高度吻合

为了与神经网络预测结果有一个对比，下面使用其他预测模型查看其结果如何

from sklearn.linear_model import LinearRegression # 线性回归
from sklearn.neighbors import KNeighborsRegressor # K近邻回归
from sklearn.neural_network import MLPRegressor # 神经网络回归
from sklearn.tree import DecisionTreeRegressor # 决策树回归
from sklearn.tree import ExtraTreeRegressor # 极端随机森林回归
from xgboost import XGBRegressor # XGBoot
from sklearn.ensemble import RandomForestRegressor # 随机森林回归
from sklearn.ensemble import GradientBoostingRegressor # 集成学习梯度提升决策树
from sklearn.ensemble import BaggingRegressor # bagging回归
from sklearn.linear_model import ElasticNet

from sklearn.metrics import explained_variance_score,\
mean_absolute_error,mean_squared_error,\
median_absolute_error,r2_score

# 提取数据
feature = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
train = data2.loc[list(range(1994, 2014))].copy()
mean = train.mean()
std = train.std()
train = (train - mean) / std    # 数据标准化，这里使用标准差标准化
x_train = train[feature].values
y_train = train['y'].values
# 将整个变量矩阵标准化
x = ((data2[feature] - mean[feature]) / std[feature]).values

for name,model in zip(models_str,models):
print('开始训练模型：'+name)
model=model   #建立模型
a = 'y_pred_'+ name
data2[a] = model.fit(x_train,y_train).predict(x) * std['y'] + mean['y']
df=data2[:-2]
print('平均绝对误差为：',mean_absolute_error(df['y'].values,df[a].values))
print('均方误差为：',mean_squared_error(df['y'],df[a]))
print('中值绝对误差为：',median_absolute_error(df['y'],df[a]))
print('可解释方差值为：',explained_variance_score(df['y'],df[a]))
print('R方值为：',r2_score(df['y'],df[a]))
print('*-*'*15)


结果

开始训练模型：LinearRegression
平均绝对误差为： 32.624948062446734
均方误差为： 1596.8011348674995
中值绝对误差为： 29.89818813145061
可解释方差值为： 0.9954717568606967
R方值为： 0.9954717568606967
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：KNNRegressor
平均绝对误差为： 63.916899999999984
均方误差为： 17521.95548179999
中值绝对误差为： 26.000000000000043
可解释方差值为： 0.9517094362717755
R方值为： 0.950310860278652
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：MLPRegressor
平均绝对误差为： 235.42036857561698
均方误差为： 76090.58720607273
中值绝对误差为： 196.3296364219621
可解释方差值为： 0.7845740946711923
R方值为： 0.7842206697141109
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：DecisionTree
平均绝对误差为： 2.7711166694643907e-14
均方误差为： 1.0551803468236254e-26
中值绝对误差为： 0.0
可解释方差值为： 1.0
R方值为： 1.0
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：ExtraTree
平均绝对误差为： 2.7711166694643907e-14
均方误差为： 1.0551803468236254e-26
中值绝对误差为： 0.0
可解释方差值为： 1.0
R方值为： 1.0
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：XGBoost
平均绝对误差为： 0.5735757446289022
均方误差为： 0.5008986120857999
中值绝对误差为： 0.6280151367187159
可解释方差值为： 0.9999985795409094
R方值为： 0.9999985795408995
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：RandomForest
平均绝对误差为： 24.30998000000009
均方误差为： 2541.844172424009
中值绝对误差为： 8.976250000000078
可解释方差值为： 0.9932099301805153
R方值为： 0.9927917834076989
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
平均绝对误差为： 13.087633333333354
均方误差为： 386.4120509666666
中值绝对误差为： 7.9691666666666805
可解释方差值为： 0.9991155201544625
R方值为： 0.9989042043617541
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
平均绝对误差为： 0.023211721877213876
均方误差为： 0.0014299207277676446
中值绝对误差为： 0.011657245535729999
可解释方差值为： 0.9999999959449999
R方值为： 0.9999999959449999
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：Bagging
平均绝对误差为： 34.284249999999986
均方误差为： 4470.224954049998
中值绝对误差为： 7.295999999999992
可解释方差值为： 0.9874093338106849
R方值为： 0.9873232395460447
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*
开始训练模型：ElasticNet
平均绝对误差为： 294.6018692079905
均方误差为： 118127.42764924551
中值绝对误差为： 249.10992216728664
可解释方差值为： 0.665011689849139
R方值为： 0.6650116898491392
*-**-**-**-**-**-**-**-**-**-**-**-**-**-**-*


注：存在严重的过拟合问题

看一下，线性回归、XGBoost 预测值对比图

线性回归

XGBoost

这里做法存在一定的问题，没有划分训练集和测试集，存在严重过拟合，模型失效。

下面试一下

线支持向量机线性回归（LinearSVR）

from sklearn.svm import LinearSVR
linearsvr = LinearSVR().fit(x_train,y_train)  #调用LinearSVR()函数
# 预测，并还原结果
data2['y_pred_linearsvr'] = linearsvr.predict(x) * std['y'] + mean['y']


相比其他回归模型，神经网络预测模型在这里效果更好一点

至此。

展开全文
• 因素分析模型解决方法Finally, all data were cleansed and ready to analyze. Andy started overenthusiastically to visualize the data to get a first impression of the data. He had many dimensions and ...
• 我们在运用数据科学解决问题时必须清楚的理解问题、理解数据、掌握一系列方法，才能很好的解决问题。统计学习的对象是数据，数据的类型包括数字、...统计学习方法三要素包括：模型模型集合，概率模型表示为条件概...
• 能够达到的性能取决于3方面的因素：问题的复杂性，模型算法的复杂性，可用数据的丰富程度。 理解函数逼近   预测问题包括两种变量：   第一种变量是尝试要预测的变量；   第二种变量是用来进行预测的变量。  ...
• ## 并行计算模型有哪些？

万次阅读 多人点赞 2021-04-22 00:31:44
并行计算模型通常指从并行算法的设计和分析出发，将各种并行计算机(至少是某一类并行计算机)的基本特征抽象出来，形成一个抽象的计算模型。 从更广的意义上说，并行计算模型为并行计算提供了硬件和软件界面，在该...
• 4 10 财政收入影响因素分析及预测模型 10.1背景与挖掘目标  本案例通过研究发现影响目前以及未来地方财源建设的因素，并对其进行深入分析，提出对该市地方财源优化的具体建议，供政府决策参考，同时为其他发展较...
• SEIR传染病模型模型延伸-SEIDR模型，加入疫苗影响、政府管控、病毒变异等因素影响。 代码地址： https://github.com/moyuweiqing/SEIR-Model-extension
• 在进行数据分析时，那就会提及数据分析模型。...公司通过研究与事件发生有关的所有因素来挖掘或跟踪用户行为事件背后的原因，公司可以使用它来跟踪或记录用户行为或业务流程，例如用户注册，浏览产品详细信息页面，
• 项目成本管理包括确保在批准的预算范围内完成项目所需的各个...资源计划：项目经理要获得哪些资源、从哪里获得以及如何使用它们的过程。依据： 工作分解结构、项目进度计划、历史资料、项目范围说明书、项目资源说...
• 三、信道的数学模型(一)调制信道模型调制信道模型描述的是调制信道的输出信号和输入信号之间的数学关系。调制信道、输入信号、输出信号存在以下特点：1.信道总具有输入信号端和输出信号。2.信道一般是线性的，即输入...
• Cox回归模型又称为比例风险回归模型，该模型以生存结局和生存时间作为因变量，进而分析众多因素对生存期的影响，是一个典型的多因素分析方法。 SPSS中就带Cox回归模型方法，本节将带大家进行深入的了解与探索，话...
• SPSS（二）SPSS实现多因素方差分析模型因素方差分析上一篇博客https://blog.csdn.net/LuYi_WeiLin/article/details/89917656已经介绍完毕 这篇博客我们主要来学习多因素方差分析 多因素方差分析，就是同时考虑...
• ## 数学建模的影响因素分析方法

万次阅读 多人点赞 2020-05-11 16:07:37
数学建模的影响因素分析方法PCA主成分分析灰色关联分析AHP层次分析小结         如果赶时间可直接看小结部分，再返回看正文         作为萌新参加了数学建模，为解决影响...
• 提到数据分析，肯定要提到数据分析模型，在进行数据分析之前，先搭建数据分析模型，根据模型中的内容，具体细分到不同的数据指标进行细化分析，最终得到想要的分析结果或结论。 一:数据分析模型 要进行一次完整的...
• 光线、磁感线、小磁针、通电螺线管、受力示意图(2)状态模型二力平衡模型、液片模型、液柱模型(3)过程模型匀速直线运动二、物理模型例题及答案质点模型例题 在某些条件下，把整个物体看作是一个...
• 转 一个完整的量化模型包括哪些？ 近几年，量化投资在国内兴起，但在很多人眼里，量化投资仿佛是一个非常神秘的新事物。而实际上，量化投资的无非就是宽客通过计算机语言，将交易策略布置到一个量化系统中，然后进行...
• 然而，这种负面影响的大小却与很多因素有关，本文和大家探讨这些影响因素。 类别不平衡比率 如《类别不平衡分布对传统分类器性能的影响机理》所述，在不平衡分类问题中，类别不平衡比率（Imbalanced Ratio, IR）是一...
• 常见的软件生存期模型主要瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型和统一过程六种。 （1）瀑布模型 优点：可强迫开发人员采用规范化的方法；严格地规定了每个阶段必须提交的文档；要求每个阶段...
• 描述：采用数据挖掘算法中人工神经网络算法，首先用Adaptive—Lasso方法找出相关性最大的因素，根据现有的数据建立神经网络模型，然后对未知属性做出预测。代码：import pandas as pd def Data_pro(feature,data): ...
• 文章目录引言一、数据探索1.数据质量分析1.1 缺失值分析1.2 异常点分析—箱型图分析1.3 重复数据分析2....分析、识别影响地方财政收入的关键属性 预测2014年和2015年的财政收入 本文数据挖掘主要包括以下步骤
• Cox比例风险回归模型因素因素生存分析 欢迎使用Markdown编辑器 Cox比例风险回归模型临床应用非常广泛，Cox分析得到的结果是可以直接运用到临床应用的，所以这个分析对癌症临床诊断非常关键的作用，检测高低...
• 保证金、手续费、当日平仓、是否灾害天气、是否消费旺季这几个影响因素之间是否关联？ 数据下载地址： ...
• 本次实验运用R软件编写代码拟合多元线性回归模型、选择最优模型，最终进行区间预测，定性的研究影响我国经济增长的主要因素。 二、试验的设计与数据收集过程 为了大致描绘改革开放以来我国经济的增长情况，原计划...
• 2. 交互作用的双因素方差分析模型 7.3 一元线性回归分析 相关关系的类型 7.3.2 一元线性回归模型 1.回归参数的估计 2.回归模型、参数的显著性检验 7.3.3 一元线性回归分析应用 多元线性回归分析
• 如果从建模的背景、目的和手段看，主要因素是确定的，随机因素可以忽略，或者随机因素影响可以简单地以平均值的作用出现，那么就能够建立确定性模型。如果随机因素对研究对象的影响必须考虑，就应建立随机模型。 ...
• ## Logistic模型

千次阅读 2022-01-04 11:48:53
例如，想探讨胃癌发生的危险因素，可以选择两组人群，一组是胃癌组，一组是非胃癌组，两组人群肯定不同的体征和生活方式等。这里的因变量就是--是否胃癌，即“是”或“否”，为两分类变量，自变量就可以包括很多了...
• 笔者很早就对LDA模型着迷，最近在学习gensim库发现了LDA比较意义且项目较为完整的Tutorials,于是乎就本系列,本系列包含三款：Latent Dirichlet Allocation、Author-Topic Model、Dynamic Topic Models ...

...