พยายามใช้ TensorFlow เพื่อทำนายข้อมูลอนุกรมเวลาทางการเงิน


10

ฉันใหม่สำหรับ ML และ TensorFlow (ฉันเริ่มประมาณสองสามชั่วโมงที่ผ่านมา) และฉันพยายามใช้เพื่อทำนายจุดข้อมูลสองสามอันถัดไปในอนุกรมเวลา ฉันรับข้อมูลของฉันและทำสิ่งนี้กับมัน:

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

สิ่งที่ฉันคิดว่าฉันกำลังทำคือการใช้xเป็นข้อมูลอินพุตและyเป็นผลลัพธ์ที่ต้องการสำหรับอินพุตนั้นเพื่อให้ 0-6 ฉันจะได้รับ 1-7 (โดยเฉพาะ 7) แต่เมื่อผมทำงานกราฟของฉันกับxเป็น input ในสิ่งที่ฉันได้รับคือการทำนายที่มีลักษณะเหมือนxกว่าปี

นี่คือรหัส (ตามโพสต์นี้และโพสต์นี้ ):

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

ผลที่ได้แสดงในกราฟด้านล่างคือการทำนายว่าต่อไปนี้xแทนที่จะถูกเลื่อนไปทางซ้าย (และรวมทั้งจุดที่คาดการณ์ไว้ทางด้านขวา) ในขณะที่มันควรจะมีลักษณะคล้ายกับY เห็นได้ชัดว่าความปรารถนาที่จะให้เส้นสีแดงใกล้เคียงกับสีฟ้ามากที่สุด

กราฟ

ฉันไม่รู้ว่าฉันกำลังทำอะไรกับเรื่องนี้ดังนั้นโปรด ELI5

โอ้จุดข้อมูลของฉันก็ค่อนข้างเล็ก (ลำดับ 0.0001) ถ้าฉันไม่คูณพวกมันด้วยพูดว่า 1000000 ผลลัพธ์จะเล็กจนเส้นสีแดงเกือบแบนที่ด้านล่างของแผนภูมิ ทำไม? ฉันเดาว่ามันเป็นเพราะการยกกำลังสองในฟังก์ชั่นการออกกำลังกาย ข้อมูลควรจะถูกทำให้เป็นมาตรฐานก่อนการใช้งานและถ้าเป็นเช่นนั้นกับสิ่งใด 0-1? ถ้าฉันใช้:

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

การคาดการณ์ของฉันผันผวนมากขึ้นเมื่อดำเนินไปเรื่อย ๆ : มีความผันผวน

แก้ไข:ฉันเป็นคนโง่และให้ยกตัวอย่างเพียงอย่างเดียวเพื่อเรียนรู้จากไม่ใช่ 500 ใช่ไหม ดังนั้นฉันควรให้ตัวอย่าง 500 จุดหลายจุดใช่ไหม


ฉันมีปัญหาเดียวกัน - กล่าวคือผลลัพธ์ของ RNN เป็นไปตามอินพุต (X) และไม่ใช่เป้าหมาย (Y) น่าประหลาดใจเมื่ออินพุตไปยัง RNN เดียวกันเป็นชุดไซน์ที่เรียบง่ายซึ่งเรียนรู้ได้อย่างถูกต้องเช่นทำนาย Y
Ryszard Cetnarski

โปรดแชร์ไฟล์ชุดข้อมูลของคุณ
Ashwin Tomar

คำตอบ:


2

โอเคกันทีละส่วน มีบางส่วนที่นี่ซึ่งคุณไม่ได้คำนึงถึงความลำเอียงในเครือข่ายของคุณ

การเลือกอินพุทและเอาท์พุทของคุณ

