• 时间序列预测作为监督学习


    1.问题提出

    时间序列是一列关于时间的序列,例如股票数据,在每一个时刻对应一个观察值或者多个观察值。

    像这样:

    time, measure

    1, 100
    2, 110
    3, 108
    4, 115
    5, 120

    正如我们所知大多数机器学习使用监督学习来解决实际问题,如何把这时间序列转换成我们所熟知的监督学习所适应的形式呢,然后用监督学习的方法来解决。

    像这样:

    X, y

    5, 0.9
    4, 0.8
    5, 1.0
    3, 0.7
    4, 0.9
    对于这样的数列无论是线性还是非线性我们很容易使用机器学习来找到映射函数。
    Y = f(X)

    2.滑动窗口(sliding window)用于时间序列

    该方法对时间进行重组,大致的意思是前一个时间序列的数值作为下一个时间序列数值的输入,就像马尔科夫定义一样

    当前时刻的状况只受上一个时刻的状态的影响。举例子说明

    time, measure

    1, 100
    2, 110
    3, 108
    4, 115
    5, 120
    对于这样一个时间序列使用滑动窗口方法重组后的结果是
    X, y
    ?, 100
    100, 110
    110, 108
    108, 115
    115, 120
    120, ?
    可以观察这条数列的一些规律
    • 我们可以看到前一个时间值是输入(X),下一个时间值是我们监督学习问题中的输出(y)。
    • 我们可以看到观察之间的顺序被保留,并且在使用该数据集训练监督模型时必须继续保留。
    • 我们可以看到,我们没有先前的值可用于预测序列中的第一个值。我们将删除此行,因为我们无法使用它。
    • 我们还可以看到,我们没有已知的下一个值来预测序列中的最后一个值。我们也可能希望在训练我们的监督模型时删除此值。

    3.具有多变量时间序列数据的滑动窗口

    什么是多变量时间序列,就是每次观察到两个或多个变量的数据集。例如:

    time, measure1, measure2

    1, 0.2, 88
    2, 0.5, 89
    3, 0.7, 87
    4, 0.4, 88
    5, 1.0, 90
    对于两个变量时间序列,那么输入变量也会变成两个,例如:
    X1, X2, X3, y
    ?, ?, 0.2 , 88
    0.2, 88, 0.5, 89
    0.5, 89, 0.7, 87
    0.7, 87, 0.4, 88
    0.4, 88, 1.0, 90
    1.0, 90, ?, ?

    我们可以看到第一行和最后两行不能用于训练监督模型。

    4.具有多步预测的滑动窗口

    • 一步预测:这是预测下一个时间步(t + 1)的地方。
    • 多步预测:这是预测两个或更多未来时间步骤的位置。

    考虑来自上面第一个滑动窗口示例的相同的单变量时间序列数据集:

    time, measure
    1, 100
    2, 110
    3, 108
    4, 115
    5, 120

    我们可以将这个时间序列构建为一个两步预测数据集,用于窗口宽度为1的监督学习,如下所示:

    X1, y1, y2
    ? 100, 110
    100, 110, 108
    110, 108, 115
    108, 115, 120
    115, 120, ?
    120, ?, ?

    具体而言,监督模型仅使用X1来预测y1y2

    5. 使用Python方法实现转换

    主要使用pandas中的shift()方法

    from pandas import DataFrame
    df = DataFrame()
    df['t'] = [x for x in range(10)]
    print(df)

    输出结果是

       t

    0  0
    1  1
    2  2
    3  3
    4  4
    5  5
    6  6
    7  7
    8  8
    9  9
    使用shift()方法
    from pandas import DataFrame
    df = DataFrame()
    df['t'] = [x for x in range(10)]
    df['t-1'] = df['t'].shift(1)
    print(df)

    输出结果

       t  t-1

    0  0  NaN
    1  1  0.0
    2  2  1.0
    3  3  2.0
    4  4  3.0
    5  5  4.0
    6  6  5.0
    7  7  6.0
    8  8  7.0
    9  9  8.0
     
    from pandas import DataFrame
    df = DataFrame()
    df['t'] = [x for x in range(10)]
    df['t+1'] = df['t'].shift(-1)
    print(df)

        t t+1
    0 0 1.0
    1 1 2.0
    2 2 3.0
    3 3 4.0
    4 4 5.0
    5 5 6.0
    6 6 7.0
    7 7 8.0
    8 8 9.0
    9 9 NaN

    其实就是对t列进行有限步移动获得t-1或者t+1列

    更多知识:https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/

  • 相关阅读:
    5.7填数字游戏求解
    5.6判断回文数字
    5.5百钱买百鸡问题
    5.4三色球问题
    5.3哥德巴赫猜想的近似证明
    5.2求两个数的最大公约数和最小公倍数
    5.1舍罕王的失算
    4.19递归反向输出字符串
    Elasticsearch 安装
    linux 安装nginx步骤
  • 原文地址:https://www.cnblogs.com/zhxuxu/p/10271890.html
Copyright © 2020-2023  润新知