全文链接:http://tecdat.cn/?p=23921
最近咱们被客户要求撰写对于 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')
点击文末 “浏览原文”
获取全文残缺材料。
本文选自《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 神经网络分类