Tại sao mạng thần kinh dự đoán sai trên dữ liệu đào tạo của chính mình?


16

Tôi đã tạo ra một mạng lưới thần kinh LSTM (RNN) với việc học có giám sát để dự đoán dữ liệu. Vấn đề là tại sao nó dự đoán sai trên dữ liệu đào tạo của chính mình? (lưu ý: ví dụ tái sản xuất bên dưới)

Tôi đã tạo mô hình đơn giản để dự đoán giá cổ phiếu trong 5 ngày tới:

model = Sequential()
model.add(LSTM(32, activation='sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dense(y_train.shape[1]))
model.compile(optimizer='adam', loss='mse')

es = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
model.fit(x_train, y_train, batch_size=64, epochs=25, validation_data=(x_test, y_test), callbacks=[es])

Các kết quả chính xác nằm trong y_test(5 giá trị), do đó, mô hình đào tạo, nhìn lại 90 ngày trước và sau đó khôi phục trọng số từ val_loss=0.0030kết quả tốt nhất ( ) với patience=3:

Train on 396 samples, validate on 1 samples
Epoch 1/25
396/396 [==============================] - 1s 2ms/step - loss: 0.1322 - val_loss: 0.0299
Epoch 2/25
396/396 [==============================] - 0s 402us/step - loss: 0.0478 - val_loss: 0.0129
Epoch 3/25
396/396 [==============================] - 0s 397us/step - loss: 0.0385 - val_loss: 0.0178
Epoch 4/25
396/396 [==============================] - 0s 399us/step - loss: 0.0398 - val_loss: 0.0078
Epoch 5/25
396/396 [==============================] - 0s 391us/step - loss: 0.0343 - val_loss: 0.0030
Epoch 6/25
396/396 [==============================] - 0s 391us/step - loss: 0.0318 - val_loss: 0.0047
Epoch 7/25
396/396 [==============================] - 0s 389us/step - loss: 0.0308 - val_loss: 0.0043
Epoch 8/25
396/396 [==============================] - 0s 393us/step - loss: 0.0292 - val_loss: 0.0056

Kết quả dự đoán là khá tuyệt vời, phải không?

nhập mô tả hình ảnh ở đây

Đó là bởi vì thuật toán khôi phục trọng lượng tốt nhất từ ​​# 5 epoch. Okey, bây giờ hãy lưu mô hình này vào .h5tệp, di chuyển trở lại -10 ngày và dự đoán 5 ngày qua (ví dụ đầu tiên chúng tôi đã tạo mô hình và xác thực vào ngày 17-23 tháng 4 bao gồm cả ngày nghỉ cuối tuần, bây giờ hãy thử nghiệm vào ngày 2-8 tháng 4). Kết quả:

nhập mô tả hình ảnh ở đây

Nó cho thấy hướng hoàn toàn sai. Như chúng ta thấy đó là vì mô hình đã được đào tạo và đạt thứ hạng 5 tốt nhất để xác thực vào ngày 17-23 tháng 4, nhưng không phải vào ngày 2-8. Nếu tôi cố gắng luyện tập nhiều hơn, chơi với kỷ nguyên nào để chọn, dù tôi làm gì, luôn có rất nhiều khoảng thời gian trong quá khứ có dự đoán sai.

Tại sao mô hình hiển thị kết quả sai trên dữ liệu được đào tạo của chính nó? Tôi đã đào tạo dữ liệu, nó phải nhớ cách dự đoán dữ liệu trên tập hợp này, nhưng dự đoán sai. Những gì tôi cũng đã thử:

  • Sử dụng các tập dữ liệu lớn với 50k + hàng, giá cổ phiếu 20 năm, thêm nhiều hoặc ít tính năng
  • Tạo các loại mô hình khác nhau, như thêm nhiều lớp ẩn hơn, các lô khác nhau, kích hoạt các lớp khác nhau, bỏ qua, chuẩn hóa hàng loạt
  • Tạo cuộc gọi lại EarlyStopping tùy chỉnh, nhận val_loss trung bình từ nhiều bộ dữ liệu xác thực và chọn tốt nhất

Có lẽ tôi bỏ lỡ điều gì? Tôi có thể cải thiện điều gì?

Đây là ví dụ rất đơn giản và có thể tái tạo . yfinancetải dữ liệu chứng khoán S & P 500.

"""python 3.7.7
tensorflow 2.1.0
keras 2.3.1"""


import numpy as np
import pandas as pd
from keras.callbacks import EarlyStopping, Callback
from keras.models import Model, Sequential, load_model
from keras.layers import Dense, Dropout, LSTM, BatchNormalization
from sklearn.preprocessing import MinMaxScaler
import plotly.graph_objects as go
import yfinance as yf
np.random.seed(4)


num_prediction = 5
look_back = 90
new_s_h5 = True # change it to False when you created model and want test on other past dates


df = yf.download(tickers="^GSPC", start='2018-05-06', end='2020-04-24', interval="1d")
data = df.filter(['Close', 'High', 'Low', 'Volume'])

# drop last N days to validate saved model on past
df.drop(df.tail(0).index, inplace=True)
print(df)


class EarlyStoppingCust(Callback):
    def __init__(self, patience=0, verbose=0, validation_sets=None, restore_best_weights=False):
        super(EarlyStoppingCust, self).__init__()
        self.patience = patience
        self.verbose = verbose
        self.wait = 0
        self.stopped_epoch = 0
        self.restore_best_weights = restore_best_weights
        self.best_weights = None
        self.validation_sets = validation_sets

    def on_train_begin(self, logs=None):
        self.wait = 0
        self.stopped_epoch = 0
        self.best_avg_loss = (np.Inf, 0)

    def on_epoch_end(self, epoch, logs=None):
        loss_ = 0
        for i, validation_set in enumerate(self.validation_sets):
            predicted = self.model.predict(validation_set[0])
            loss = self.model.evaluate(validation_set[0], validation_set[1], verbose = 0)
            loss_ += loss
            if self.verbose > 0:
                print('val' + str(i + 1) + '_loss: %.5f' % loss)

        avg_loss = loss_ / len(self.validation_sets)
        print('avg_loss: %.5f' % avg_loss)

        if self.best_avg_loss[0] > avg_loss:
            self.best_avg_loss = (avg_loss, epoch + 1)
            self.wait = 0
            if self.restore_best_weights:
                print('new best epoch = %d' % (epoch + 1))
                self.best_weights = self.model.get_weights()
        else:
            self.wait += 1
            if self.wait >= self.patience or self.params['epochs'] == epoch + 1:
                self.stopped_epoch = epoch
                self.model.stop_training = True
                if self.restore_best_weights:
                    if self.verbose > 0:
                        print('Restoring model weights from the end of the best epoch')
                    self.model.set_weights(self.best_weights)

    def on_train_end(self, logs=None):
        print('best_avg_loss: %.5f (#%d)' % (self.best_avg_loss[0], self.best_avg_loss[1]))


def multivariate_data(dataset, target, start_index, end_index, history_size, target_size, step, single_step=False):
    data = []
    labels = []
    start_index = start_index + history_size
    if end_index is None:
        end_index = len(dataset) - target_size
    for i in range(start_index, end_index):
        indices = range(i-history_size, i, step)
        data.append(dataset[indices])
        if single_step:
            labels.append(target[i+target_size])
        else:
            labels.append(target[i:i+target_size])
    return np.array(data), np.array(labels)


def transform_predicted(pr):
    pr = pr.reshape(pr.shape[1], -1)
    z = np.zeros((pr.shape[0], x_train.shape[2] - 1), dtype=pr.dtype)
    pr = np.append(pr, z, axis=1)
    pr = scaler.inverse_transform(pr)
    pr = pr[:, 0]
    return pr


step = 1

# creating datasets with look back
scaler = MinMaxScaler()
df_normalized = scaler.fit_transform(df.values)
dataset = df_normalized[:-num_prediction]
x_train, y_train = multivariate_data(dataset, dataset[:, 0], 0,len(dataset) - num_prediction + 1, look_back, num_prediction, step)
indices = range(len(dataset)-look_back, len(dataset), step)
x_test = np.array(dataset[indices])
x_test = np.expand_dims(x_test, axis=0)
y_test = np.expand_dims(df_normalized[-num_prediction:, 0], axis=0)

# creating past datasets to validate with EarlyStoppingCust
number_validates = 50
step_past = 5
validation_sets = [(x_test, y_test)]
for i in range(1, number_validates * step_past + 1, step_past):
    indices = range(len(dataset)-look_back-i, len(dataset)-i, step)
    x_t = np.array(dataset[indices])
    x_t = np.expand_dims(x_t, axis=0)
    y_t = np.expand_dims(df_normalized[-num_prediction-i:len(df_normalized)-i, 0], axis=0)
    validation_sets.append((x_t, y_t))


if new_s_h5:
    model = Sequential()
    model.add(LSTM(32, return_sequences=False, activation = 'sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
    # model.add(Dropout(0.2))
    # model.add(BatchNormalization())
    # model.add(LSTM(units = 16))
    model.add(Dense(y_train.shape[1]))
    model.compile(optimizer = 'adam', loss = 'mse')

    # EarlyStoppingCust is custom callback to validate each validation_sets and get average
    # it takes epoch with best "best_avg" value
    # es = EarlyStoppingCust(patience = 3, restore_best_weights = True, validation_sets = validation_sets, verbose = 1)

    # or there is keras extension with built-in EarlyStopping, but it validates only 1 set that you pass through fit()
    es = EarlyStopping(monitor = 'val_loss', patience = 3, restore_best_weights = True)

    model.fit(x_train, y_train, batch_size = 64, epochs = 25, shuffle = True, validation_data = (x_test, y_test), callbacks = [es])
    model.save('s.h5')
else:
    model = load_model('s.h5')



predicted = model.predict(x_test)
predicted = transform_predicted(predicted)
print('predicted', predicted)
print('real', df.iloc[-num_prediction:, 0].values)
print('val_loss: %.5f' % (model.evaluate(x_test, y_test, verbose=0)))


fig = go.Figure()
fig.add_trace(go.Scatter(
    x = df.index[-60:],
    y = df.iloc[-60:,0],
    mode='lines+markers',
    name='real',
    line=dict(color='#ff9800', width=1)
))
fig.add_trace(go.Scatter(
    x = df.index[-num_prediction:],
    y = predicted,
    mode='lines+markers',
    name='predict',
    line=dict(color='#2196f3', width=1)
))
fig.update_layout(template='plotly_dark', hovermode='x', spikedistance=-1, hoverlabel=dict(font_size=16))
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)
fig.show()

3
Các ví dụ sinh sản ngày nay rất hiếm (trái ngược với những câu hỏi tương tự mà không có) được cho là một ý tưởng tốt để quảng cáo sự tồn tại của nó trong phần đầu của bài đăng của bạn (đã thêm);)
Sahnaut

7
Vấn đề có thể chỉ là bạn đang mong đợi quá nhiều dự đoán ra khỏi thị trường chứng khoán. Nếu bạn đã đào tạo một mô hình theo trình tự 1 triệu lần lật đồng xu và sau đó cố gắng đưa nó ra để dự đoán các lần lật đồng xu, sẽ không có gì đáng ngạc nhiên khi mô hình đó hiểu sai, ngay cả khi các lần lật xuất phát từ dữ liệu đào tạo - mô hình không mong đợi để ghi nhớ dữ liệu đào tạo của nó và lấy lại nó.
user2357112 hỗ trợ Monica

2
Ngoài những gì @ user2357112supportsMonica đã nói, mô hình của bạn có ý nghĩa đúng, đó thực sự là tất cả những gì tôi mong đợi một mô hình như thế này sẽ thực sự có được (ít nhất là với bất kỳ sự nhất quán nào) và bạn mong đợi quá nhiều trong 5 ngày dữ liệu. Bạn thực sự cần nhiều dữ liệu hơn để có thể nói với bất kỳ ý nghĩa nào về lỗi trong mô hình của bạn.
Aaron

Có rất nhiều thông số để điều chỉnh mô hình. Tôi đã thử một vài trong số chúng như dừng sớm (kiên nhẫn = 20), tăng số lượng kỷ nguyên, tăng đơn vị lstm từ 32 lên 64, vv Kết quả tốt hơn nhiều. kiểm tra tại đây github.com/jvishnuvardhan/Stackoverflow_Questions/blob/master/ . Như @sirjay đã đề cập, thêm nhiều tính năng (hiện chỉ có 4), thêm nhiều lớp (lstm, batchnorm, dropout, v.v.), chạy tối ưu hóa tham số siêu tốc sẽ mang lại hiệu suất tốt hơn nhiều.
Vishnuvardhan Janapati

@VishnuvardhanJanapati cảm ơn bạn đã kiểm tra. Tôi đã biên dịch mã của bạn, mô hình đã lưu, sau đó thiết lập df.drop(df.tail(10).index, inplace=True), nó cho thấy kết quả tồi tệ như tôi đã có.
sirjay

Câu trả lời:


4

OP yêu cầu một phát hiện thú vị. Hãy để tôi đơn giản hóa câu hỏi ban đầu như sau.

Nếu mô hình được đào tạo theo chuỗi thời gian cụ thể, tại sao mô hình không thể tái tạo dữ liệu chuỗi thời gian trước đó, mà mô hình đã được đào tạo?

Vâng, câu trả lời được nhúng vào chính tiến trình đào tạo. Vì EarlyStoppingđược sử dụng ở đây để tránh quá mức, mô hình tốt nhất được lưu tại epoch=5, nơi val_loss=0.0030được đề cập bởi OP. Trong trường hợp này, tổn thất đào tạo bằng 0.0343, nghĩa là RMSE của đào tạo là 0.185. Vì bộ dữ liệu được thu nhỏ bằng cách sử dụng MinMaxScalar, chúng tôi cần hoàn tác mở rộng RMSE để hiểu điều gì đang xảy ra.

Các giá trị tối thiểu và tối đa của chuỗi thời gian được tìm thấy là 22903380. Do đó, với 0.185tư cách là RMSE của đào tạo có nghĩa là, ngay cả đối với tập huấn luyện, các giá trị dự đoán có thể khác với giá trị trung thực cơ bản xấp xỉ 0.185*(3380-2290), đó là ~200trung bình đơn vị.

Điều này giải thích tại sao có sự khác biệt lớn khi dự đoán dữ liệu đào tạo ở bước thời gian trước đó.

Tôi nên làm gì để mô phỏng hoàn hảo dữ liệu đào tạo?

Tôi đã hỏi câu hỏi này từ chính tôi. Câu trả lời đơn giản là, làm cho sự mất mát đào tạo đến gần 0, đó là quá phù hợp với mô hình.

Sau một số khóa đào tạo, tôi nhận ra rằng một mô hình chỉ có 1 lớp LSTM có 32các ô không đủ phức tạp để tái tạo lại dữ liệu đào tạo. Do đó, tôi đã thêm một lớp LSTM như sau.

model = Sequential()
    model.add(LSTM(32, return_sequences=True, activation = 'sigmoid', input_shape=(x_train.shape[1], x_train.shape[2])))
    # model.add(Dropout(0.2))
    # model.add(BatchNormalization())
    model.add(LSTM(units = 64, return_sequences=False,))
    model.add(Dense(y_train.shape[1]))
    model.compile(optimizer = 'adam', loss = 'mse')

Và mô hình được đào tạo cho 1000kỷ nguyên mà không cần xem xét EarlyStopping.

model.fit(x_train, y_train, batch_size = 64, epochs = 1000, shuffle = True, validation_data = (x_test, y_test))

Vào cuối 1000kỷ nguyên, chúng tôi có tổn thất đào tạo 0.00047thấp hơn nhiều so với tổn thất đào tạo trong trường hợp của bạn. Vì vậy, chúng tôi hy vọng mô hình sẽ xây dựng lại dữ liệu đào tạo tốt hơn. Sau đây là âm mưu dự đoán cho ngày 2-8.

sự dự đoán

Lưu ý cuối cùng:

Đào tạo trên một cơ sở dữ liệu cụ thể không nhất thiết có nghĩa là mô hình sẽ có thể tái cấu trúc hoàn hảo dữ liệu đào tạo. Đặc biệt, khi các phương pháp như dừng sớm, chính quy hóa và bỏ học được đưa ra để tránh tình trạng thừa, mô hình có xu hướng khái quát hơn thay vì ghi nhớ dữ liệu đào tạo.


2

Tại sao mô hình hiển thị kết quả sai trên dữ liệu được đào tạo của chính nó? Tôi đã đào tạo dữ liệu, nó phải nhớ cách dự đoán dữ liệu trên tập hợp này, nhưng dự đoán sai.

Bạn muốn mô hình tìm hiểu mối quan hệ giữa đầu vào và đầu ra thay vì ghi nhớ. Nếu một mô hình ghi nhớ đầu ra chính xác cho mỗi đầu vào, chúng ta có thể nói rằng nó phù hợp với dữ liệu đào tạo. Thường thì bạn có thể buộc mô hình phù hợp quá mức bằng cách sử dụng một tập hợp con dữ liệu nhỏ, vì vậy nếu đó là hành vi bạn muốn thấy, bạn có thể thử điều đó.


1

Về cơ bản Nếu bạn muốn có được kết quả tốt hơn cho dữ liệu đào tạo, độ chính xác đào tạo của bạn phải cao nhất có thể. Bạn nên sử dụng mô hình tốt hơn đối với dữ liệu bạn có. Về cơ bản, bạn nên kiểm tra xem độ chính xác đào tạo của bạn cho mục đích này bất kể độ chính xác kiểm tra. Điều này cũng được gọi là quá mức mang lại độ chính xác cao hơn trong dữ liệu đào tạo thay vì dữ liệu thử nghiệm.

Dừng sớm có thể ảnh hưởng đến kịch bản này trong đó độ chính xác kiểm tra / xác nhận tốt nhất được thực hiện thay vì độ chính xác đào tạo.


1

Câu trả lời ngắn gọn:

Bộ:

batch_size = 1
epochs = 200
shuffle = False

Trực giác: Bạn đang mô tả mức độ ưu tiên của độ chính xác cao trong dữ liệu đào tạo. Đây là mô tả quá mức. Để làm điều đó, đặt kích thước lô thành 1, cao kỷ nguyên và xáo trộn.


1

Nghi ngờ # 1 - Chính quy

Mạng nơ-ron rất tốt trong việc cung cấp dữ liệu huấn luyện, thực tế có một thử nghiệm thay thế nhãn CIFAR10 (nhiệm vụ phân loại hình ảnh) bằng nhãn ngẫu nhiên trên tập dữ liệu huấn luyện và mạng phù hợp với nhãn ngẫu nhiên dẫn đến mất gần như bằng không.

nhập mô tả hình ảnh ở đây

ở phía bên trái, chúng ta có thể thấy rằng các nhãn ngẫu nhiên được cung cấp đủ epochs sẽ bị mất khoảng 0 - điểm hoàn hảo (từ việc hiểu sâu học tập đòi hỏi phải suy nghĩ lại khái quát hóa bởi zhang et al 2016 )

Vậy tại sao nó không xảy ra mọi lúc? chính quy hóa .

chính quy hóa là (đại khái) cố gắng giải quyết vấn đề khó hơn so với vấn đề tối ưu hóa (tổn thất) mà chúng ta đã xác định cho mô hình.

Một số phương pháp chính quy hóa phổ biến trong các mạng thần kinh:

  • dừng sớm
  • rơi ra ngoài
  • bình thường hóa hàng loạt
  • phân rã trọng lượng (ví dụ: định mức l1 l2)
  • tăng dữ liệu
  • thêm nhiễu ngẫu nhiên / gaussian

các phương pháp này giúp giảm quá mức và thường dẫn đến hiệu suất kiểm tra và kiểm tra tốt hơn, nhưng dẫn đến hiệu suất đào tạo thấp hơn (điều này thực sự không quan trọng như được giải thích trên đoạn cuối).

hiệu suất dữ liệu đào tạo thường không quá quan trọng và chúng tôi sử dụng bộ xác nhận hợp lệ.

Nghi ngờ # 2 - Kích thước mô hình

bạn đang sử dụng lớp LSTM duy nhất với 32 đơn vị. đó là khá nhỏ. hãy thử tăng kích thước và thậm chí đặt hai lớp LSTM (hoặc hai lớp) và tôi chắc chắn rằng mô hình và trình tối ưu hóa sẽ vượt quá dữ liệu của bạn miễn là bạn cho phép chúng - tức là loại bỏ việc dừng sớm, restore_last_weights và bất kỳ quy tắc thông thường nào khác được chỉ định ở trên.

Lưu ý về độ phức tạp của vấn đề

cố gắng dự đoán giá cổ phiếu trong tương lai chỉ bằng cách nhìn vào lịch sử không phải là một nhiệm vụ dễ dàng và ngay cả khi mô hình có thể (hoàn toàn) phù hợp hoàn hảo với tập huấn luyện, nó có thể sẽ không làm gì hữu ích trên tập thử nghiệm hoặc trong thế giới thực.

ML không phải là ma thuật đen, các mẫu x cần phải tương quan theo cách nào đó với các thẻ y, chúng ta thường cho rằng (x, y) được rút ra từ một số phân phối cùng nhau.

Một cách trực quan hơn để suy nghĩ về nó, khi bạn cần gắn thẻ một hình ảnh thủ công cho lớp chó / mèo - điều đó khá dễ dàng. nhưng bạn có thể tự "gắn thẻ" giá cổ phiếu bằng cách nhìn vào lịch sử của cổ phiếu đó không?

Đó là một số trực giác về vấn đề này khó khăn như thế nào.

Lưu ý về việc quá mức

Người ta không nên theo đuổi hiệu suất đào tạo cao hơn, hầu như vô dụng khi cố gắng kiểm soát dữ liệu đào tạo, vì chúng ta thường cố gắng thực hiện tốt với một mô hình trên dữ liệu chưa thấy mới có thuộc tính tương tự với dữ liệu đào tạo. tất cả ý tưởng là cố gắng khái quát hóa và tìm hiểu các thuộc tính của dữ liệu và mối tương quan với mục tiêu, đó là việc học là gì :)


1

Như những người khác đã nói, bạn không nên mong đợi nhiều từ điều này.

Tuy nhiên, tôi đã tìm thấy sau đây trong mã của bạn:

  1. Bạn đang lắp lại bộ chia tỷ lệ mỗi lần trong quá trình đào tạo kiểm tra. Bạn cần lưu sacler và chỉ chuyển đổi dữ liệu trong khi thử nghiệm, nếu không, kết quả sẽ hơi khác:

    from sklearn.externals import joblib
    scaler_filename = "scaler.save"
    if new_s_h5:
        scaler = MinMaxScaler()
        df_normalized = scaler.fit_transform(df.values)
        joblib.dump(scaler, scaler_filename)
    
    else:
        scaler = joblib.load(scaler_filename)
        df_normalized = scaler.transform(df.values)
  2. Đặt shuffle=False. Như bạn cần phải giữ thứ tự của tập dữ liệu của bạn.

  3. Đặt batch_size=1. Vì nó sẽ ít bị quá mức và việc học sẽ ồn ào hơn và lỗi ít được tính trung bình.

  4. Đặt epochs=50hoặc nhiều hơn.


Với các cài đặt nêu trên, mô hình đạt được loss: 0.0037 - val_loss: 3.7329e-04.

Kiểm tra các mẫu dự đoán sau:

Từ 17/04/2020 -> 23/04/2020:

nhập mô tả hình ảnh ở đây

Từ 02/04/2020 -> 08/04/2020:

nhập mô tả hình ảnh ở đây

Từ 25/03/2020 -> 31/03/2020:

nhập mô tả hình ảnh ở đây


0

Tại sao mô hình hiển thị kết quả sai trên dữ liệu được đào tạo của chính nó? Tôi đã đào tạo dữ liệu, nó phải nhớ cách dự đoán dữ liệu trên tập hợp này, nhưng dự đoán sai.

Hãy nhìn xem bạn đang làm gì:

  1. Xây dựng mô hình với một số lớp
  2. Mô hình đào tạo với training_data
  3. Khi bạn đào tạo mô hình, tất cả các tham số có thể huấn luyện được đào tạo (nghĩa là trọng lượng của mô hình đã được lưu)
  4. Các trọng số này hiện đại diện cho mối quan hệ giữa đầu vào và đầu ra.
  5. Khi bạn dự đoán cùng một training_data một lần nữa, mô hình được đào tạo lần này sử dụng trọng số để có được đầu ra.
  6. Chất lượng mô hình của bạn bây giờ quyết định các dự đoán và do đó chúng khác với kết quả ban đầu mặc dù dữ liệu là như nhau.

0

Nó không phù hợp và để cải thiện điều tôi nghĩ bạn cần thêm nơ-ron vào các lớp ẩn của mình. !! Một điểm khác là thử chức năng kích hoạt 'relu'. Sigmoid không cho kết quả tốt. Ngoài ra, bạn cần xác định 'softmax' trong lớp đầu ra của mình.!


Âm thanh như bạn giữ bí mật để dự đoán thị trường. Anh ấy nên làm gì khác?
Daniel Scott

2
softmax là để phân loại, nó là một vấn đề hồi quy.
ShmulikA

@DanielScott không nhận được nó. Sâu bên dưới (tỷ lớp bên dưới) đó là một vấn đề phân loại quyết định giữa lãi hay lỗ. Tại sao thậm chí quan tâm để dự đoán một chuỗi thời gian?
Sowmya

0

Sau khi thay đổi kiến ​​trúc mô hình và trình tối ưu hóa thành Adagrad, tôi đã có thể cải thiện kết quả ở một mức độ nào đó.

Lý do sử dụng trình tối ưu hóa Adagrad ở đây là:

Nó điều chỉnh tốc độ học tập cho các tham số, thực hiện các cập nhật nhỏ hơn (tức là tốc độ học tập thấp) cho các tham số liên quan đến các tính năng thường xuyên xảy ra và các cập nhật lớn hơn (tức là tốc độ học tập cao) cho các tham số liên quan đến các tính năng không thường xuyên. Vì lý do này, nó rất phù hợp để xử lý dữ liệu thưa thớt.

Vui lòng tham khảo dưới đây:

model = Sequential()
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform', input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform'))
model.add(LSTM(units=100,return_sequences=True, kernel_initializer='random_uniform'))
model.add(Dropout(0.20))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(y_train.shape[1]))

