最近我们被客户要求撰写关于支持向量机回归的研究报告,包括一些图形和统计输出。

本文描述了训练支持向量回归模型的过程,该模型用于预测基于几个天气变量、一天中的某个小时、以及这一天是周末/假日/在家工作日还是普通工作日的用电量。

【视频】支持向量机SVM、支持向量回归SVR和R语言网格搜索超参数优化实例

支持向量机SVM、支持向量回归SVR和R语言网格搜索超参数优化实例

,时长07:24

关于支持向量机的快速说明

支持向量机是机器学习的一种形式,可用于分类或回归。尽可能简单地说,支持向量机找到了划分两组数据的最佳直线或平面,或者在回归的情况下,找到了在容差范围内描述趋势的最佳路径。

对于分类,该算法最大限度地减少了对数据进行错误分类的风险。

对于回归,该算法使回归模型在某个可接受的容差范围内没有获得的数据点的风险最小化。

导入一些包和数据


import pandas as pd # 对于数据分析,特别是时间序列
import numpy as np # 矩阵和线性代数的东西,类似MATLAB
from matplotlib import pyplot as plt # 绘图

Scikit-learn是Python中的大型机器学习包之一。

from sklearn import svm
from sklearn import cross_validation
from sklearn import preprocessing as pre

在此随机插入更好的数据可视化。

# 设置颜色
graylight = '#d4d4d2'
gray = '#737373'
red = '#ff3700'

我在这个模型中使用的数据是通过公寓中安装的智能电表中获得的。

USAGE "字段给出了该小时内的用电度数。


elec.head(3)

Out[5]:

天气数据提取。


weather.head()

预处理

合并电力和天气

首先,我们需要将电力数据和天气数据合并到一个数据框中,并去除无关的信息。


# 合并成一个Pandas数据框架pd.merge(weather, elec,True, True)# 从数据框架中删除不必要的字段
del elec['tempm'], elec['cost']# 将风速转换为单位elec['wspdm'] * 0.62elec.head()

fig = plt.figure(figsize=[14,8])elecweather['USAGE'].plot

我想将典型的工作日与周末、假日和在家工作的日子区分开来。所以现在所有的正常工作日都是0,所有的假期、周末和在家工作的日子都是1。

分类变量:平日与周末/假期/在家工作日


## 将周末和节假日设置为1,否则为0
elecwea['Day'] = np.zeros# 周末
elecwea['Atypical_Day'][(elecwea.index.dawe==5)|(elecwea.index.dawe==6)] = 1# 假期,在家工作日
假期 = ['2014-01-01','2014-01-20']
workhome = ['2014-01-21','2014-02-13','2014-03-03','2014-04-04']for i in range(len(holiday)):elecwea['Day'][elecwea.index.date==np.datetime64(holidays[i])] = 1
for i in range(len(workhome)):elecwea['Day'][elecwea.index.date==np.datetime64(workhome[i]) ] = 1elecwea.head(3)

更多的分类变量:一周中的一天,小时

在这种情况下,一天中的每个小时是一个分类变量,而不是连续变量。做分析时,需要对一天中的每一个小时进行 "是 "或 "否 "的对应。


# 为一天中的每个小时创建新的列,如果index.hour是该列对应的小时,则分配1,否则分配0for i in range(0,24):elecweat[i] = np.zeros(len(elecweat['USAGE'))elecweat[i][elecweat.index.hour==i] = 1# 例子 3am
elecweat[3][:6]

时间序列:需要附加上以前的用电需求的历史窗口

由于这是一个时间序列,如果我们想预测下一小时的能耗,训练数据中任何给定的X向量/Y目标对都应该提供当前小时的用电量(Y值,或目标)与前一小时(或过去多少小时)的天气数据和用量(X向量)。


