【项目实战】Python基于Lasso特征选择、GM算法和SVR回归算法进行财政收入影响因素分析及预测

257 篇文章 280 订阅

说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

1.项目背景

       随着信息化的发展和科学技术的进步,数据分析与挖掘技术开始得到广泛应用。人们无时无刻不面对着海量的数据,这些海量数据中隐藏着人们所需要的具有决策意义的信息。数据分析与挖掘技术的产生和发展就是帮助人们利用这些数据,并从中发现隐藏的有用的信息。

       在此背景下,本项目主要运用数据分析与挖掘技术对市财政收入进行分析,挖掘其中隐藏的运行模式,并对未来两年的财政收入进行预测,希望能够帮助政府合理地控制财政收支,优化财源建设,为制定相关决策提供依据。

2.项目目标

        财政收入是指政府为履行其职能、实施公共政策和提供公共物品与服务需要而筹集的一切资金的总和。财政收入表现为政府部门在一定时期内(一般为一个财政年度)所取得的货币收入。财政收入是衡量一国政府财力的重要特征,政府在社会经济活动中提供公共物品和服务的范围和数量,在很大程度上取决于财政收入的充裕情况。

      在我国现行的分税制财政管理体制下,地方财政收入不但是国家财政收入的重要组成部分,而且是具有相对独立性的构成内容。如何制定地方财政支出计划,合理分配地方财政收入,促进地方的发展,提高市民的收入和生活质量是每个地方政府需要考虑的首要问题。因此,地方财政收入预测是非常必要的。

考虑到数据的可得性,本项目所用的财政收入分为地方一般预算收入和政府性基金收入。地方一般预算收入包括以下两个部分:

·税收收入。主要包括企业所得税与地方所得税中中央和地方共享的40%,地方享有的25%的增值税和印花税等。

·非税收收入。包括专项收入、行政事业性收费、罚没收入、国有资本经营收入和其他收入等。

政府性基金收入是国家通过向社会征收以及出让土地、发行彩票等方式取得收入,并专项用于支持特定基础设施建设和社会事业发展的收入。

由于1994年我国对财政体制进行了重大改革,开始实行分税制财政体制,影响了财政收入相关数据的连续性,所以1994年前后的数据不具有可比性。由于没有合适的方法来调整这种数据的跃变,因此本项目仅对1994年至2013年的数据进行分析(本项目所用数据均来自《统计年鉴》)。

结合财政收入预测的需求分析,本次数据分析建模目标主要有以下两个:

1)分析、识别影响地方财政收入的关键属性。

2)预测2014年和2015年的财政收入。

3.项目过程

       众多学者已经对财政收入的影响因素进行了研究,但是他们大多先建立财政收入与各待定的影响因素之间的多元线性回归模型,运用最小二乘估计方法来估计回归模型的系数,通过系数来检验它们之间的关系,模型的结果对数据的依赖程度很大,并且普通最小二乘估计求得的解往往是局部最优解,后续步骤的检验可能就会失去应有的意义。

       本项目在已有研究的基础上运用Lasso特征选择方法来研究影响地方财政收入的因素。在Lasso特征选择的基础上,鉴于灰色预测对少量数据预测的优良性能,对单个选定的影响因素建立灰色预测模型,得到它们在2014年及2015年的预测值。由于支持向量回归较强的适用性和容错能力,对历史数据建立训练模型,把灰色预测的数据结果代入训练完成的模型中,充分考虑历史数据信息,可以得到较为准确的预测结果,即2014年和2015年财政收入。

3.1.分析步骤与流程

本项目的总体流程如图所示,主要包括以下步骤:

1)对原始数据进行探索性分析,了解原始属性之间的相关性。

2)利用Lasso特征选择模型提取关键属性。

3)建立单个属性的灰色预测模型以及支持向量回归预测模型。

4)使用支持向量回归预测模型得出2014年至2015年财政收入的预测值。

5)对上述建立的财政收入预测模型进行评价。

4.数据采集

影响财政收入(y)的因素有很多,在查阅大量文献的基础上,通过经济理论对财政收入的解释以及对实践的观察,考虑一些与能源消耗关系密切并且直观上有线性关系的因素,初步选取以下属性为自变量,分析它们之间的关系。各项属性名称及属性说明如表所示。

属性名称和说明

5. 探索性数据分析

5.1.描述性统计分析

对各个属性进行描述性统计分析,关键代码如下:

通过代码清单得到的结果如表所示。其中,财政收入(y)的均值和标准差分别为618.08和609.25,这说明某市各年份财政收入存在较大差异;2008年后,某市各年份财政收入大幅上升。

各个属性的描述性统计

5.2.相关性分析

采用Pearson相关系数法求解原始数据的Pearson相关系数矩阵,关键代码如下:

求解原始数据的Pearson相关系数矩阵

对原始数据进行相关分析,得到相关系数矩阵,如表所示。

