В задаче прогнозирования нагрузки на основе временных рядов, как бороться с отсутствующими значениями - PullRequest
0 голосов
/ 01 февраля 2019

Я анализирую файл журнала aws с протоколами http-запросов, и мне нужно спрогнозировать ожидаемую нагрузку (количество запросов) в следующую минуту.Тем не менее, я вижу, что есть периоды времени, когда нет никаких журналов.В этом случае я предполагаю, что нагрузки в те времена были только 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?Или есть более разумные способы решения подобных ситуаций?

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Один из способов - заполнить пропущенные даты скользящим средним.В противном случае, если вы хотите, чтобы модель соответствовала другим значениям для пропущенных дат, скажем 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
0 голосов
/ 04 февраля 2019

используйте tsclean (), он будет автоматически обрабатывать пропущенные значения и выбросы.

0 голосов
/ 01 февраля 2019

Я бы предложил заполнить пропущенные значения -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

Примечание:

Обычноне случайный Форрест, а рекуррентные нейронные сети (например, LSTM) используются для таких задач временных рядов, как это.Однако для простоты я выбрал более простую модель.

...