机器学习实战:支持向量机回归预测财政收入

  • 数据集说明
    • 数据集
    • 特征说明
  • 特征分析
    • 特征可视化
      • 导入数据
      • 可视化
    • 特征相关性检测
      • 绘制相关矩阵
      • 打印Pearson相关系数
    • 多变量研究
  • Lasso特征选择模型进行特征提取
    • alpha(正则项系数)的参数选择
    • 进行特征选取
  • 使用核函数进行预测
    • 数据预处理,拆分数据集,分成训练集和测试集
    • 进行预测
    • 绘制财政实际收入与预测收入的对比图
  • 进行简单预测模型评价
    • MSE(均方误差)
    • RMSE(均方根误差)
    • MAE(平均绝对误差)
    • R^2

这是一个财政收入预测的一个实战,我们将会对做了基本处理的数据进行特征分析,然后选取特征利用支持向量机回归预测未来的财政收入。

数据集说明

数据集

特征说明

属性 名称
x1 社会从业人数
x2 在岗职工工资总额
x3 社会消费品零售总额
x4 城镇居民人均可支配收入
x5 城镇居民人均消费性支出
x6 年末总人口
x7 全社会固定资产投资额
x8 地区生产总值
x9 第一产业产值
x10 税收
x11 居民消费价格指数
x12 第三产业与第二产业产值比
x13 居民消费水平
y 财政收入

特征分析

为什么要进行特征分析呢?因为数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。为了模型有更好的结果,特征分析和提取是非常重要的。

特征可视化

首先导入我们接下来要用到的所有库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
import pandas as pd
from collections import Counter
import csv
import warnings
import seaborn as sns
import matplotlib
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVR
from sklearn.svm import LinearSVR
from sklearn import metrics
from sklearn.metrics import mean_squared_error
from math import sqrt
from sklearn.preprocessing import StandardScaler

导入数据

data = pd.read_csv(r'C:\data.csv')
x_data = data.drop('y', 1)
y_data = data.loc[:, 'y']
name_data = list(data.columns.values)

因为使用matplotlib库画图是不显示中文的,所有先设置它显示中文

matplotlib.rc("font", family='MicroSoft YaHei', weight="bold")

可视化

warnings.filterwarnings("ignore")  # 排除警告信息
fig = plt.figure()
fig.set_size_inches(14, 9)
for i in range(13):ax = fig.add_subplot(4, 4, i+1)x = x_data.loc[:, name_data[i]]y = y_dataplt.title(name_data[i])ax.scatter(x, y)
plt.tight_layout()  # 自动调整子图间距
plt.show()


从运行结果的图片可以看出,除了特征x11,其他特征均呈线性关系,且单调递增。

特征相关性检测

相关系分析是特征质量评价中非常重要的一环,合理的选取特征,找到与拟合目标相关性最强的特征,往往能够快速获得效果,达到事半功倍的效果。相关性分析是指对两个或多个具备相关性的特征元素进行分析,从而衡量两个特征因素的相关密切程度,Pearson相关系数是用来度量两个特征X和Y之间的相互关系(线性相关的强弱),是最简单的一种相关系数。接下来会使用Pearson相关系数和绘制相关矩阵来进行特征相关性检测

绘制相关矩阵

plt.figure(figsize=(12, 8))
sns.heatmap(data.corr(), annot=True, fmt='.2f', cmap='PuBu')
plt.title('各个特征中的相关性')
plt.show()

打印Pearson相关系数

print(data.corr()['y'].sort_values())


相关系数与相关性的关系

相关性 相关系数(负值) 相关系数(正值)
不相关 -0.09~ 0 0~0.09
低相关 -0.3 ~ -0.1 0.1~0.3
中等相关 -0.5 ~ -0.3 0.3~0.5
显著相关 -1.0 ~ -0.5 0.5~1.0

从相关系数图和相关系数可以明显看出特征X11与特征y的相关关系为低相关,其他特征均为显著相关。

多变量研究

这里我们尝试下进行多变量的研究,了解因变量和自变量,自变量和自变量之间的关系。由于数据有13各自变量和一个因变量,一张图难以显示,所以选取4个为一组进行研究

# 多变量的研究
sns.pairplot(data[["x1", "x2", "x3", "x4"]])
sns.pairplot(data[["x5", "x6", "x7", "x8"]])
sns.pairplot(data[["x9", "x10", "x12", "x13"]])
plt.tight_layout()  # 自动调整子图间距
plt.show()



Lasso特征选择模型进行特征提取

Lasso回归方法属于正则化方法的一种,是压缩估计。Lasso以缩小特征集(降阶)为思想,是一种收缩估计方法。Lasso方法可以将特征的系数进行压缩并使某些回归系数变为0,进而达到特征选择的目的,可以广泛地应用于模型改进与选择