变量Pearson相关系数矩阵

 从上表可以看出,居民消费价格指数(x11)与财政收入(y)的线性关系不显著,呈现负相关。其余属性均与财政收入呈现高度的正相关关系,按相关性大小,依次是x3、x4、x5、x7、x8、x10、x13、x2、x9、x1、x6和x12。同时,各属性之间存在着严重的多重共线性,例如,属性x1、x4、x5、x6、x8、x9、x10与除了x11之外的属性均存在严重的共线性;属性x2、x3、x7与除了x11和x12外的其他属性存在着严重的多重共线性;x11与各属性的共线性不明显;x12与除了x2、x3、x7、x11之外的其他属性有严重的共线性;x13与除了x11之外的各属性有严重的共线性。除此之外,x2和x3、x2和x13、x3和x13等多对属性之间存在完全的共线性。

由上述分析可知,选取的各属性除了x11外,其他属性与y的相关性很强,可以用作财政收入预测分析的关键属性,但这些属性之间存在着信息的重复,需要对属性进行进一步筛选。

绘制相关性热力图,关键代码如下:

绘制相关性热力图

通过代码清单得到相关性热力图,如图所示,由颜色的深浅可看出各属性除了x11与y为负弱相关外,其他属性与y强相关。

6.数据预处理

Lasso回归方法属于正则化方法的一种,是压缩估计。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些系数,同时设定一些系数为零,保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。

Lasso以缩小特征集(降阶)为思想,是一种收缩估计方法。Lasso方法可以将特征的系数进行压缩并使某些回归系数变为0,可以广泛地应用于模型改进与选择。通过选择惩罚函数,借用Lasso思想和方法实现特征选择的目的。模型选择本质上是寻求模型稀疏表达的过程,而这种过程可以通过优化一个“损失”+“惩罚”的函数问题来完成。

Lasso参数估计定义如式所示。

其中,λ为非负正则参数,控制着模型的复杂程度,λ越大对特征较多的线性模型的惩罚力度就越大,从而最终获得一个特征较少的模型, 称为惩罚项。调整参数λ的确定可以采用交叉验证法,选取交叉验证误差最小的λ值。最后,按照得到的λ值,用全部数据重新拟合模型即可。

       当原始特征中存在多重共线性时,Lasso回归不失为一种很好的处理共线性的方法,它可以有效地对存在多重共线性的特征进行筛选。在机器学习中,面对海量的数据,首先想到的就是降维,争取用尽可能少的数据解决问题,从这层意义上说,用Lasso模型进行特征选择也是一种有效的降维方法。从理论上来说,Lasso对数据类型没有太多限制,可以接受任何类型的数据,而且一般不需要对特征进行标准化处理。

       Lasso回归方法的优点是可以弥补最小二乘法和逐步回归局部最优估计的不足,可以很好地进行特征的选择,可以有效地解决各特征之间存在多重共线性的问题。缺点是如果存在一组高度相关的特征时,Lasso回归方法倾向于选择其中的一个特征,而忽视其他所有的特征,这种情况会导致结果的不稳定性。虽然Lasso回归方法存在弊端,但是在合适的场景中还是可以发挥不错的效果的。在财政收入预测中,各原始属性存在着严重的多重共线性,多重共线性问题已成为主要问题,这里采用Lasso回归方法进行特征选取是恰当的。使用Lasso回归方法进行关键属性选取,关键代码如下:

Lasso回归选取关键属性

通过代码清单得到各个属性的系数,如表所示:

由表可看出,利用Lasso回归方法识别影响财政收入的关键影响因素是社会从业人数(x1)、社会消费品零售总额(x3)、城镇居民人均可支配收入(x4)、城镇居民人均消费性支出(x5)、全社会固定资产投资额(x7)、地区生产总值(x8)、第一产业产值(x9)和居民消费水平(x13)。

7.模型构建

7.1.灰色预测算法

灰色预测法是一种对含有不确定因素的系统进行预测的方法。在建立灰色预测模型之前,需先对原始时间序列进行数据处理,经过数据处理后的时间序列即称为生成列。灰色系统常用的数据处理方式有累加和累减两种。

灰色预测是以灰色模型为基础的,在众多的灰色模型中,GM(1,1)模型最为常用。

设特征X(0)={X0i,i=1,2,…,n}为一非负单调原始数据序列,建立灰色预测模型如下:

1)首先对X(0)进行一次累加,得到一次累加序列X(1)={X1k,k=1,2,…,n}

2)对X(1)可建立下述一阶线性微分方程,如式(6-2)所示,即GM(1,1)模型。

 3)求解微分方程,即可得到预测模型,如式(6-3)所示。

4)由于GM(1,1)模型得到的是一次累加量,将GM(1,1)模型所得数据经过累减还原为 ,即X(0)的灰色预测模型如式(6-4)所示。  

后验差检验模型精度如表所示。

后验差检验判别参照表

