वित्तीय समय श्रृंखला डेटा की भविष्यवाणी करने के लिए TensorFlow का उपयोग करने की कोशिश कर रहा है


10

मैं ML और TensorFlow के लिए नया हूं (मैंने कुछ घंटों पहले शुरू किया था), और मैं एक समय श्रृंखला में अगले कुछ डेटा बिंदुओं की भविष्यवाणी करने के लिए इसका उपयोग करने की कोशिश कर रहा हूं। मैं अपना इनपुट ले रहा हूं और इसके साथ यह कर रहा हूं:

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

मैंने जो सोचा था कि मैं इनपुट डेटा के रूप में x का उपयोग कर रहा हूं और उस इनपुट के लिए वांछित आउटपुट के रूप में y का उपयोग कर रहा हूं , ताकि 0-6 मुझे 1-7 (विशेष रूप से 7) मिल सके। हालाँकि, जब मैं इनपुट के रूप में x के साथ अपना ग्राफ चलाता हूं, तो मुझे जो मिलता है वह एक भविष्यवाणी है जो y की तुलना में 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

कृपया अपना डेटासेट साझा करें। फाइल
अश्विन तोमर

जवाबों:


2

ठीक है चलो भाग के द्वारा जाना। यहाँ कुछ भाग हैं जहाँ आप अपने नेटवर्क में पूर्वाग्रह को ध्यान में नहीं रखते हैं।

अपना इनपुट और आउटपुट चुनना

यदि वेक्टर 0-6 निर्धारित किया गया है तो वास्तव में 1-7 आउटपुट की आवश्यकता नहीं है। 1-6 पहले से ही ज्ञात है और अतिरिक्त आउटपुट जोड़ने से केवल आपके मॉडल में जटिलता बढ़ेगी। जब तक आपके पास पर्याप्त मात्रा में डेटा नहीं होता है तब तक आप अपने मॉडल को अच्छा प्रदर्शन करने के लिए यथासंभव सरल रखना चाहते हैं। इस प्रकार, मैं एक सतत मूल्य के साथ एक साधारण न्यूरॉन का उत्पादन करूंगा। आप अपने तंत्रिका नेटवर्क से प्रतिगमन आउटपुट के साथ अपने नुकसान फ़ंक्शन के रूप में आरएमएसई का उपयोग कर सकते हैं।

इसके अतिरिक्त, आपको अपने इनपुट स्थान में लगाए गए नमूनों को कुछ अतिरिक्त जानकारी के साथ पूरक करना चाहिए जो आपको लगता है कि ट्रेंड लाइन के बारे में जानकारी होगी। उदाहरण के लिए, अगर मेरे पास 2 अलग-अलग उत्पाद, बिटकॉइन और गोल्ड थे, और उनका इनपुट वेक्टर एक ही था, तो मैं उम्मीद कर सकता हूं कि सोने में बहुत कम उतार-चढ़ाव होगा लेकिन बिटकॉइन में बहुत अधिक उतार-चढ़ाव होगा।

आपके नेटवर्क में आपके इनपुट फीचर्स में वे सभी जानकारी होती हैं जिनसे आपका नेटवर्क सीखेगा। इस प्रकार, आप यह सुनिश्चित करना चाहते हैं कि आप एक सार्थक भविष्यवाणी करने के लिए पर्याप्त जानकारी की आपूर्ति कर रहे हैं।

डीप लर्निंग डेटा भूखा है

आपको लगभग 100,000+ इंस्टेंसेस की आवश्यकता होगी। प्रत्येक उदाहरण सुविधाओं का एक समूह है। इन्हें स्वतंत्र रूप से तैयार किया जाना चाहिए और इन्हें ऐसे ही वितरित किया जाना चाहिए। दूसरे शब्दों में, आप डेटा के एक विविध स्रोत से कई ट्रेंडलाइन प्राप्त करना चाहते हैं, जिसके साथ आप अपने नेटवर्क का उपयोग करना चाहते हैं और फिर आप बेतरतीब ढंग से 0-6 अंक बनाएंगे, यही आपकी विशेषताएं हैं, और 7 जो आपका लेबल होगा।

उस डेटा वितरण पर विचार करें जिसे आप सीखने की कोशिश कर रहे हैं। यदि आप अपने नेटवर्क को बिल्लियों / कुत्तों को वर्गीकृत करना चाहते हैं, तो आपको विभिन्न दिखने वाली बिल्लियों और कुत्तों की एक विस्तृत श्रृंखला देने की आवश्यकता है, ताकि नेटवर्क उस भिन्नता की पहचान कर सके जो इन दोनों वर्गों में मौजूद है। यदि आप डेटा स्रोत को बहुत अधिक प्रतिबंधित करते हैं, तो इसमें उच्च पूर्वाग्रह होंगे और उपन्यास डेटा को सामान्यीकृत नहीं करेंगे जो आप बाद में इसमें फीड करेंगे।


इन चीजों को आजमाएं और हमें बताएं कि क्या होता है।


2

शायद इनपुट के समान होने की भविष्यवाणी यह ​​दर्शाती है कि आपका नेटवर्क कम प्रशिक्षित है। समय श्रृंखला भविष्यवाणी के लिए दृढ़ता मॉडल कहा जाता है, अक्सर अन्य मॉडलों के लिए एक आधार रेखा का उपयोग किया जाता है। दृढ़ता मॉडल भविष्यवाणी के रूप में अंतिम अवलोकन का उपयोग कर रहा है। यह सरल है और अक्सर उचित सटीकता देता है। मेरा अनुमान है कि आपका नेटवर्क दृढ़ता मॉडल सीखने से शुरू होता है, और केवल तभी जब आप इसे और अधिक प्रशिक्षित करते हैं और बेहतर मॉडल बनाना संभव होता है, यह इसे सीखेगा - लेकिन इसके लिए बहुत अधिक प्रशिक्षण की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.