Формирование входных данных для модели LSTM с использованием Keras Python - PullRequest
0 голосов
/ 01 декабря 2018

Мы работаем с набором данных kaggle: https://www.kaggle.com/heesoo37/120-years-of-olympic-history-athletes-and-results/version/2. Он содержит данные 120 лет олимпийских игр.Наша цель состоит в том, чтобы обучить нашу модель на данных предыдущих олимпийских игр и предсказать вероятную медаль страны в следующих олимпийских играх на основе обученной модели.Мы принимаем атрибуты: возраст, пол, рост, вес, NOC (страна), спорт, событие, чтобы предсказать наш выходной класс (золото, серебро, бронза no_medal).Мы хотим использовать LSTM для прогнозирования на основе данных нескольких предыдущих лет, а не всего набора данных за 120 лет.

Но основная проблема в использовании LSTM, с которой мы сталкиваемся, заключается в том, как сформировать исходные данные для LSTM.Каким должен быть временной шаг и размер выборки для LSTM?Как следует группировать данные для подачи их в LSTM.Для каждой страны у нас есть переменное количество строк, соответствующих каждому году олимпийских игр и всех видов спорта.

Мы застряли на этом шаге на пару дней.

Было бы здорово, если быКто-то может дать представление о том, как должны выглядеть входные данные для подачи в LSTM.

Мы написали такой код:

def lstm_classifier (final_data):

country_count = len(final_data['NOC'].unique())
year_count = len(final_data['Year'].unique())

values = final_data.values
final_X = values[:, :-1]
final_Y = values[:, -1] 
print(country_count, ' ', year_count)

# reshape - # countries, time series, # attributes
#final_X = final_X.reshape(country_count, year_count, final_X.shape[1])
final_X = final_X.groupby("Country", as_index=True)['Year', 'Sex', 'Age', 'Height', 'Weight', 'NOC', 'Host_Country', 'Sport'].apply(lambda x: x.values.tolist())
final_Y = final_Y.groupby("Country", as_index=True)['Medal' ].apply(lambda x: x.values.tolist())

# define model - 10 hidden nodes
model = Sequential()
model.add(LSTM(10, input_shape = (country_count, final_X.shape[1])))
model.add(Dense(4, activation = 'sigmoid'))
model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics = ['accuracy'])

# fit network
history = model.fit(final_X, final_Y, epochs = 10, batch_size = 50)

loss, accuracy = model.evaluate(final_X, final_Y)
print(accuracy)

1 Ответ

0 голосов
/ 29 января 2019

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

Я думаю, что вы в хорошем смысле.Во-первых, вы должны преобразовать 2D-данные в 3D, как это делает Джейсон Браунли. Нажмите здесь !

Еще один хороший пример Нажмите здесь !

Онииспользуйте этот метод:

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

# function to reshape features into (samples, time steps, features) 
def gen_sequence(id_df, seq_length, seq_cols):
    """ Only sequences that meet the window-length are considered, no padding is used. This means for testing
    we need to drop those which are below the window-length. An alternative would be to pad sequences so that
    we can use shorter ones """
    data_array = id_df[seq_cols].values
    num_elements = data_array.shape[0]
    for start, stop in zip(range(0, num_elements-seq_length), range(seq_length, num_elements)):
        yield data_array[start:stop, :]

Если вы нашли лучшее решение, пожалуйста, не стесняйтесь и поделитесь с нами: -)

...