灰色预测法的通用性较强,一般的时间序列场合都适用,尤其适合那些规律性差且不清楚数据产生机理的情况。灰色预测模型的优点是预测精度高、模型可检验、参数估计方法简单、对小数据集有很好的预测效果;缺点是对原始数据序列的光滑度要求很高,在原始数据列光滑性较差的情况下灰色预测模型的预测精度不高,甚至通不过检验,结果只能放弃使用灰色模型进行预测。

7.2.SVR算法

SVR(Support Vector Regression,支持向量回归)是在做拟合时,采用了支持向量的思想,来对数据进行回归分析。给定训练数据集,其中  ,i=1,2,…,n。对于样本 通常根据模型输出与真实值yi之间的差别来计算损失,当且仅当 时损失才为零。

 SVR的基本思路是:允许 与yi之间最多有ε的偏差。仅当 时,才计算损失。当 时,认为预测准确。用数学语言描述SVR问题如式(6-5)所示。

其中C≥0为罚项系数,为损失函数。

更进一步,引入松弛变量 ,则新的最优化问题如式(6-6)和式(6-7)所示。

 这就是SVR原始问题。类似的,引入拉格朗日乘子法,定义拉格朗日函数如式(6-8)所示。

 根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题,如式(6-9)所示。

先求极小问题:根据 求偏导数可得式(6-10)。  

 再求极大问题(取负号变极小问题)如式(6-11)和式(6-12)所示。

条件如式(6-13)所示。

 假设最终解为 ,在 中,找出 的某个分量 ,则有式(6-14)和式(6-15)。

 更进一步,如果考虑使用核技巧,给定核函数 ,则SVR可以表示为式(6-16)。

      由于支持向量机拥有完善的理论基础和良好的特性,人们对其进行了广泛的研究和应用,涉及分类、回归、聚类、时间序列分析、异常点检测等诸多方面。具体的研究内容包括统计学习理论基础、各种模型的建立、相应优化算法的改进以及实际应用。支持向量回归也在这些研究中得到了发展和逐步完善,已开展了许多富有成果的研究工作。

      相比较于其他方法,支持向量回归的优点是:不仅适用于线性模型,也能很好地抓住数据和特征之间的非线性关系;不需要担心多重共线性问题,可以避免局部极小化问题,提高泛化性能,解决高维问题;虽然不会在过程中直接排除异常点,但会使得由异常点引起的偏差更小。缺点是:计算复杂度高,在面临数据量大的时候,计算耗时长。

7.3.构建财政收入预测模型

依据Lasso回归选取的关键变量构建灰色预测模型,并预测2014年和2015年的财政收入,关键代码如下:

 依据灰色预测的结果构建支持向量回归预测模型,并预测2014年和2015年的财政收入,如代码清单所示。

 构建支持向量回归预测模型

8.结果分析与模型评估

对Lasso回归选取的社会从业人数(x1)、社会消费品零售总额(x3)、城镇居民人均可支配收入(x4)、城镇居民人均消费性支出(x5)、全社会固定资产投资额(x6)、地区生产总值(x7)、第一产业产值(x8)和居民消费水平(x13)属性的2014年及2015年通过建立灰色预测模型得出的预测值,如表所示。

通过灰色预测模型得出的预测值

 将表的预测结果代入地方财政收入建立的支持向量回归预测模型,得到1994年至2015年财政收入的预测值,如表所示,其中y_pred表示预测值。

1994年至2015年财政收入的预测值

 地方财政收入真实值与预测值的对比图如图所示。

地方财政收入真实值与预测值对比图表

采用回归模型评价指标对地方财政收入的预测值进行评价,得到的结果如表所示。

 模型评价指标

       由表可以看出,平均绝对误差与中值绝对误差较小,可解释方差值与R方值十分接近1,表明建立的支持向量回归模型拟合效果优良,可以用于预测财政收入。 

# 描述性统计分析
description = [data.min(), data.max(), data.mean(), data.std()]  # 依次计算最小值、最大值、均值、标准差
description = pd.DataFrame(description, index=['Min', 'Max', 'Mean', 'STD']).T  # 将结果存入数据框



# 本次机器学习项目实战所需的资料,项目资源如下:

链接:https://pan.baidu.com/s/18GCu_yMS5aJhiQ2MHDPx6g 
提取码:yig3







print('描述性统计结果:\n', np.round(description, 2))  # 保留两位小数

# 相关性分析
corr = data.corr(method='pearson')  # 计算相关系数矩阵
print('相关系数矩阵为:\n', np.round(corr, 2))  # 保留两位小数

# 绘制热力图
import matplotlib.pyplot as plt
import seaborn as sns
plt.subplots(figsize=(10, 10))  # 设置画面大小
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
sns.heatmap(corr, annot=True, vmax=1, square=True, cmap="Blues")
plt.title('相关性热力图')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张陈亚

您的鼓励,将是我最大的坚持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值