alpha(正则项系数)的参数选择

尝试使用for循环alpha参数在0到50内Lasso得分的变化

scaler = StandardScaler()
X = scaler.fit_transform(x_data)
Y = y_data
names = name_data
coef = []
for i in range(30):lasso = Lasso(alpha=i)lasso.fit(X, Y)coef.append(lasso.score(X, Y))
plt.plot(range(30), coef)
plt.xlabel("alpha值")
plt.ylabel("lasso得分")
plt.show()


从上图可以看出alpha参数值在0-30的选值上lasso的得分变化不是特别大,当然也可以尝试下alpha参数取1.0以下看看lasso的得分变化,这里选择alpha=20进行特征提取

进行特征选取

lasso = Lasso(alpha=20)
lasso.fit(X, Y)
print(lasso.score(X, Y))
print(lasso.coef_)


从运行结果来看,选择特征x3,x5,x7这三个特征进行训练。

# 选取 x3,x5,x7特征数据
x = x_data.drop('x11', 1)
name = list(x.columns.values)
for i in name:if i == 'x3':continueelif i == 'x5':continueelif i == 'x7':continueelse:x = x.drop(i, 1)

使用核函数进行预测

支持向量回归不仅适用于线性模型,对于数据和特征之间的非线性关系也能很好抓住;支持向量回归不需要担心多重共线性问题,可以避免局部极小化问题,提高泛化性能,解决高维问题;支持向量回归虽然不会在过程中直接排除异常点,但会使得由异常点引起的偏差更小,所以这里我使用SVR核函数进行预测

数据预处理,拆分数据集,分成训练集和测试集

# 数据预处理
train_data, test_data, train_target, test_target = train_test_split(x, y_data, test_size=0.3)
Stand_X = StandardScaler()  # 把特征进行标准化
Stand_Y = StandardScaler()  # 标签也是数值,也需要进行标准化
train_data = Stand_X.fit_transform(train_data)
test_data = Stand_X.transform(test_data)
train_target = Stand_Y.fit_transform(train_target.values.reshape(-1, 1))  # reshape(-1,1)指将它转化为1列,行自动确定
test_target = Stand_Y.transform(test_target.values.reshape(-1, 1))

进行预测

clf = LinearSVR(C=2)
clf.fit(train_data, train_target)
y_pred = clf.predict(test_data)
print("线性核函数:")
print("训练集评分:", clf.score(train_data, train_target))
print("测试集评分:", clf.score(test_data, test_target))

绘制财政实际收入与预测收入的对比图

# 绘制预测值和真实值对比图
hos_pre = pd.DataFrame()
hos_pre['预测值'] = y_pred
hos_pre['真实值'] = test_target
hos_pre.plot(figsize=(8, 4))
plt.show()

进行简单预测模型评价

在模型评价这里,接下来会使用

MSE(均方误差)

MSE是线性回归中最常用的损失函数,线性回归过程中尽量让该损失函数最小。MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

RMSE(均方根误差)

RMSE对一组测量中的特大或特小误差反映非常敏感,所以,标准误差能够很好地反映出测量的精密度。

MAE(平均绝对误差)

MAE是绝对误差的平均值,能更好地反映预测值误差的实际情况。

R^2

R^2又叫可决系数(coefficient of determination)也叫拟合优度,它反映的是自变量x对因变量y的变动的解释的程度.越接近于1,说明模型拟合得越好.
这几个指标具体的推导公式和详细的含义可以取官方文档查看。
使用这4种指标进行模型评价:

MSE = np.sum((y_pred-test_target)**2)/len(test_target)
MAE = np.sum(np.absolute(y_pred-test_target))/len(test_target)
print("测试集均方差:", metrics.mean_squared_error(test_target, y_pred.reshape(-1, 1)))
print("测试集R2分:", metrics.r2_score(test_target, y_pred.reshape(-1, 1)))
print("MSE", MSE)
print("MAE", MAE)
print('RMSE:{:.4f}'.format(sqrt(MSE))) #RMSE(标准误差)


测试集R^2十分接近1,所以该模型的拟合优度比较高。而MSE,MAE和RMSE的值都不是很高,所以该模型描述实验数据具有很好的精确度。当然,也有可能是数据集太小,所以结果不错。
最后奉上完整代码和数据
链接:https://pan.baidu.com/s/1ynUA38Im086czD7B6EhmOQ
提取码:dsc9

