Как формировать входной массив соответственно для ML - PullRequest
1 голос
/ 06 марта 2020

Заранее прошу прощения, если этот вопрос кажется глупым, но я пытаюсь понять machinelearningmastery блоге о типе LSTM ML алгоритмов, более конкретно о том, как получает реорганизован входные данные. И у меня нет тонны мудрости здесь по этому вопросу или степени CS по этому вопросу

Примерно на полпути в блог о разделе LSTM CNN, Джейсон говорит о:

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

Мы можем параметризовать это и определить количество подпоследовательностей как n_seq и число временных шагов на подпоследовательность как n_steps. Входные данные могут быть изменены, чтобы иметь требуемую структуру:

[samples, subsequences, timesteps, features]

1016 * Мой вопроса это требование для данных быть сформированы только в 4 steps? Или это может быть больше? Приведенный ниже код попытается напечатать массив. Я использую свой собственный пример данных здесь для своей учетной записи git.
import pandas as pd
import numpy as np
# univariate data preparation
from numpy import array



df = pd.read_csv("trainData.csv")
df = df[['kW']].shift(-1)
df = df.dropna()
raw_seq = df.values.tolist()


# split a univariate sequence into samples
def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern
        end_ix = i + n_steps
        # check if we are beyond the sequence
        if end_ix > len(sequence)-1:
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

# define input sequence
#raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# choose a number of time steps
n_steps = 4
# split into samples
X, y = split_sequence(raw_seq, n_steps)
# reshape from [samples, timesteps] into [samples, subsequences, timesteps, features]
n_features = 1
n_seq = 2
n_steps = 2
X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
# summarize the data
for i in range(len(X)):
    print(X[i], y[i])

Приведенный выше код работает, но при изменении n_steps = 7 (из 4) Я получаю эту ошибку формы.

  File "convArray.py", line 39, in <module>
    X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
ValueError: cannot reshape array of size 2499 into shape (357,2,2,1)

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

1028 * Любые советы высоко оценили

1 Ответ

0 голосов
/ 06 марта 2020

Проблема упоминается в сообщении об ошибке в этом случае. Проблема заключается в том, что вы пытаетесь изменить массив к 1009 * Удельный * форме, но это не представляется возможным. Массив * * Х одна тысяча один имеет элементы 2499 и 2499 не может быть изменена до (357,2,2,1) формы. Произведение чисел в форме - это общее количество элементов. А (357,2,2,1) имеют 357 * 2 * 2 * 1 = элементы тысячи четыреста двадцать восемь. Итак, ваш код вернул массив с 1428 элементами в целом, когда n_steps = 2. Я думаю, в вашем случае, это зависит от raw_seq, потому что ее длина определяет количество раз для л oop внутри split_sequence() будет работать и массивы он возвращает. raw_seq зависит от данных, поэтому для этого набор данных, n_steps может быть ограничено. Я не 100% уверен, что об этом же.

...