Модель LSTM моего временного ряда предсказывает одно значение для всех тестовых данных - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь решить проблему с временными рядами. В задаче указан вход, необходимый для прогнозирования выходных данных.Для каждого входа есть только выход.У меня есть набор поездов и набор тестов, и я тренирую модель LSTM для прогнозирования.Тем не менее, предсказания приходят только как одно значение (как показано ниже).

# create training data#####

data = pd.DataFrame({'input':np.arange(1,100001,1),'output':np.arange(150000,250000,1)})

 rows = 100 ###to create sequence ####
    segments = int(np.floor(data.shape[0] / rows))
# extract features from the input data :
def add_trend_feature(arr, abs_values=False):
    idx = np.array(range(len(arr)))
    if abs_values:
        arr = np.abs(arr)
    lr = LinearRegression()
    lr.fit(idx.reshape(-1, 1), arr)
    return lr.coef_[0]

X_tr = pd.DataFrame(index=range(segments), dtype=np.float64)

y_tr = pd.DataFrame(index=range(segments), dtype=np.float64, columns=['output'])
####The features extracted from the input data is : mean , min, max ,std etc.####
for segment in (range(segments)):
  seg = data.iloc[segment*rows:segment*rows+rows]
  x = pd.Series(seg['input'].values)
  y = seg['output'].values[-1]
  y_tr.loc[segment, 'output'] = y
  X_tr.loc[segment, 'mean'] = x.mean()
  X_tr.loc[segment, 'std'] = x.std()
  X_tr.loc[segment, 'max'] = x.max()
  X_tr.loc[segment, 'min'] = x.min()
  X_tr.loc[segment, 'trend'] = add_trend_feature(x)
####reshape the data to [samples , timestep , features]####
X_tr_n=X_tr.values
X_tr_n = np.reshape(X_tr_n, (X_tr_n.shape[0],1,X_tr_n.shape[1]))
model = Sequential()
#define model#####
model.add(LSTM(48,input_shape=(1,5)))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1))
model.summary()

model.compile(optimizer=adam(lr= 0.1), loss="mae")
model.fit(X_tr_n,y_tr.values,epochs = 20)
# now prepare the test data in the same way as the train data####
test = pd.DataFrame({'input':np.arange(10000,12000,1),'output':np.arange(50000,52000,1)})
rows = 100
segments = int(np.floor(test.shape[0] / rows))

def add_trend_feature(arr, abs_values=False):
    idx = np.array(range(len(arr)))
    if abs_values:
        arr = np.abs(arr)
    lr = LinearRegression()
    lr.fit(idx.reshape(-1, 1), arr)
    return lr.coef_[0]

X_test = pd.DataFrame(index=range(segments), dtype=np.float64)

y_test = pd.DataFrame(index=range(segments), dtype=np.float64, columns=['output'])
for segment in (range(segments)):
  seg = test.iloc[segment*rows:segment*rows+rows]
  x = pd.Series(seg['input'].values)
  y = seg['output'].values[-1]
  y_test.loc[segment, 'output'] = y
  X_test.loc[segment, 'mean'] = x.mean()
  X_test.loc[segment, 'std'] = x.std()
  X_test.loc[segment, 'max'] = x.max()
  X_test.loc[segment, 'min'] = x.min()
  X_test.loc[segment, 'trend'] = add_trend_feature(x)
  # reshape the test data for prediction#####
  X_te_n=X_test.values
  X_te_n = np.reshape(X_te_n, (X_te_n.shape[0],1,X_te_n.shape[1]))
  pred = model.predict(X_te_n))

Моя проблема с этим игрушечным примером состоит в том, что я получаю то же самоепредсказанное значение

Prediction=array([[195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28],
           [195834.28]], dtype=float32)

Furthur the mae очень высоко 34188.00.

Я хотел бы подвести итог моего запроса: Я хочу предсказать вывод с учетом ввода.

1. Я попытался создать окно из 1000 выборок из данных, имеющих 100000 точек данных.

Я пытался извлечь функции в этом окне: мин, макс, среднее стандартное и т. Д.

преобразовывает мои данные в [выборки, временные шаги, функции]

создал мою модель LSTM и обучил ее на данных поезда (50 эпох lr = 0.1, потеря = ma *

подготовил мои данные испытаний так же, как моиданные поезда.

сделал прогноз на основе моих тестовых данных на основе модели.

Теперь проблема в том, что я получаю только один прогноззначение: 195834.28 также означает, что абсолютная ошибка очень высока: 34188.

В чем может быть ошибка в моем подходе? Спасибо за помощь.

С уважением, Анирбан Гош

...