机器学习实战:支持向量机回归预测财政收入相关推荐

  1. 机器学习实战 支持向量机SVM 代码解析

    机器学习实战 支持向量机SVM 代码解析 <机器学习实战>用代码实现了算法,理解源代码更有助于我们掌握算法,但是比较适合有一定基础的小伙伴.svm这章代码看起来风轻云淡,实则对于新手来说有 ...

  2. python支持向量机回归_机器学习实战-支持向量机原理、Python实现和可视化(分类)...

    支持向量机(SVM)广泛应用于模式分类和非线性回归领域. SVM算法的原始形式由Vladimir N.Vapnik和Alexey Ya提出.自从那以后,SVM已经被巨大地改变以成功地用于许多现实世界问 ...

  3. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

    原 Python3<机器学习实战>学习笔记(八):支持向量机原理篇之手撕线性SVM 置顶 2017年09月23日 17:50:18 阅读数:12644 转载请注明作者和出处: https: ...

  4. 机器学习实战:支持向量机

    支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义 ...

  5. 机器学习实战(五)支持向量机SVM(Support Vector Machine)

    目录 0. 前言 1. 寻找最大间隔 2. 拉格朗日乘子法和KKT条件 3. 松弛变量 4. 带松弛变量的拉格朗日乘子法和KKT条件 5. 序列最小优化SMO(Sequential Minimal O ...

  6. Python3:《机器学习实战》之支持向量机(2)简化版SMO

    Python3:<机器学习实战>之支持向量机(2)简化版SMO 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github ...

  7. 机器学习实战教程(八):支持向量机原理篇

    一.前言 本篇文章参考了诸多大牛的文章写成的,深入浅出,通俗易懂.对于什么是SVM做出了生动的阐述,同时也进行了线性SVM的理论推导,以及最后的编程实践,公式较多,还需静下心来一点一点推导. 二.什么 ...

  8. 机器学习实战之路 —— 5 SVM支持向量机

    机器学习实战之路 -- 5 SVM支持向量机 1. 支持向量机概述 1.1 线性分类 1.2 非线性分类 2. 支持向量机分类中的问题 2.1 核函数的选择 2.2 多类分类 2.3 不平衡数据的处理 ...

  9. 刻意学习:机器学习实战--Task03分类问题:支持向量机

    刻意学习:机器学习实战–Task03分类问题:支持向量机 1 什么是SVM? 首先,支持向量机不是一种机器,而是一种机器学习算法. 1.SVM - Support Vector Machine ,俗称 ...

  10. python神经网络算法pdf_Python与机器学习实战 决策树、集成学习、支持向量机与神经网络算法详解及编程实现.pdf...

    作 者 :何宇健 出版发行 : 北京:电子工业出版社 , 2017.06 ISBN号 :978-7-121-31720-0 页 数 : 315 原书定价 : 69.00 主题词 : 软件工具-程序设计 ...

最新文章

  1. Harbor: 跨数据中心复制Docker镜像的开源实现
  2. python语法学习
  3. Visual C++——LoadBitmap加载位图的操作过程
  4. HH SaaS电商系统的支付模块设计
  5. ps导出gif颜色不对_PS の手绘《超详细的动态表情包新手绘制指南》
  6. mongodb聚合内存不足解决方案
  7. 千万别把有本事挣钱的人,当成臭奸商
  8. 头条号个人中心登录_注册登录系统
  9. 删除重复节点(细节每太明白)
  10. 每个国家对应的values语言Locale和国家代码对照表
  11. xp启用计算机共享打印机,xp系统怎么共享打印机|win7怎么连接xp共享打印机
  12. Misc 自动拼图 CTF
  13. 0xC00000FD: Stack overflow
  14. CRM客户关系管理系统源码
  15. 李某人的第一篇blog
  16. 计算机谱子勇敢爱,【数字乐谱大全流行歌曲】流行歌曲勇敢爱乐谱及歌词.doc...
  17. ionic中android的返回键
  18. 担忧民众隐私 欧委会要求美国澄清雅虎电邮扫描
  19. 软件开发:最佳实践 != 过度设计
  20. 使用VMware虚拟机安装Red Hat Enterprise Linux8/9教程

热门文章

  1. 已知文件url,批量下载文件
  2. 计算机领域车牌识别,城市智慧停车的智能眼睛——车牌识别系统
  3. DHT 爬虫的学习记录
  4. [系统安全]《黑客免杀攻防》逆向基础之经典脱壳基础
  5. linux进入pe系统,如何进入pe系统【图文详解】
  6. 实验五 Flash在线编程实验
  7. cad 打开硬件加速卡_如何提高CAD运行速度
  8. uni-app、小程序项目分包经验之谈与天坑异常:RangeError: Maximum call stack size exceeded
  9. 真没想到!时隔3年,被废掉武功的快播,依然是最受欢迎的播放器
  10. Alexa工具栏研究