LSTM Keras: изменение формы входных данных

Я хочу построить модель LSTM Autoencoder для поведения клиентов и обнаружения аномалий. Набор данных активности выглядит так:

customer_id               features
C1                   [[1,2,1,0,1],[2,2,1,1,0],[1,2,3,1,1],[0,3,2,1,1]]
C2                   [[2,1,1,4,1],[3,2,1,1,4],[2,2,3,1,2]]
..............................................
Cn                   [[2,3,1,4,1],[2,1,1,1,0],[4,2,2,1,2],[3,3,2,1,1], [2,3,2,1,2], [1,3,2,2,1]]

Здесь количество функций для всех образцов одинаковое, т.е. 5. Однако нет. Образцы разные для разных клиентов. Есть N клиентов.
В таком случае, как разделить данные обучения и тестирования и как изменить форму входных данных для модели LSTM?

На данный момент

  1. Я рассматриваю, например, 80% образцов от каждого клиента данные как обучение, а остальные как тестирование.
  2. Попытка изменить форму ввода как: (no_of_customers, timesteps, no_of_features) = (n, #no_of_samples, 5). Этот массив не поддерживается, поскольку у нас не может быть массива numpy с разными временными шагами.

person ab.sharma    schedule 26.02.2020    source источник
comment
Написал ответ, посмотрим, решит ли он вашу проблему.   -  person Raj kamal Srivastav    schedule 26.02.2020


Ответы (1)


В таких сценариях вам нужно использовать отступы. см. руководство по заполнению тензорного потока

from tensorflow.keras.preprocessing.sequence import pad_sequences

# club all features (c1, c2 ... features, I clubbed c1. c2 only) as a below:    
input1 = [[[1,2,1,0,1],[2,2,1,1,0],[1,2,3,1,1],[0,3,2,1,1]],
         [[2,1,1,4,1],[3,2,1,1,4],[2,2,3,1,2]]]

padded_input = pad_sequences(input1, padding='post')
print(padded_input)

вы также можете установить аргумент maxlen, в зависимости от максимального списка, предоставленного клиентам

person Raj kamal Srivastav    schedule 26.02.2020
comment
Я разделил входные данные на X_train и X_test. Если мы добавим последовательность нулей для клиентов, у которых меньше выборок данных, что произойдет в общем результате модели? Создает ли это разницу в производительности модели? - person ab.sharma; 27.02.2020
comment
Нет, не будет, модуль заполнения и маскирования сам по себе позаботится о нулевом заполнении. пожалуйста, прочтите ссылку один раз, вы узнаете. - person Raj kamal Srivastav; 27.02.2020
comment
еще одна вещь, убедитесь, что вы также добавили свои тестовые данные. дайте мне знать, если с вашей стороны все ясно. - person Raj kamal Srivastav; 27.02.2020
comment
Большое спасибо за ответ. Я постараюсь вернуться к вам. - person ab.sharma; 27.02.2020
comment
обязательно и спрашивайте в любое время !, если это сработает для вас, отметьте как ответ :) - person Raj kamal Srivastav; 27.02.2020
comment
Я разделил данные на два набора Xtrain и Xtest и добавил нули. Тогда X_train = np.array (X_train) и X_test = np.array (X_test). После изменения формы X_train имеет размер (1000,450,40), а X_test - размер (1000,150,40). Модель последовательная. например input = Input (shape = (timeteps, n_features)) L1 = LSTM (encoding_dim, Activation = 'relu', return_sequences = True, kernel_regularizer = regularizers.l2 (0.00)) (входы) .......... ... Я не понимаю, куда поставить mask_zero = True. - person ab.sharma; 27.02.2020