机器学习实战:支持向量机回归预测财政收入
机器学习实战:支持向量机回归预测财政收入数据集说明数据集特征说明特征分析特征可视化导入数据可视化特征相关性检测绘制相关矩阵打印Pearson相关系数多变量研究Lasso特征选择模型进行特征提取alpha(正则项系数)的参数选择进行特征选取使用核函数进行预测数据预处理,拆分数据集,分成训练集和测试集进行预测绘制财政实际收入与预测收入的对比图进行简单预测模型评价MSE(均方误差)RMSE(均方根误差)
机器学习实战:支持向量机回归预测财政收入
这是一个财政收入预测的一个实战,我们将会对做了基本处理的数据进行特征分析,然后选取特征利用支持向量机回归预测未来的财政收入。
数据集说明
数据集
特征说明
属性 | 名称 |
---|---|
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~ 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':
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
更多推荐
所有评论(0)