# compile model
model.compile(loss="mse", optimizer='adagrad', metrics=['accuracy'])
model.summary()

Dự đoán cổ phiếu là một nhiệm vụ rất khó khăn, thay vì bám sát dự đoán của một mô hình, chúng ta có thể có một số mô hình làm việc cùng nhau để đưa ra dự đoán và sau đó dựa trên kết quả được bình chọn tối đa, thực hiện cuộc gọi tương tự như cách tiếp cận học tập. Ngoài ra, chúng ta có thể xếp chồng một vài mô hình lại với nhau như:

  1. Mạng thần kinh mã hóa tự động chuyển tiếp sâu để giảm kích thước + Mạng thần kinh tái phát sâu + ARIMA + Bộ điều chỉnh độ dốc tăng cường cực độ

  2. Adaboost + Đóng bao + Cây thêm + Tăng tốc độ + Rừng ngẫu nhiên + XGB

Các tác nhân học tập củng cố đang làm khá tốt trong Dự đoán chứng khoán như:

  1. Đại lý thương mại rùa
  2. Đại lý trung bình
  3. Đại lý cán tín hiệu
  4. Tác nhân gradient chính sách
  5. Đại lý học hỏi
  6. Tác nhân chiến lược tiến hóa

Vui lòng tìm một liên kết rất tháo vát ở đây .


adam cũng có những tính chất này, thực ra adam là một loại tiến hóa của adagrad
ShmulikA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.