【问题标题】:In a time series based load prediction problem, how to deal with missing values在基于时间序列的负载预测问题中,如何处理缺失值
【发布时间】:2019-06-26 07:07:03
【问题描述】:

我正在分析一个带有 http 请求日志的 aws 日志文件,我需要预测下一分钟的预期负载(请求数)。但是,我看到有些时间跨度没有任何日志。在这种情况下,我是假设那些时间的负载仅为 0,还是需要进行某种插值?

time                     load
-----------------------------------
2018-11-07 09:45:00      40
2018-11-07 09:46:00      45
2018-11-07 09:47:00      34
2018-11-07 09:48:00      56

然后在接下来的 2 小时内没有日志,然后又是:

time                     load
-----------------------------------
2018-11-07 11:50:00      54
2018-11-07 11:51:00      34
2018-11-07 11:52:00      23
2018-11-07 11:53:00      21

假设当我将此文件读取到我的预测模型的 pandas 数据框时,我是否将这 2 小时的所有分钟都填写为 0?还是有更好的智能方法来处理这种情况?

【问题讨论】:

    标签: python machine-learning time-series prediction


    【解决方案1】:

    我建议用 -1 填充缺失值。 ML 模型应该学会处理这个问题。使用运行平均值或其他插值方法填充值时,您强制执行可能无法正确表示数据的函数。模型应该学会自己处理缺失值(并找到在测量值之间进行插值的最佳方法)。

    这里有一个示例:模型采用最后 5 个时间步长来预测后续的未来时间戳。

    import numpy as np
    from sklearn.ensemble import RandomForestRegressor
    import matplotlib.pylab as plt
    
    timeline = np.array([40, 45, 50, 53, 54, None, None, None, 50, 43, 30, 
                         20, 15, 14, 13, 14, 16, 21, 27, 35, 46, 59, 65, 70, 
                         None, None, 74, 72, 70, 65, 56, 44, 32, 26, 21, 18, 
                         17, 16, 16, 17, 23, None, 47, 60, 75, None, 105, 
                         111, 116, 118, 119, 118, 112, 103, None, None, 
                         60, 53, 51, 52, 55, 62, None, 75, 77, 76, 74, 63, 
                         50, 35])
    
    plt.figure()
    plt.plot(timeline)
    plt.xlabel("time_index")
    plt.ylabel("requests")
    plt.show()
    

    timeline[timeline==None] = -1
    
    def get_training_data(timeline, n_time_steps=5):
        x = []
        y = []
        for i in range(n_time_steps, len(timeline)):
            x.append(timeline[i-n_time_steps:i])
            y.append(timeline[i])
        return np.array(x), np.array(y)
    
    x, y = get_training_data(timeline)
    
    from sklearn.ensemble import RandomForestRegressor
    model = RandomForestRegressor()
    
    # train model
    model.fit(x, y)
    
    pred = model.predict([y[-5:]])[0]
    print 'the prediction for the future timestamp is:', pred
    

    未来时间戳的预测是:30.8

    现在,如果您有未知的值也可以:

    model.predict(np.array([[10, 20, 30, -1, -1]]))
    

    46.5

    注意:

    通常不是随机 Forrest,而是循环神经网络(例如 LSTM)用于此类时间序列任务。但是,为了简单起见,我选择了一个更简单的模型。

    【讨论】:

    • 但是填充 -1 究竟对预测有何帮助?
    • 我添加了一些描述和一个例子来明确我的意思
    【解决方案2】:

    一种方法是用滚动平均值填充缺失的日期。否则,如果您在哪里使用缺失日期的其他值拟合模型,例如0,模型可能还会考虑这些值以进行预测,(鉴于无法预测哪些日期将具有缺失值) ,这肯定会使预测结果变差。

    所以说你有:

      time                 load
    0 2018-11-07 09:45:00    40
    1 2018-11-07 09:46:00    45
    2 2018-11-07 09:47:00    34
    3 2018-11-07 09:49:00    56
    

    您可以首先使用 .resample 重新采样数据框,然后使用 .rolling 填充缺失值,这将填充给定窗口长度的滚动平均值:

    df.time = pd.to_datetime(df.time)
    resampled = df.set_index('time').resample('Min').first()
    fill = resampled.rolling(3,center=True,min_periods=1).mean()
    resampled.fillna(fill)
    
                        load
    time                     
    2018-11-07 09:45:00  40.0
    2018-11-07 09:46:00  45.0
    2018-11-07 09:47:00  34.0
    2018-11-07 09:48:00  45.0
    2018-11-07 09:49:00  56.0
    

    【讨论】:

      【解决方案3】:

      使用tsclean(),它会自动处理缺失值和异常值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-24
        • 2020-04-30
        • 2020-01-06
        相关资源
        最近更新 更多