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

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

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

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

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

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

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

导入一些包和数据

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


相关文章
|
7天前
|
机器学习/深度学习 数据采集 传感器
使用Python实现深度学习模型:智能土壤质量监测与管理
使用Python实现深度学习模型:智能土壤质量监测与管理
130 69
|
2天前
|
机器学习/深度学习 数据采集 存储
使用Python实现智能农业灌溉系统的深度学习模型
使用Python实现智能农业灌溉系统的深度学习模型
25 6
|
3天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
27 7
|
2天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
11 3
|
4天前
|
机器学习/深度学习 数据采集 算法框架/工具
使用Python实现深度学习模型:智能野生动物保护与监测
使用Python实现深度学习模型:智能野生动物保护与监测
19 5
|
3天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
10 2
|
6天前
|
机器学习/深度学习 数据采集 算法框架/工具
使用Python实现智能生态系统监测与保护的深度学习模型
使用Python实现智能生态系统监测与保护的深度学习模型
29 4
|
7天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
20 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
8天前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化
|
9天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
25 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式