Множественная регрессия на данных датчика временного ряда - PullRequest
0 голосов
/ 03 октября 2019

Я работаю над проблемой регрессии, где у меня есть 12 столбцов данных датчиков (независимых) и 1 выходной столбец, все из которых дискретизированы с частотой 48 кГц. У меня всего 420 секунд данных поезда. В наборе тестовых данных у меня есть 12 столбцов данных датчика, и мне нужно предсказать вывод.

До сих пор я пробовал классические алгоритмы машинного обучения без учета временных характеристик. Я новичок во временных рядах и не уверен, является ли это проблемой прогнозирования временных рядов.

Я не уверен, могу ли я считать это проблемой многомерного временного ряда и пробовать LSTM / RNN. Я следил за https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/#comment-442845, но не смог понять, как я могу прогнозировать данные теста.

Нужно ли добавлять новый столбец для преобразования данных теста из (length, 12) в (length), 13) и затем предсказывать по одной строке и использовать выходные данные для следующей итерации?

Кроме того, есть ли правильный подход для решения такого рода проблемы или мне нужно подумать о чем-то еще?

ОБНОВЛЕНИЕ Обновление моего вопроса по комментариям ниже. Допустим, мои данные о поездах выглядят так, как показано ниже (обновленный заголовок, чтобы лучше объяснить). Я тренирую сеть LSTM так же, как упомянуто в ссылке выше. Я создал Y (t), Y (t-1), x1 (t-1), x2 (t-1), x3 (t-1), x4 (t-1), x5 (t-1),x6 (t-1) с использованием функции series_to_supervised .

                           Y     x1   x2    x3         x4      x5      x6
date                                                                          
2010-01-02 00:00:00      129.0  -16  -4.0  1020.0      SE     1.79     0     
2010-01-02 01:00:00      148.0  -15  -4.0  1020.0      SE     2.68     0     
2010-01-02 02:00:00      159.0  -11  -5.0  1021.0      SE     3.57     0     
2010-01-02 03:00:00      181.0   -7  -5.0  1022.0      SE     5.36     1     
2010-01-02 04:00:00      138.0   -7  -5.0  1022.0      SE     6.25     2     

Теперь у меня есть тестовые данные без столбца Y. Как пример,

                          x1   x2    x3         x4      x5      x6
date                                                                          
2010-01-02 00:00:00      -11  -6.0  1020.0      SE     1.79     0     
2010-01-02 01:00:00      -12  -1.0  1020.0      SE     2.68     0     
2010-01-02 02:00:00      -10  -4.0  1021.0      SE     3.57     0     
2010-01-02 03:00:00      -7   -2.0  1022.0      SE     5.36     1     
2010-01-02 04:00:00      -7   -5.0  1022.0      SE     6.25     2     

Что я сделал. Я добавил поддельный столбец Y с нулевым заполнением и заменил первое значение на среднее значение для столбца поезда Y . Моя идея состоит в том, чтобы использовать прогнозируемое значение t-1 в следующем прогнозе. Я не знаю, как я могу получить это легко. Я придумал следующую логику.

Фрагмент кода

#test_pd is panda frame of size Nx6
#train_pd is panda frame of size Nx5

test_pd['Y'] = 0
train_out_mean = train_pd[0].mean()
test_pd[0][0] = train_out_mean
test_pd = test_pd.values.reshape((test_pd.shape[0],1,test_pd.shape[1]))
out_list = list()
out_list.append(train_out_mean)
for i in range(test_pd.shape[0]):

    y = loaded_model.predict(test_pd[i].reshape(1,test_pd.shape[1],test_pd.shape[2]))
    y = y[0]
    out_list.append(y)
    if (i+1>=test_pd.shape[0]):
        break
    test_pd[i+1][0][0] = y

У меня есть два дополнительных вопроса.

  1. Является ли вышеуказанный подход теоретически правильным для решения проблемы?

  2. Если да, то есть ли лучший способ прогнозировать набор тестовых данных?

1 Ответ

1 голос
/ 03 октября 2019

Я хотел бы начать с более простого подхода, прежде чем переходить к более сложным алгоритмам, таким как LSTM .

Здесь, в StackOverflow, вам следует объективно задать некоторые сомнения относительно кода. Так что, если вы поделитесь частью своего кода здесь, мы можем попытаться помочь вам.

Учитывая, что у вас есть такой временной ряд (пример в вашей ссылке):

                     pollution  dew  temp   press wnd_dir  wnd_spd  snow  rain
date                                                                          
2010-01-02 00:00:00      129.0  -16  -4.0  1020.0      SE     1.79     0     0
2010-01-02 01:00:00      148.0  -15  -4.0  1020.0      SE     2.68     0     0
2010-01-02 02:00:00      159.0  -11  -5.0  1021.0      SE     3.57     0     0
2010-01-02 03:00:00      181.0   -7  -5.0  1022.0      SE     5.36     1     0
2010-01-02 04:00:00      138.0   -7  -5.0  1022.0      SE     6.25     2     0

