我正在分析带有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发言权?还是有更好的智能方式来处理这种情况?
答案 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()
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(),它将自动处理缺失值和异常值。