আর্থিক সময় সিরিজের ডেটা পূর্বাভাস দেওয়ার জন্য টেনসরফ্লো ব্যবহার করার চেষ্টা করছেন


10

আমি এমএল এবং টেনসরফ্লোতে নতুন (আমি প্রায় কয়েক ঘন্টা আগে শুরু করেছি), এবং সময় সিরিজের পরবর্তী কয়েকটি ডেটা পয়েন্টের পূর্বাভাস দেওয়ার জন্য আমি এটি ব্যবহারের চেষ্টা করছি। আমি আমার ইনপুট নিচ্ছি এবং এটি দিয়ে এটি করছি:

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

আমি যেটা করছিলাম তা হ'ল এক্সটিকে ইনপুট ডেটা হিসাবে এবং y কে এই ইনপুটটির জন্য পছন্দসই আউটপুট হিসাবে ব্যবহার করা হচ্ছে, যাতে 0-6 দেওয়াতে আমি 1-7 (বিশেষত 7) পেতে পারি। যাইহোক, আমি যখন আমার গ্রাফটিকে ইনপুট হিসাবে এক্স দিয়ে চালিত করি, তখন আমি যা পাই তা একটি পূর্বাভাস যা 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()

নীচের গ্রাফ দেখানো ফলাফলের একটি পূর্বানুমান যে অনুসরণ করে এক্স বদলে বাম (এবং ডান দিকে পূর্বাভাস পয়েন্ট সহ) স্থানান্তরিত হচ্ছে যেমন অনুরূপ হওয়া উচিত Y । স্পষ্টতই ইচ্ছা লাল রেখাটি যতটা সম্ভব নীল রঙের কাছাকাছি হওয়া উচিত।

চিত্রলেখ

আমি এই সমস্ত দিয়ে কি করছি আমার কোনও ধারণা নেই, তাই দয়া করে ELI5 করুন।

ওহ, এছাড়াও, আমার ডেটা পয়েন্টগুলি মোটামুটি ছোট সংখ্যা (0.0001 এর ক্রম)। যদি আমি তাদের দ্বারা 1000000 দিয়ে গুণ না করি, ফলাফলগুলি এত ছোট যে চার্টের নীচে লাল রেখা প্রায় সমতল। কেন? আমি অনুমান করছি এটি ফিটনেস ফাংশনে স্কোয়ারের কারণে। ব্যবহারের আগে ডেটাগুলি স্বাভাবিক করা উচিত, এবং যদি তাই হয় তবে কী? 0-1? যদি আমি ব্যবহার করি:

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

আমার ভবিষ্যদ্বাণীটি বিকাশের সাথে সাথে আরও বর্বরভাবে ওঠানামা করছে: fluctuating

সম্পাদনা: আমি বোবা হয়ে যাচ্ছি এবং কেবল এটির একটি উদাহরণ দিচ্ছি, 500 নয়, আমি না? সুতরাং আমি এটি একাধিক 500-পয়েন্ট নমুনা দেওয়া উচিত, তাই না?


আমার একই সমস্যা রয়েছে - যথা আরএনএন এর আউটপুট ইনপুট (এক্স) অনুসরণ করে লক্ষ্য (ওয়াই) নয়। স্ট্রেঞ্জলি যখন একই RNN ইনপুট একটি সহজ সাইন সিরিজ এটি সঠিকভাবে শিখে, অর্থাত্ ওয়াই অনুমান
Ryszard Cetnarski

দয়া করে আপনার ডেটাসেট.সিএসভি ফাইলটি ভাগ করুন
আশ্বিন তোমার

উত্তর:


2

ঠিক আছে চলুন খণ্ড খণ্ড খণ্ড। এখানে বেশ কয়েকটি অংশ রয়েছে যেখানে আপনি আপনার নেটওয়ার্কের পক্ষপাতিত্ব বিবেচনা করবেন না।

আপনার ইনপুট এবং আউটপুট নির্বাচন করা

যদি ভেক্টর 0-6 নির্ধারিত হয় তবে সত্যিকার অর্থে 1-7 আউটপুট দেওয়ার দরকার নেই। 1-6 ইতিমধ্যে পরিচিত এবং অতিরিক্ত আউটপুট যুক্ত করা কেবল আপনার মডেলের জটিলতা যুক্ত করবে। আপনার কাছে পর্যাপ্ত পরিমাণে ডেটা না থাকলে আপনি ভাল পারফরম্যান্স পেতে আপনার মডেলটিকে যথাসম্ভব সহজ রাখতে চান। সুতরাং, আমি অবিচ্ছিন্ন মান সহ একটি সাধারণ নিউরন আউটপুট করব। আপনি আপনার নিউরাল নেটওয়ার্ক থেকে রিগ্রেশন আউটপুট নিয়ে আপনার ক্ষতির ফাংশন হিসাবে আরএমএসই ব্যবহার করতে পারেন।

