Cố gắng sử dụng TensorFlow để dự đoán dữ liệu chuỗi thời gian tài chính


10

Tôi mới sử dụng ML và TensorFlow (tôi đã bắt đầu khoảng vài giờ trước) và tôi đang cố gắng sử dụng nó để dự đoán một vài điểm dữ liệu tiếp theo trong một chuỗi thời gian. Tôi đang lấy đầu vào của mình và làm điều này với nó:

/----------- x ------------\
.-------------------------------.
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
'-------------------------------'
     \----------- y ------------/

Những gì tôi nghĩ rằng tôi đang làm là sử dụng x làm dữ liệu đầu vào và y làm đầu ra mong muốn cho đầu vào đó, do đó, đưa ra 0-6 tôi có thể nhận được 1-7 (cụ thể là 7). Tuy nhiên, khi tôi chạy biểu đồ của mình với x làm đầu vào, những gì tôi nhận được là một dự đoán trông giống x hơn y .

Đây là mã (dựa trên bài đăng nàybài đăng này ):

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plot
import pandas as pd
import csv

def load_data_points(filename):
    print("Opening CSV file")
    with open(filename) as csvfile:
        print("Creating CSV reader")
        reader = csv.reader(csvfile)
        print("Reading CSV")
        return [[[float(p)] for p in row] for row in reader]

flatten = lambda l: [item for sublist in l for item in sublist]

data_points = load_data_points('dataset.csv')

print("Loaded")

prediction_size = 10
num_test_rows = 1
num_data_rows = len(data_points) - num_test_rows
row_size = len(data_points[0]) - prediction_size

# Training data
data_rows = data_points[:-num_test_rows]
x_data_points = np.array([row[:-prediction_size] for row in data_rows]).reshape([-1, row_size, 1])
y_data_points = np.array([row[prediction_size:] for row in data_rows]).reshape([-1, row_size, 1])

# Test data
test_rows = data_points[-num_test_rows:]
x_test_points = np.array([[data_points[0][:-prediction_size]]]).reshape([-1, row_size, 1])
y_test_points = np.array([[data_points[0][prediction_size:]]]).reshape([-1, row_size, 1])

tf.reset_default_graph()

num_hidden = 100

x = tf.placeholder(tf.float32, [None, row_size, 1])
y = tf.placeholder(tf.float32, [None, row_size, 1])

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, x, dtype=tf.float32)

learning_rate = 0.001

stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, 1)
outputs = tf.reshape(stacked_outputs, [-1, row_size, 1])

loss = tf.reduce_sum(tf.square(outputs - y))
optimizer = tf.train.AdamOptimizer(learning_rate)
training_op = optimizer.minimize(loss)

init = tf.global_variables_initializer()

iterations = 1000

with tf.Session() as sess:
    init.run()
    for ep in range(iterations):
        sess.run(training_op, feed_dict={x: x_data_points, y: y_data_points})
        if ep % 100 == 0:
            mse = loss.eval(feed_dict={x: x_data_points, y: y_data_points})
            print(ep, "\tMSE:", mse)

    y_pred = sess.run(stacked_outputs, feed_dict={x: x_test_points})

    plot.rcParams["figure.figsize"] = (20, 10)

    plot.title("Actual vs Predicted")
    plot.plot(pd.Series(np.ravel(x_test_points)), 'g:', markersize=2, label="X")
    plot.plot(pd.Series(np.ravel(y_test_points)), 'b--', markersize=2, label="Y")
    plot.plot(pd.Series(np.ravel(y_pred)), 'r-', markersize=2, label="Predicted")
    plot.legend(loc='upper left')
    plot.xlabel("Time periods")
    plot.tick_params(
        axis='y',
        which='both',
        left='off',
        right='off',
        labelleft='off')
    plot.show()

Kết quả hiển thị trong biểu đồ bên dưới là một dự đoán theo sau x , thay vì bị dịch chuyển sang trái (và bao gồm các điểm được dự đoán ở bên phải) vì nó phải giống với y . Rõ ràng mong muốn là đường màu đỏ càng gần với đường màu xanh càng tốt.

đồ thị

Tôi không biết tôi đang làm gì với tất cả những điều này, vì vậy xin vui lòng ELI5.

Ồ, ngoài ra, điểm dữ liệu của tôi là những con số khá nhỏ (thứ tự 0,0001). Nếu tôi không nhân chúng với 1000000, thì kết quả rất nhỏ đến mức đường màu đỏ gần như phẳng ở cuối biểu đồ. Tại sao? Tôi đoán đó là do bình phương trong chức năng tập thể dục. Dữ liệu nên được chuẩn hóa trước khi sử dụng, và nếu vậy, để làm gì? 0-1? Nếu tôi sử dụng:

