Я бы предложил заполнить пропущенные значения -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
Примечание:
Обычноне случайный Форрест, а рекуррентные нейронные сети (например, LSTM) используются для таких задач временных рядов, как это.Однако для простоты я выбрал более простую модель.