หากมีการพิจารณาเวกเตอร์ 0-6 ก็ไม่จำเป็นต้องมีเอาต์พุต 1-7 รู้จักกันแล้ว 1-6 และการเพิ่มเอาต์พุตเพิ่มเติมจะเพิ่มความซับซ้อนให้กับโมเดลของคุณเท่านั้น นอกจากว่าคุณมีข้อมูลจำนวนมากคุณต้องการทำให้แบบจำลองของคุณง่ายที่สุดเท่าที่จะเป็นไปได้เพื่อให้ได้ประสิทธิภาพที่ดี ดังนั้นฉันจะส่งออกเซลล์ประสาทที่เรียบง่ายด้วยค่าอย่างต่อเนื่อง คุณสามารถใช้ RMSE เป็นฟังก์ชันการสูญเสียของคุณด้วยเอาต์พุตการถดถอยจากเครือข่ายประสาทของคุณ

นอกจากนี้คุณควรเสริมตัวอย่างที่คุณใส่ลงในพื้นที่ป้อนข้อมูลของคุณด้วยข้อมูลเพิ่มเติมบางอย่างที่คุณอาจคิดว่าจะมีข้อมูลเกี่ยวกับเส้นแนวโน้ม ตัวอย่างเช่นถ้าฉันมี 2 ผลิตภัณฑ์ที่แตกต่างกัน bitcoin และทองคำและเวกเตอร์อินพุตของพวกเขาเหมือนกันฉันอาจคาดหวังว่าทองคำจะมีความผันผวนน้อยมาก แต่ bitcoin จะมีความผันผวนสูงมาก

คุณสมบัติอินพุตของคุณไปยังเครือข่ายของคุณมีข้อมูลทั้งหมดที่เครือข่ายของคุณจะได้เรียนรู้ ดังนั้นคุณต้องการตรวจสอบให้แน่ใจว่าคุณให้ข้อมูลที่เพียงพอเพื่อการคาดการณ์ที่มีความหมาย

การเรียนรู้อย่างลึกซึ้งคือข้อมูลที่หิว

คุณจะต้องมีอินสแตนซ์ประมาณ 100,000 รายการ แต่ละอินสแตนซ์เป็นชุดของคุณสมบัติ สิ่งเหล่านี้ควรดึงออกมาอย่างอิสระและแจกจ่ายให้เหมือนกัน กล่าวอีกนัยหนึ่งคุณต้องการรับเส้นแนวโน้มหลายเส้นจากแหล่งข้อมูลที่หลากหลายที่คุณต้องการใช้เครือข่ายด้วยแล้วคุณจะสุ่ม 0-6 คะแนนนั่นคือคุณสมบัติของคุณและ 7 ซึ่งจะเป็นป้ายกำกับของคุณ

พิจารณาการกระจายข้อมูลที่คุณพยายามเรียนรู้ หากคุณต้องการให้เครือข่ายของคุณจำแนกแมว / สุนัขคุณจะต้องให้แมวและสุนัขที่ดูแตกต่างหลากหลายเพื่อให้เครือข่ายสามารถระบุความแปรปรวนที่มีอยู่ในทั้งสองชั้นเรียนเหล่านี้ หากคุณ จำกัด แหล่งข้อมูลมากเกินไปจะมีอคติสูงและจะไม่พูดคุยกับข้อมูลใหม่ที่คุณจะป้อนเข้าไปในภายหลัง


ลองสิ่งเหล่านี้และแจ้งให้เราทราบว่าเกิดอะไรขึ้น


2

บางทีการทำนายเหมือนกันกับอินพุตนั้นแสดงว่าเครือข่ายของคุณได้รับการฝึกอบรมไม่ดี เรียกว่าแบบติดตาสำหรับการทำนายอนุกรมเวลามักจะใช้เป็นพื้นฐานสำหรับรุ่นอื่น ๆ แบบจำลองการติดตาใช้การสังเกตครั้งสุดท้ายเป็นคำทำนาย มันง่ายและมักจะให้ความแม่นยำที่สมเหตุสมผล ฉันเดาว่าเครือข่ายของคุณเริ่มต้นด้วยการเรียนรู้รูปแบบการคงอยู่และถ้าคุณฝึกฝนมันมากขึ้นและเป็นไปได้ที่จะสร้างแบบจำลองที่ดีกว่ามันจะเรียนรู้ได้ - แต่นี่ต้องใช้การฝึกฝนมากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.