অতিরিক্তভাবে, আপনি আপনার ইনপুট স্পেসে রেখেছেন এমন কিছু অতিরিক্ত তথ্য যা আপনার মনে হতে পারে ট্রেন্ড লাইন সম্পর্কে তথ্য ধারণ করবে সেগুলির পরিপূরক করা উচিত। উদাহরণস্বরূপ, আমার যদি 2 টি আলাদা পণ্য, বিটকয়েন এবং সোনার থাকে এবং তাদের ইনপুট ভেক্টর একই থাকে তবে আমি আশা করতে পারি যে সোনার খুব কম ওঠানামা হবে তবে বিটকয়েনটি খুব উচ্চ ওঠানামা করবে।

আপনার নেটওয়ার্কে আপনার ইনপুট বৈশিষ্ট্যগুলিতে এমন সমস্ত তথ্য রয়েছে যা থেকে আপনার নেটওয়ার্ক শিখবে। সুতরাং, আপনি নিশ্চিত করতে চান যে আপনি একটি অর্থবহ ভবিষ্যদ্বাণী করার জন্য পর্যাপ্ত তথ্য সরবরাহ করছেন।

গভীর শেখা ডেটা ক্ষুধার্ত

আপনার প্রায় 100,000+ দৃষ্টান্ত প্রয়োজন হবে। প্রতিটি উদাহরণ বৈশিষ্ট্যের একটি সেট। এগুলি স্বাধীনভাবে আঁকতে হবে এবং এগুলি একইভাবে বিতরণ করা উচিত। অন্য কথায়, আপনি নিজের নেটওয়ার্কটি ব্যবহার করতে ইচ্ছুক এমন ডেটার বিবিধ উত্স থেকে একাধিক ট্রেন্ডলাইন পেতে চান এবং তারপরে আপনি এলোমেলোভাবে 0-6 পয়েন্ট আঁকেন, এটি আপনার বৈশিষ্ট্য এবং 7 যা আপনার লেবেল হবে।

আপনি যে ডেটা বিতরণটি শিখার চেষ্টা করছেন তা বিবেচনা করুন। আপনি যদি নিজের নেটওয়ার্ক বিড়াল / কুকুরকে শ্রেণীবদ্ধ করতে চান তবে আপনাকে বিভিন্ন ধরণের বিড়াল এবং কুকুরের বিস্তৃত পরিসর প্রদান করতে হবে যাতে এই উভয় শ্রেণিতে বিদ্যমান বৈচিত্রটি নেটওয়ার্কটি সনাক্ত করতে পারে। আপনি যদি ডেটা উত্সকে খুব বেশি সীমাবদ্ধ করেন তবে এর উচ্চ পক্ষপাত হবে এবং আপনি পরবর্তীকালে এটি ফিড করবেন এমন অভিনব ডেটাতে সাধারণীকরণ করবেন না।


এই জিনিসগুলি চেষ্টা করে দেখুন কী ঘটে তা আমাদের জানান।


2

সম্ভবত ইনপুটটির সমান ভবিষ্যদ্বাণীটি প্রতিফলিত করে যে আপনার নেটওয়ার্কটি প্রশিক্ষণপ্রাপ্ত। সময় সিরিজের পূর্বাভাসের জন্য তথাকথিত অধ্যবসায় মডেল, প্রায়শই অন্যান্য মডেলের জন্য একটি বেসলাইন ব্যবহৃত হয়। দৃistence়তা মডেল শেষ পর্যবেক্ষণটিকে পূর্বাভাস হিসাবে ব্যবহার করছে। এটি সহজ এবং প্রায়শই যুক্তিসঙ্গত নির্ভুলতা দেয়। আমার অনুমান যে আপনার নেটওয়ার্কটি দৃistence়তা মডেল শিখার মাধ্যমে শুরু হয় এবং আপনি যদি এটির আরও প্রশিক্ষণ দেন এবং আরও ভাল মডেল তৈরি করা সম্ভব হয় তবে এটি এটি শিখবে - তবে এর জন্য প্রচুর প্রশিক্ষণের প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.