# 在每个X向量中加入历史用量# 设置预测的提前小时数
hours = 1# 设置历史使用小时数
hourswin = 12for k in range(hours,hours+hourswin):elec_weat['USAGE-%i'% k] = np.zero(len(elec_weat['USAGE'])for i in range(hours+hourswi,len(elecweat['USAGE']))。)for j in range(hours,hours+hourswin):elec_weat['USAGE-%i'% j][i] = elec_weat['USAGE]i-j] 。elec_weat.head(3)

分成训练期和测试期

由于这是时间序列数据,定义训练期和测试期更有意义,而不是随机的零星数据点。如果它不是一个时间序列,我们可以选择一个随机的样本来分离出一个测试集。


# 定义训练和测试期
train_start = '18-jan-2014'(训练开始)。
train_end = '24-march-2014'.
test_start = '25-march-2014'(测试开始)。
test_end = '31-march-2014'。
# 分成训练集和测试集(仍在Pandas数据帧中)。xtrain = elec_and_weather[train_start:train_end]。
del xtrain['US']
del xtrain['time_end']ytrain = elec_and_weather['US'][train_start:train_end] 。

将训练集输出成csv,看得更清楚。

X_train_df.to_csv('training_set.csv')

scikit-learn包接收的是Numpy数组,而不是Pandas DataFrames,所以我们需要进行转换。

# 用于sklearn的Numpy数组X_train = np.array(X_train_df)

标准化变量

所有的变量都需要进行标准化。该算法不知道每个变量的尺度是什么。换句话说,温度一栏中的73的值看起来会比前一小时的千瓦时使用量中的0.3占优势,因为实际值是如此不同。sklearn的预处理模块中的StandardScaler()将每个变量的平均值去除,并将其标准化为单位方差。当模型在按比例的数据上进行训练时,模型就会决定哪些变量更有影响力,而不是由任意的比例/数量级来预先决定这种影响力。

训练SVR模型

将模型拟合训练数据!

SVR_model = svm.SVR(kernel='rbf',C=100,gamma=.001).fit(X_train_scaled,y_train)
print 'Testing R^2 =', round(SVR_model.score(X_test_scaled,y_test),3)

预测和测试

计算下一小时的预测(预测!)我们预留了一个测试数据集,所以我们将使用所有的输入变量(适当的缩放)来预测 "Y "目标值(下一小时的使用率)。


# 使用SVR模型来计算预测的下一小时使用量SVRpredict(X_test_scaled)# 把它放在Pandas数据框架中,以便于使用
DataFrame(predict_y)

绘制测试期间的实际和预测电力需求的时间序列。


# 绘制预测值和实际值plt.plot(index,y_test_df,color='k')
plt.plot(predictindex,predict_y)

重新取样的结果为每日千瓦时


### 绘制测试期间的每日总千瓦时图y_test_barplot
ax.set_ylabel('每日总用电量(千瓦时)')# Pandas/Matplotlib的条形图将x轴转换为浮点,所以需要找回数据时间
ax.set_xticklabels([dt.strftime('%b %d') for dt in

误差测量

以下是一些精度测量。

len(y_test_df)

均方根误差

这实际上是模型的标准误差,其单位与预测变量(或这里的千瓦时)的单位相同。

calcRMSE(predict_y, y_test_df)

平均绝对百分比误差

用这种方法,计算每个预测值和实际值之间的绝对百分比误差,并取其平均值;计量单位是百分比。如果不取绝对值,而模型中又没有什么偏差,你最终会得到接近零的结果,这个方法就没有价值了。

errorsMAPE(predict_y, y_test_df)

平均偏置误差

平均偏差误差显示了模型的高估或低估情况。初始SVM模型的平均偏差误差为-0.02,这表明该模型没有系统地高估或低估每小时的千瓦时消耗。

calcMBE(predict_y, y_test_df)

变异系数

这与RMSE类似,只是它被归一化为平均值。它表明相对于平均值有多大的变化。

这与RMSE类似,只是它被归一化为平均值。它表明相对于平均值有多大的变化。


plot45 = plt.plot([0,2],[0,2],'k')


python用支持向量机回归(SVR)模型分析用电量预测电力消费相关推荐

  1. 【算法】灰狼算法GWO优化支持向量机回归SVR模型

    灰狼算法GWO介绍 GWO是一种基于灰狼行为的优化算法,由Mirjalili等人于2014年提出.该算法模拟灰狼群的捕猎行为,通过模拟狼群中的Alpha.Beta.Delta三种角色的行为来实现全局优 ...

  2. python svr回归_机器学习入门之机器学习之路:python支持向量机回归SVR 预测波士顿地区房价...

    本文主要向大家介绍了机器学习入门之机器学习之路:python支持向量机回归SVR  预测波士顿地区房价,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 支持向量机的两种核函数模型进行预 ...

  3. 支持向量机回归python_python 机器学习之支持向量机非线性回归SVR模型

    本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下: import numpy as np import matplotlib.pyplot as plt from skle ...

  4. 回归预测 | MATLAB实现SVR支持向量机回归多输入单输出预测

    回归预测 | MATLAB实现SVR支持向量机回归多输入单输出预测 目录 回归预测 | MATLAB实现SVR支持向量机回归多输入单输出预测 基本介绍 模型描述 程序设计 学习总结 基本介绍 支持向量 ...

  5. python信用评分卡_基于Python的信用评分卡模型分析(二)

    上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...

  6. 回归——支持向量机回归(SVR)

    支持向量机回归(SVR)是支持向量机在回归问题上的应用模型.支持向量机回归模型基于不同的损失函数产生了很多变种.本文仅介绍基于ϵ\epsilonϵ不敏感损失函数的SVR模型. 核心思想 找到一个分离超 ...

  7. ❤️解决非线性回归问题的机器学习方法总结:多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型

    文章目录 前言 多项式回归模型 概念解释: sklearn实现多项式回归模型: 广义线性可加(GAM)模型 概念解释: pygam实现广义线性可加模型: GAM模型的优点与不足: 回归树模型 概念解释 ...

  8. 多元回归分析 | SVR支持向量机回归多输入单输出预测(Matlab完整程序)

    多元回归分析 | SVR支持向量机回归多输入单输出预测(Matlab完整程序) 目录 多元回归分析 | SVR支持向量机回归多输入单输出预测(Matlab完整程序) 预测结果 评价指标 基本介绍 程序 ...

  9. 使用python及相关库实现AQI分析与预测

    使用python及相关库实现AQI分析与预测 前言 一.需求背景 二.提出问题 三.数据预览 四.数据清洗 五.数据分析 六.总结 前言 一.需求背景 AQI(Air Quality Index),即 ...

最新文章

  1. python安装教程windows-PyCharm 安装教程(Windows)
  2. Hello Blazor:(11)全局截获事件执行
  3. 用Flink取代Spark Streaming!知乎实时数仓架构演进
  4. (11)FPGA跨时钟域处理(第3天)
  5. qt creator php扩展,用qt creator搭建开发、调试php扩展的环境
  6. 使expect脚本传回返回值
  7. RegExp 误用解析
  8. html制作跑马灯,html跑马灯制作
  9. java中语言转换方法_语言切换的三种方法
  10. 大数据平台及挖掘调研
  11. EXCEL数据行数达上线,读取发生错误
  12. 我国IPTV研究目前已达到全球领先水平
  13. chrome浏览器无法安装crx插件的解决方法(以翻译插件为例)
  14. 深入Golang Runtime之Golang GC的过去,当前与未来
  15. java resultset 获取列名_ResultSet 动态获取列名 | 学步园
  16. python降低图片分辨率_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
  17. Easyui datagrid detailview使用简介
  18. Python学习之title()函数
  19. ubuntu 20.04 安装 免费 Beyond Compare对比工具
  20. 巧用10行python 代码让JMETER实现动态验证码登录

热门文章

  1. 中国联通短信如何 对接
  2. vue-cli搭建过程出错问题总结
  3. 【方法】睡眠操作清单
  4. Nginx给指定目录加密,静态文件(设计图)原型部署
  5. 计算机专业大学生供需现状和就业形势
  6. 线上python培训费用大概多少
  7. layui多级联动下拉框的实现_layui下拉框实现级联
  8. HTML代码兼容IE浏览器
  9. FPGA uart+sdram+vga传图
  10. 如何调整照片人物年龄,此生也算共白头,PaddleGAN开源项目安装使用 | 机器学习