Генерация последовательности / пакетов с определенной длиной для RNN для сгруппированных данных - PullRequest
0 голосов
/ 01 октября 2018

Проблема возникает, когда я хочу передать данные из разных групп в RNN - большинство примеров предполагают элегантные временные ряды, но при добавлении групп мы не можем просто переключаться между окнами данных, нам нужно переходить при изменении группы, чтобыданные поступают из группы.

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

import pandas as pd
data = {
    'group_id': [1,1,1,1,2,2],
    'timestep': [1,2,3,4,1,2],
    'x': [6,5,4,3,2,1],
    'y': [0,1,1,1,0,1]
}
df = pd.DataFrame(data=data)


   group_id  timestep  x  y
0         1         1  6  0
1         1         2  5  1
2         1         3  4  1
3         1         4  3  1
4         2         1  2  0
5         2         2  1  1

Предположим, мы хотели бы использовать размер партии в 2 выборки, и каждая из выборок будет иметь 3 временных шага.RNNSequence.__len__ = 3 (ниже) партий, но это невозможно, потому что мы можем максимально получить 2 образца из 1-й группы (что составляет 1 пакет).Вторая группа имеет только 2 временных шага, поэтому итерация невозможна.

from keras.utils import Sequence

class RNNSequence(Sequence):

    def __init__(self, x_set, y_set, batch_size, seq_length):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size
        self.seq_length = seq_length

    def __len__(self):
        return int(np.ceil(len(self.x) / float(self.batch_size)))

    def __getitem__(self, idx):
        # get_batch to be coded
        return get_batch(idx, self.x, self.y, self.batch_size, self.seq_length)

Каков наиболее эффективный способ получения этих пакетов с использованием последовательности?

Мое решение состояло в том, чтобы фактически не использовать Последовательность и вместо этого использовать собственный генератор, который выплевывает данные, не зная, сколько пакетов будет заранее.и используйте fit_generator(custom_generator, max_queue_size=batch_size) вместо этого.Это самый эффективный способ?Проблема здесь в том, что нет перестановки, и это может быть проблемой?

Желаемый вывод для batchsize = 2, seq_length = 3:

X = [ 
        [ [6], [5], [4] ], 
        [ [5], [4], [3] ] 
    ]

Y = [ 1, 1 ]

1 Ответ

0 голосов
/ 02 октября 2018

Похоже, вам нужно не только знать количество партий, но и иметь возможность выводить любую партию, используя только номер партии.Вы можете создать индекс всех образцов в RNNSequence.__init__ или более ранних версиях, а затем собрать пакеты из этого.В __getitem__ вы можете затем вывести пакеты соответствующим образом.

Этот быстрый и грязный псевдокод должен иллюстрировать концепцию индекса выборки.При необходимости вы можете решить использовать функции в пандах или numpy и т. Д.

# Pseuducode for generating indexes for where samples start.
seq_len = 3
sample_start_ids = []
for group_id, group in enumerate(groups):
    for timestep_id, timestep in enumerate(group_timesteps):
        # Only add as sample if it is the first
        # timestep in the group or if a full sample fits.
        if timestep == 1 or timestep <= len(group_timesteps) - seq_len+1:
            sample_start_ids.append((group_id, timestep_id))

num_samples = len(sample_start_ids)

# Group the samples into batches of appropriate size.
pass

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