Прогнозирование следующего местоположения на основе данных за предыдущие дни с использованием lstm - PullRequest
0 голосов
/ 26 мая 2019

На основе данных за 10 дней мне нужно предсказать местоположение пользователя на 11-й день. Пример моего ввода в эта ссылка

Набор данных содержит: 200 000 пользователей с 1550 случайными точками местоположения и 10 днями истории для каждого пользователя

from datetime import datetime
from random import seed

import pandas as pd

seed(150)

df = pd.read_csv('input.csv', delimiter=';')
df = df.iloc[:-1,:]
df = df.drop(columns='tslot')

def normalize_cols(df, cols):
for col in df.columns:
print(col, df[col].max(), df[col].min())
df[col] = (df[col] - df[col].min())/(df[col].max() - df[col].min())
return df

df = normalize_cols(df, ['slot', 'location', 'user'])
df.to_csv('cleaned_data.csv', index=False)
from keras.models import Sequential, load_model
from keras.layers import Dense, LSTM, Dropout
from matplotlib import pyplot
import numpy as np
import pandas as pd
df = pd.read_csv('cleaned_data.csv')
train_x = df[['slot', 'user']].copy()
train_y = df[['tower']].copy().values
train_x = train_x.values.reshape((train_x.shape[0], 1, train_x.shape[1]))
model = Sequential()
model.add(LSTM(50, input_shape=(train_x.shape[1], train_x.shape[2])))
model.add(Dropout(0.5))
model.add(Dense(40))
model.add(Dropout(0.3))
model.add(Dense(20))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
history = model.fit(train_x, train_y, epochs=100, batch_size=25,  verbose=2, shuffle=True)
model.save('5g_tower.h5')
del model
model = load_model('5g_tower.h5')
## Prediction
def get_tower_number(model, slot, user): 
## normalize input slot, tower, user
slot = ((slot - 0)*1.0) / ((95.0 - 0.0)*1.0)
user = ((user - 1)*1.0) / ((2.0 - 1.0)*1.0)

## get a slot for next 15 mins
res = model.predict(np.array([[[slot, user]]]))

## de-normalize that tower
return int(res[0][0] * ((1354.0 - 9.0)*1.0) + 9.0)

print(get_tower_number(model, 4, 1))

Но не удалось предсказать местоположение пользователя на 11-й день. Вывод, который я получил, неверен по сравнению с требуемым выводом. Пример вывода приведен в этой ссылке . Как реализовать индивидуальную модель, а не глобальную модель в этой системе? Пример вывода должен быть 11-й день:

     User   location   slot
      1        145       0




      1         94       95
      2         562       0

      2         583       95

Фактический набор данных содержит в общей сложности 350 000 пользователей

1 Ответ

1 голос
/ 26 мая 2019

Просто глядя на реализацию модели, вам не хватает функции активации для каждого блока Dense, поэтому keras применяет линейную активацию.Вы можете изменить это, используя:

model.add(Activation('relu'))
...