首页 > 编程语言 >python用支持向量机回归(SVR)模型分析用电量预测电力消费|附代码数据

python用支持向量机回归(SVR)模型分析用电量预测电力消费|附代码数据

时间:2024-01-22 22:14:43浏览次数:38  
标签:elec 预测 python 数据 模型 用电量 神经网络 SVR 向量

全文链接:http://tecdat.cn/?p=23921

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

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

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

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

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

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

图片

导入一些包和数据

   
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。


点击标题查阅往期内容

图片

【视频】R语言广义相加模型(GAM)在电力负荷预测中的应用

图片

左右滑动查看更多

图片

01

图片

02

图片

03

图片

04

图片

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

   
## 将周末和节假日设置为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')

图片


图片

点击文末 “阅读原文”

获取全文完整资料。

本文选自《python用支持向量机回归(SVR)模型分析用电量预测电力消费》。

点击标题查阅往期内容

R语言进行支持向量机回归SVR和网格搜索超参数优化
逻辑回归、随机森林、SVM支持向量机预测心脏病风险数据和模型诊断可视化
R语言梯度提升机 GBM、支持向量机SVM、正则判别分析RDA模型训练、参数调优化和性能比较可视化分析声纳数据
R语言量化交易RSI策略:使用支持向量机SVM
基于随机森林、svm、CNN机器学习的风控欺诈识别模型
Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线
基于ARIMA、SVM、随机森林销售的时间序列预测
基于数据挖掘SVM模型的pre-incident事故预防预测
R语言用rle,svm和rpart决策树进行时间序列预测Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
随机森林优化贝叶斯预测分析汽车燃油经济性
Python基于粒子群优化的投资组合优化研究
matlab使用贝叶斯优化的深度学习:卷积神经网络CNN
R语言深度学习:用keras神经网络回归模型预测时间序列数据
Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类
R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)
MATLAB中用BP神经网络预测人体脂肪百分比数据
Python中用PyTorch机器学习神经网络分类预测银行客户流失模型
R语言实现CNN(卷积神经网络)模型进行回归数据分析
SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型
【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析
Python使用神经网络进行简单文本分类
R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析
R语言基于递归神经网络RNN的温度时间序列预测
R语言神经网络模型预测车辆数量时间序列
R语言中的BP神经网络模型分析学生成绩
matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类
R语言实现拟合神经网络预测和结果可视化
用R语言实现神经网络预测股票实例
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测
python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译
用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

标签:elec,预测,python,数据,模型,用电量,神经网络,SVR,向量
From: https://www.cnblogs.com/tecdat/p/17981176

相关文章

  • python接口测试-get请求
    用python做接口测试,需要了解和学习第三方模块:Requests。它是一个Python第三方库,处理URL资源特别方便。虽然Python内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。可以查看requests中文官网:http://cn.python-requests.org/zh_CN/latest/inde......
  • 书籍推荐-《Python技巧指南》
    书籍:PythonHow-To:63techniquestoimproveyourPythoncode作者:YongCui出版:Manning来源:公众号@一点人工一点智能关注 51CTO @一点人工一点智能,了解更多移动机器人&人工智能信息01  书籍介绍你是否问过自己,“我如何用Python实现这个?”如果是的话,那么你一定会喜欢这本实用......
  • Python Seaborn 绘制单变量分布
    ​ Seaborn库是一个基于Matplotlib的数据可视化库,它提供了更高级的接口来绘制各种统计图形,包括单变量分布图。要在Seaborn中绘制单变量分布,最常用的函数是distplot(在Seaborn的新版本中,这个函数被替换为displot和histplot)。1、使用distplot绘制单变量分布使用 distplot 函......
  • python中path[:]跟path有什么区别?
    问题:看到别写的算法里有path[:],不知道跟普通的有什么区别?AI答案:在Python中,`result.append(path[:])`和`result.append(path)`有本质的区别。result.append(path)这种方式,是将path列表的引用加入到result列表,如果后续更改了path列表,result中的相应元素也会随之改变。......
  • Python web crawler(5)多页网站拼接
    先搞单页网站:importrequestsfromlxmlimportetreeurl='https://*********.com/top250?start=1'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/120.0.0.0Safari/......
  • 使用 gdb 调试运行中的 Python 进程(转)
    addbyzhj: 虽然本文是以UbuntuPython2.7为例,但基本也适用于UbuntuPython3,但有两点不同1. aptintallpython<3.x>-dbg,这里的3.x是你要调试的Python程序使用的Python版本。如果你有两个Python程序需要调试,一个使用Python3.7,另一个使用Python3.9,那需要安装python3.7-dbg和pyt......
  • python学习笔记10(循环结构2)
    一)循环结构21、扩展模式语法:for循环变量in遍历对象:语句块1else:语句块2说明:else在循环结束后执行,通常和break和continue结合使用2、无限循环whilewhile表达式:语句块例子:answer=input('今天要上课么?y/n')whileanswer=='y':print('好好学习,天天向上')answer=input('今......
  • 快乐学Python,如何使用Python处理文件(csv、Excel、html)数据?
    在前面的文章中,我们了解了Python爬虫的一些内容。截止到现在,我们已经可以将需要的数据通过爬虫获取,并保存到CSV文件中。在有了数据集后,接下来我们就开始了解如何将数据集的内容加载到Python中。虽然在之前也有了解简单的读取csv数据。但是存在两个问题:只能读取csv文件,但数据分析......
  • python自动化测试学习路线(从入门到精通)
    python自动化测试学习路线(从入门到精通)一、Python的应用场景Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件;Python用于系统编程,如开发系统应用;Python用于开发网络爬虫;网络爬虫的用途是进行数据采集,也就是将互联网中的数据采集过来。网络爬虫的难点其......
  • 测试开发技术:Python测试框架Pytest的基础入门
    测试开发技术:Python测试框架Pytest的基础入门  Pytest简介Pytestisamaturefull-featuredPythontestingtoolthathelpsyouwritebetterprograms.Thepytestframeworkmakesiteasytowritesmalltests,yetscalestosupportcomplexfunctionaltesting......