Преобразование данных из фрейма данных Pandas в данные обучения временных рядов для кератов LSTM - PullRequest
0 голосов
/ 28 апреля 2018

Я использую Keras вместе с Hyperas и с машиной LSTM для прогнозирования оценок цен. У меня проблемы с форматированием данных из Pandas DataFrame для использования при обучении и тестировании данных в модели LSTM.

Вот как я сейчас читаю и разделяю данные:

def data():
    maxlen = 100
    max_features = 20000
    #read the data
    df = DataFrame(pd.read_json('eth_usd_polo.json'))

    #normalize data
    scaler = MinMaxScaler(feature_range=(-1,1))
    df[['weightedAverage']] = scaler.fit_transform(df[['weightedAverage']])
    X = df[df.columns[-1:]]
    Y = df['weightedAverage']
    X_train, X_test, y_train, y_test = train_test_split(X, Y , test_size=0.33)


    return X_train, X_test, y_train, y_test, max_features, maxlen

Из фрейма данных меня действительно интересует только столбец «weightedAverage» и соответствующие цены. Так как я делаю одномерное прогнозирование временных рядов.

И вот где я строю модель:

def create_model(X_train, X_test, y_train, y_test, max_features, maxlen):
    #Build the model
    model = Sequential()
    model.add(LSTM(input_shape=(10, 1), return_sequences=True, units=20))
    model.add(Dropout(1))
    model.add(LSTM(20, return_sequences=False))
    #model.add(Flatten())
    model.add(Dropout(0.2))
    model.add(Dense(units=1))
    #model.add(Activation("linear"))

    #compile
    model.compile(loss='categorical_crossentropy', metrics=['accuracy'],
                  optimizer={{choice(['rmsprop', 'adam', 'sgd'])}})

    #the monitor and earlystopping for the model training
    #monitor = EarlyStopping(monitor ='val_loss', patience=5,verbose=1, mode='auto')

    #fit everything together
    #model.fit(x_train ,y_train, validation_data=(x_test, y_test), callbacks =[monitor], verbose=2, epochs=1000)
    model.fit(X_train, y_train,
        batch_size={{choice([64, 128])}},
        epochs=1,
        verbose=2,
        validation_data=(X_test, y_test))

    score, acc = model.evaluate(X_test, y_test, verbose=0)

    print('Test accuracy:', acc)
    return {'loss': -acc, 'status': STATUS_OK, 'model': model}

Проблемы, похоже, возникают в том, как я извлекаю и обрабатываю данные из Pandas DF. Возвращаемые данные (X_train, X_test и т. Д.) Должны иметь вид:

(25000, 10)
[[ data data data .... data data]
 [ data data data .... data data]
.
.
.
[ data data data .... data data]]

Вместо этого он отформатирован в:

   (7580, 1)
        weightedAverage
12420       255.151685
20094       871.386896
12099       300.802114

Я думал, что функция train_test_split поможет мне разбить и отформатировать мои данные до правильного размера, но, похоже, он не делает то, что я от него хочу.

Любая помощь очень ценится с этим!

1 Ответ

0 голосов
/ 02 мая 2018

После долгих потрясений, проб и ошибок я все заработал. Теперь данные прекрасно отформатированы для моей машины LSTM, и они отлично работают.

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

def data():
    maxlen = 10
    steps = 10
    #read the data
    print('Loading data...')
    df = (pd.read_json('eth_usd_polo.json'))
    df = df.drop('date', axis=1)
    #normalize data
    scalerList = []
    for head in df.dtypes.index:
        scaler = MinMaxScaler(feature_range=(-1,1))
        df[[head]] = scaler.fit_transform(df[[head]])

        scalerList.append(scaler)
    Xtemp = np.array(df)
    X = np.zeros((len(Xtemp)-maxlen-steps,maxlen,len(Xtemp[0])))
    Y = np.zeros((len(X),steps))
    for i in range(0, len(X)):
        for j in range(steps):
            Y[i][j] = Xtemp[maxlen+i+j][6]

        for j in range(len(X[0])):
            for k in range(len(X[0][0])):
                X[i][len(X[0])-1-j][k] = Xtemp[maxlen+i-j-1][k]
    X_train, X_test, y_train, y_test = train_test_split(X, Y , test_size=0.33, shuffle=True)    
    return X_train, X_test, y_train, y_test, maxlen, steps
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...