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

2023-11-01

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

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

【视频】支持向量机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.62

elec.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]) ] = 1
 
elecwea.head(3)

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

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


# 为一天中的每个小时创建新的列,如果index.hour是该列对应的小时,则分配1,否则分配0

for 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 = 12


for 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')


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 加拿大安省欢ajax,加拿大安省省考OSSLT介绍

    原标题 加拿大安省省考OSSLT介绍 加拿大省考相当于中国的会考 必须通过才可以取得加拿大高中毕业证 不同省份的省考 BC省除外 目前已取消省考 对申请大学的影响不同 安大略省的省考只有一门课 即由安大略省教育质量和问责办公室 EQAO 举
  • Sqoop简介、原理、安装、简单使用案例、一些常用命令及参数

    问题导读1 Sqoop原理是怎样的 2 如何利用Sqoop导入数据 3 如何利用Sqoop导出数据 4 Sqoop常用的命令及对应参数有哪些 第1章 Sqoop 简介 Sqoop 是一款开源的工具 主要用于在 Hadoop Hive 与传统
  • vector 的作用

    c 中 vector作为容器 它的作用是 一个动态数组模板类 你可以把它当做一个普通数组用 但是他的功能远比一般数组强大 数组最大的不好就是数组长度的限制和删除其中一个时候的后续移位问题 这些在vector中都得到了完美的解决 而且可以存储
  • 教你一步步创建属于自己的Python爬虫代理IP池(含代码示例)

    前言 在进行网络数据采集时 遇到反爬虫限制是常见的问题 使用代理IP可以帮助我们绕过这些限制 保护自己的爬虫程序 本文将教您如何使用Python创建属于自己的代理IP池 以便获取可用的代理IP并应用于 Python爬虫程序 同时 我们将提供
  • 关于Qt调用多/两次setupUi导致信号与槽自动连接失败问题

    代码场景 函数内部调用两次 setupUi okBtn自动连接槽函数失效 问题分析 在 setupUi 函数内部调用了这么一个函数 connectSlotsByName 从函数名来看就是通过名字 部件名 连接信号与槽 官方文档的解释 所以流
  • Spring@Autowired注解与自动装配

    今天在预发布环境配置一个manager的时候 应用启动失败 报错 Caused by org springframework beans factory BeanCreationException Could not autowire fi
  • ELK日志采集平台(四)---轻量级采集工具metricbeat

    目录 一 安装metricbeat 二 与kibana数据可视化联用 logstash是负责采集数据的 是入口 流向为logstash gt ES gt kibana 但是它的资源消耗很大 有时候没那么多内存给他占用 同时有些定制的采集指标
  • 使用freemaker 导出word 包含分页,表格循环java

    在平时项 目开发中 相信或多或少的都遇到过word导出的需求 这里整理一个比较全面的java word导出方法 希望可以跟大家一起交流学习 创建word模板 1 1 新建一个word模板 并修改字段 2 将word文件另存为xml 格式 打
  • 进程 第三天 (线程&线程间通信)

    印象笔记 进程 第三天 线程 线程间通信 一 线程简介 1 线程的基本概念 通过之前的学习我们知道 进程是系统中资源执行和资源分配的最小单位 每个进程都有自己独立的数据区 代码区 堆栈区等 这就造成了当进程切换时 操作系统需要额外的操作来清
  • Git使用教程:超详细、超傻瓜、超浅显、真正手把手教

    作者 涂根华 原文链接 https www cnblogs com tugenhua0707 p 4050072 html https mp weixin qq com s M DoeWWSRI P5Et6hm0BIw
  • PowerToys安装

    PowerToys 是微软开发者开发的免费实用工具集 可以用于高级用户调整和简化 Windows 操作 以提高效率 官网安装方法 https learn microsoft com zh cn windows powertoys insta
  • Oracle数据库startup mount时的报错处理(ORA-01078&LRM-00109)

    安装监听 Disconnected oracle rac1 netca Oracle Net Services Configuration oracle rac1 sqlplus as sysdba SQL Plus Release 11
  • 在win10系统下不能运行VC++6.0的解决方法

    win10系统下出现 VC6 0应用程序无法正常启动 0x0000142 解决方法 将英文版的MSDEV exe文件复制粘贴替换到vc 6 0 Microsoft Visual Studio Common MSDev98 Bin文件目录下运
  • 树莓派4B-串口、多串口配置及详细使用攻略

    相比树莓派零 1 2 以及 3 的双串口 UART0 PL011 和 UART1 mini UART 树莓派4 中新增了 4 个 PL011 串口共计有 6 个 UART 整理此笔记用作记录和配置参考 注意 目前搜到的大多数描述树莓派 4
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • Openresty(二十一)ngx.balance和balance_by_lua灰度发布

    一 openresty实现灰度发布 灰度发布 说明 早期 博客对 灰度 发布的 概念 进行解读 并且对 原生 nginx 灰度实现进行讲解 后续 主要拿 节点引流 的灰度发布 并且关注 gray灰度策略 相关借鉴 回顾HTTP反向代理流程
  • idea创建springboot项目和springcloud项目方法

    一 创建springboot项目 1 选择File gt New gt Project gt Spring Initialer gt 点击Next 2 填写项目相关的信息 gt 点击next 3 选择web gt web gt 点击next
  • 利用PyCharm操作Github(二):分支新建、切换、合并、删除

    在文章利用PyCharm操作Github 仓库新建 更新 代码回滚中 我们已经学习到了如何利用PyCharm来操作Github 其中包括了一些常见的Github操作 仓库的新建 更新以及代码回滚 在本文中 我们将介绍Git的另一部分的常见操
  • LVS+Keepalived 实现高可用负载均衡

    一 Keepalived介绍 keepalived是在Linux系统下的一个轻量级的高可用解决方案 是使用C语言编写的 在 Keepalived 中实现了一组检查器 可以根据服务集群中服务器的健康状态 自动的进行动态主备切换 管理 VRRP
  • python用支持向量机回归(SVR)模型分析用电量预测电力消费

    最近我们被客户要求撰写关于支持向量机回归的研究报告 包括一些图形和统计输出 本文描述了训练支持向量回归模型的过程 该模型用于预测基于几个天气变量 一天中的某个小时 以及这一天是周末 假日 在家工作日还是普通工作日的用电量 视频 支持向量机S