在基于时间序列的负荷预测问题,如何处理缺失值

时间:2019-02-01 17:03:30

标签: python machine-learning time-series prediction

我正在分析带有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

让我们当我读到这个文件的熊猫数据帧为我的预测模型,我填写所有分钟的2小时0发言权?还是有更好的智能方式来处理这种情况?

3 个答案:

答案 0 :(得分:2)

我建议用-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()

enter image description here

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 :(得分:1)

一种方法是用滚动平均值填充缺失的日期。否则,如果您将模型与其他缺少日期的值进行拟合,例如说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

答案 2 :(得分:0)

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