0

    训练SVR模型将模型拟合训练数据!预测和测试计算下一小时的预测

    1年前 | admin | 139次围观

    01

    基于组合预测方法的风电场短期风速预测_svm股票预测_svm 风速预测代码

    02

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

    03

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

    04

    svm 风速预测代码_基于组合预测方法的风电场短期风速预测_svm股票预测

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

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

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

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

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

    # 为一天中的每个小时创建新的列,如果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\]

    基于组合预测方法的风电场短期风速预测_svm 风速预测代码_svm股票预测

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

    由于这是一个时间序列,如果我们想预测下一小时的能耗,训练数据中任何给定的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)

    svm 风速预测代码_svm股票预测_基于组合预测方法的风电场短期风速预测

    分成训练期和测试期

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

    # 定义训练和测试期
    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)

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

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

    ### 绘制测试期间的每日总千瓦时图


    y\_test\_barplot
    ax.set_ylabel('每日总用电量(千瓦时)')

    # Pandas/Matplotlib的条形图将x轴转换为浮点,所以需要找回数据时间
    ax.set_xticklabels(\[dt.strftime('%b %d') for dt in

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

    误差测量

    以下是一些精度测量。

    len(y\_test\_df)

    均方根误差

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

    calcRMSE(predict\_yy\_test_df)

    平均绝对百分比误差

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

    errorsMAPE(predict\_yy\_test_df)

    平均偏置误差

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

    calcMBE(predict\_yy\_test_df)

    变异系数

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

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

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

    svm股票预测_基于组合预测方法的风电场短期风速预测_svm 风速预测代码

    svm股票预测_svm 风速预测代码_基于组合预测方法的风电场短期风速预测

    发表评论