normalized_points = [(p - min_point) / (max_point - min_point) for p in data_points]

dự đoán của tôi dao động dữ dội hơn khi nó tiến triển: dao động

Chỉnh sửa: Tôi đang bị câm và chỉ đưa ra một ví dụ để học hỏi, chứ không phải 500, phải không? Vì vậy, tôi nên cho nó nhiều mẫu 500 điểm, phải không?


Tôi có cùng một vấn đề - cụ thể là đầu ra của RNN tuân theo đầu vào (X) chứ không phải mục tiêu (Y). Thật kỳ lạ khi đầu vào cho cùng một RNN là một chuỗi hình sin đơn giản, nó học chính xác, tức là dự đoán Y.
Ryszard Cetnarski

Vui lòng chia sẻ tệp tập dữ liệu của bạn.csv
Ashwin Tomar

Câu trả lời:


2

Ok, hãy đi từng phần một. Có khá nhiều phần ở đây mà bạn không xem xét sự thiên vị trong mạng của mình.

Chọn đầu vào và đầu ra của bạn

Nếu vectơ 0-6 được xác định thì thực sự không cần xuất 1-7. 1-6 đã được biết đến và việc thêm các đầu ra bổ sung sẽ chỉ thêm độ phức tạp cho mô hình của bạn. Trừ khi bạn có lượng dữ liệu đáng kể mà bạn muốn giữ cho mô hình của mình đơn giản nhất có thể để có được hiệu suất tốt. Vì vậy, tôi sẽ tạo ra một nơron đơn giản với giá trị liên tục. Bạn có thể sử dụng RMSE làm hàm mất mát với đầu ra hồi quy từ mạng thần kinh của bạn.

Ngoài ra, bạn nên bổ sung các mẫu bạn đưa vào không gian đầu vào của mình bằng một số thông tin bổ sung mà bạn có thể nghĩ sẽ chứa thông tin về đường xu hướng. Ví dụ: nếu tôi có 2 sản phẩm khác nhau, bitcoin và vàng và vectơ đầu vào của chúng là như nhau, tôi có thể hy vọng vàng sẽ có rất ít biến động nhưng bitcoin có biến động rất cao.

Các tính năng đầu vào của bạn vào mạng của bạn chứa tất cả thông tin mà mạng của bạn sẽ học. Vì vậy, bạn muốn đảm bảo rằng bạn đang cung cấp đủ thông tin để có một dự đoán có ý nghĩa.

Học sâu là đói dữ liệu

Bạn sẽ cần khoảng hơn 100.000 trường hợp. Mỗi trường hợp là một tập hợp các tính năng. Chúng nên được vẽ độc lập và sao cho chúng được phân phối giống hệt nhau. Nói cách khác, bạn muốn nhận được nhiều đường xu hướng từ một nguồn dữ liệu khác nhau mà bạn muốn sử dụng mạng của mình và sau đó bạn sẽ rút ngẫu nhiên 0-6 điểm, đó là các tính năng của bạn và 7 sẽ là nhãn của bạn.

Hãy xem xét việc phân phối dữ liệu bạn đang cố gắng học. Nếu bạn muốn mạng của mình phân loại mèo / chó, bạn cần cung cấp một loạt các con chó và mèo trông khác nhau để mạng có thể xác định phương sai tồn tại trong cả hai lớp này. Nếu bạn hạn chế nguồn dữ liệu quá nhiều, nó sẽ có độ lệch cao và sẽ không khái quát thành dữ liệu mới mà sau này bạn sẽ cung cấp dữ liệu đó.


Hãy thử những điều này và cho chúng tôi biết những gì xảy ra.


2

Có lẽ dự đoán giống như đầu vào phản ánh rằng mạng của bạn chưa được đào tạo. Vì vậy, được gọi là mô hình kiên trì để dự đoán chuỗi thời gian, thường được sử dụng làm đường cơ sở cho các mô hình khác. Mô hình kiên trì đang sử dụng quan sát cuối cùng như một dự đoán. Nó là đơn giản và thường mang lại độ chính xác hợp lý. Tôi đoán là mạng của bạn bắt đầu bằng cách học mô hình kiên trì, và chỉ khi bạn đào tạo nó nhiều hơn và có thể tạo ra một mô hình tốt hơn, nó sẽ học nó - nhưng điều này đòi hỏi rất nhiều đào tạo.

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.