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

数据集说明

数据集

在这里插入图片描述

特征说明

属性名称
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_data
    plt.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~ 00~0.09
低相关-0.3 ~ -0.10.1~0.3
中等相关-0.5 ~ -0.30.3~0.5
显著相关-1.0 ~ -0.50.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':
        continue
    elif i == 'x5':
        continue
    elif i == 'x7':
        continue
    else:
        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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