Finansal zaman serisi verilerini tahmin etmek için TensorFlow'u kullanmaya çalışmak


10

ML ve TensorFlow'da yeniyim (birkaç saat önce başladım) ve bir zaman serisindeki sonraki birkaç veri noktasını tahmin etmek için kullanmaya çalışıyorum. Girişimi alıyorum ve bunu onunla yapıyorum:

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

Ne I kullanarak yaptığını düşünce x giriş verileri ve benzeri gibi y böylece 0-6 verilen bir 1-7 (özellikle 7) alabilir, bu giriş için arzu edilen çıkış olarak. Ancak, grafiğimi girdi olarak x ile çalıştırdığımda, elde ettiğim şey y'den daha x'e benzeyen bir tahmin .

İşte kod ( bu gönderiye dayalı ve bu gönderiye ):

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()

Aşağıdaki grafikte gösterilen sonuç , y'ye benzemesi gerektiği için sola kaydırılmak (ve sağdaki tahmin edilen noktaları dahil etmek) yerine x'i takip eden bir tahmindir. . Açıkçası arzu, kırmızı çizginin maviye olabildiğince yakın olması.

grafik

Bütün bunlarla ne yaptığımı bilmiyorum, bu yüzden lütfen ELI5.

Oh, ayrıca, veri puanlarım oldukça küçük sayılardır (0.0001 sırası). Onları 1000000 ile çarpmazsam, sonuçlar o kadar küçük ki, kırmızı çizgi grafiğin altında neredeyse düz olacak. Neden? Ben fitness fonksiyonu karesi nedeniyle sanırım. Veriler kullanımdan önce normalleştirilmeli ve eğer öyleyse neye göre düzenlenmelidir? 0-1? Eğer kullanırsam:

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

tahminim ilerledikçe daha çılgınca dalgalanıyor: dalgalanan

Düzenleme: Aptal olmak ve 500'den değil, sadece öğrenmek için bir örnek veriyor, değil mi? Bu yüzden ona 500 noktalı birden fazla örnek vermeliyim, değil mi?


Ben aynı sorun var - yani RNN çıkış hedef (Y) değil, giriş (X) izler. Garip bir şekilde, aynı RNN'ye giriş basit bir sinüs serisi olduğunda, doğru bir şekilde öğrenir, yani Y'yi tahmin eder.
Ryszard Cetnarski 15:18

Lütfen dataset.csv dosyanızı paylaşın
Ashwin Tomar

Yanıtlar:


2

Tamam, parça parça gidelim. Burada ağınızdaki önyargıyı dikkate almadığınız birkaç bölüm var.

Girdilerinizi ve çıktılarınızı seçme

0-6 vektörü belirlenirse, gerçekten 1-7 çıktısına gerek yoktur. 1-6 zaten biliniyor ve ek çıktılar eklemek modelinize sadece karmaşıklık katacak. Önemli miktarda veriye sahip olmadığınız sürece, iyi performans elde etmek için modelinizi mümkün olduğunca basit tutmak istersiniz. Böylece, sürekli bir değere sahip basit bir nöron çıkardı. Sinir ağınızdan regresyon çıkışı ile RMSE'yi kayıp fonksiyonunuz olarak kullanabilirsiniz.

Ayrıca, girdi alanınıza koyduğunuz örnekleri, trend çizgisi hakkında bilgi içerebileceğini düşündüğünüz bazı ek bilgilerle desteklemelisiniz. Örneğin, bitcoin ve altın olmak üzere 2 farklı ürünüm olsaydı ve girdi vektörleri aynıysa, altının çok az dalgalanma olmasını bekleyebilirdim, ancak bitcoin'in çok yüksek dalgalanmaya sahip olmasını bekleyebilirim.

Ağınıza giriş özellikleriniz, ağınızın öğreneceği tüm bilgileri içerir. Böylece, anlamlı bir tahmin için yeterli bilgi sağladığınızdan emin olmak istersiniz.

Derin öğrenme verilere açtır

Yaklaşık 100.000'den fazla örneğe ihtiyacınız olacak. Her örnek bir dizi özelliktir. Bunlar bağımsız olarak ve aynı şekilde dağıtılacak şekilde çizilmelidir. Başka bir deyişle, ağınızı kullanmak istediğiniz çeşitli veri kaynaklarından birden fazla eğilim çizgisi elde etmek istiyorsunuz ve daha sonra rastgele 0-6 puan, yani özellikleriniz ve etiketiniz olacak 7 çizeceksiniz.

Öğrenmeye çalıştığınız veri dağıtımını düşünün. Ağınızın kedileri / köpekleri sınıflandırmasını istiyorsanız, ağın her iki sınıfta da varyansı tanımlayabilmesi için çok çeşitli farklı görünümlü kediler ve köpekler vermeniz gerekir. Veri kaynağını çok fazla kısıtlarsanız, yüksek önyargıya sahip olur ve daha sonra içine besleyeceğiniz yeni verilere genelleme yapmaz.


Bunları deneyin ve neler olduğunu bize bildirin.


2

Belki de girdi ile aynı tahmin, ağınızın yetersiz eğitildiğini yansıtır. Zaman serisi tahmini için kalıcılık modeli olarak adlandırılır, genellikle diğer modeller için bir temel kullanılır. Kalıcılık modeli son gözlemi bir tahmin olarak kullanmaktadır. Basittir ve genellikle makul doğruluk sağlar. Benim tahminim, ağınızın kalıcılık modelini öğrenerek başlamasıdır ve sadece daha fazla eğitirseniz ve daha iyi bir model oluşturmak mümkünse, öğrenir - ancak bu çok fazla eğitim gerektirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.