более простой подход: MLP Regressor

В более простом подходе, предполагая, что вы хотелиЧтобы предсказать загрязнение, вы можете построить MLP Regressor , поэтому на этапе обучения вы должны разделить данные на 7 функций (роса, температура, нажатие, wnd_dir, wnd_spd, снег, дождь), чтобы предсказатьзагрязнение окружающей среды. Вот пример:

from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
from sklearn import metrics

data = dataset.values

# integer encode WIND direction
encoder = LabelEncoder()
data[:,4] = encoder.fit_transform(data[:,4])

scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(data)

y, X = np.split(data,[1],axis=1) 

mlp = MLPRegressor(learning_rate_init=0.001)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

print (X_train.shape, y_train.shape)
print (X_test.shape, y_test.shape)

mlp.fit(X_train,y_train)

y_prediction = mlp.predict(X_test)

print("R2 score:", metrics.r2_score(y_test, y_prediction))

Вывод:

R2 score: 0.30376681842945985

в LSTM (Вам необходимо: 3D [сэмплы, временные шаги, функции])

NOW , предположим, что некоторая особенность (ветер, давление воздуха и т. Д.) В настоящий момент ** t-1 **, ** t-2 ** (1 час, 2 часа) оказывает некоторое влияние на момент ** t**. Итак, теперь вы намереваетесь решить свою проблему как временной ряд, фиксируя некоторое изменение скорости ветра (например) в течение некоторого времени. Поэтому теперь имеет смысл использовать LSTM.

Итак, функция series_to_supervised (пример вашей ссылки) поможет вам создавать новые функции ...

Функция series_to_supervised имеет 4 аргумента:

  • data: последовательность наблюдений в виде списка или двумерного массива NumPy.
  • n_in: количество наблюдений с задержкой в ​​качестве входных данных (X),Значения могут быть между [1..len (data)]
  • n_out: количество наблюдений в качестве выходных данных (y). Значения могут быть в диапазоне [0..len (data) -1].
  • dropnan: Boolean: отбрасывать строки со значениями NaN или нет

Итак, предположим, что эта серия единственнаяодна функция X и метка y:

                        X   y
2018-01-01 00:00:00     1   2
2018-01-01 01:00:00     2   3
2018-01-01 02:00:00     3   4
2018-01-01 03:00:00     4   5
2018-01-01 04:00:00     5   6
2018-01-01 05:00:00     6   7
2018-01-01 06:00:00     7   8
2018-01-01 07:00:00     8   9
2018-01-01 08:00:00     9   10
2018-01-01 09:00:00     10  11

Использование этой функции series_to_supervised (df.values, n_in = 2, n_out = 1, dropnan = False) у вас будет что-то подобное(Я сделал несколько улучшений, чтобы понять):

                        X(t-2)   y(t-2)   X(t-1)   y(t-1)   X(t)   y(t)
2018-01-01 00:00:00       NaN     NaN     NaN        NaN     1      2
2018-01-01 01:00:00       NaN     NaN     1.0        2.0     2      3
2018-01-01 02:00:00       1.0     2.0     2.0        3.0     3      4
2018-01-01 03:00:00       2.0     3.0     3.0        4.0     4      5
2018-01-01 04:00:00       3.0     4.0     4.0        5.0     5      6
2018-01-01 05:00:00       4.0     5.0     5.0        6.0     6      7
2018-01-01 06:00:00       5.0     6.0     6.0        7.0     7      8
2018-01-01 07:00:00       6.0     7.0     7.0        8.0     8      9
2018-01-01 08:00:00       7.0     8.0     8.0        9.0     9      10
2018-01-01 09:00:00       8.0     9.0     9.0        10.0    10     11

Итак, в этом подходе мы считаем, что для прогнозирования мы будем иметь как минимум две записи X (t-2, t-1) и y(t-2, t-1), чтобы предсказать y (t), будущее.

Почему вам нужно сделать ЭТО? Теперь я думаю, что начну отвечать на ваш вопрос. В LSTM вам необходимо преобразовать ваши данные в 2D в 3D-пространстве.

Итак, после этого вам нужно изменить форму ввода, чтобы он был трехмерным [выборками, временными шагами, функциями] перед использованием LSTM, Итак, преобразование (с помощью этой функции) ваших данных - это просто подготовка.

Ответ на ваш вопрос. Вам не нужно добавлять только один столбец. Вам НУЖНО преобразовать ваши данные, чтобы ИМЕТЬ новые функции в tn, t-3, t-2, t-1, чтобы предсказать некоторую особенность в t.

Я рекомендую вам сначала выполнить шаги по делу о загрязнении (цитируемом вами) в этом блоге, прежде чем пытаться адаптироваться к вашему делу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...