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

以下のグラフに示されている結果は、yに似ているはずであるので、左にシフトされている(および予測された点を右に含んでいる)のではなく、xに続く予測です。明らかに、赤い線が青い線にできるだけ近くなることが望まれます。

グラフ

私はこれで何をしているのかわからないので、ELI5をお願いします。

ああ、また、私のデータポイントはかなり小さい数(0.0001のオーダー)です。たとえば、1000000を掛けない場合、結果は非常に小さいため、赤い線はグラフの下部でほぼ平坦になります。どうして?フィットネス関数の二乗が原因だと思います。使用前にデータを正規化する必要がありますか?0-1?私が使用する場合:

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

私の予測は、それが進行するにつれてさらに激しく変動します。 変動する

編集:私は愚かであり、500ではなく、そこから学ぶための1つの例しか与えていませんか?だから私はそれに複数の500点のサンプルを与えるべきですよね?


私は同じ問題を抱えています-つまり、RNNの出力はターゲット(Y)ではなく入力(X)に従います。同じRNNへの入力は、それが正しく学習単純な正弦シリーズであるとき不思議なこと、つまりはY.予測
リシャルトCetnarski

データセット.csvファイルを共有してください
Ashwin Tomar

回答:


2

では、少しずつ行きましょう。ここでは、ネットワークのバイアスを考慮しない部分がかなりあります。

入力と出力の選択

ベクトル0-6が決定された場合、実際には1-7を出力する必要はありません。1〜6は既知であり、出力を追加してもモデルが複雑になるだけです。かなりの量のデータがない限り、良好なパフォーマンスを得るために、モデルをできるだけ単純にしたいとします。したがって、私は連続値を持つ単純なニューロンを出力します。ニューラルネットワークからの回帰出力を使用して、RMSEを損失関数として使用できます。

さらに、入力ラインに入力したサンプルを、トレンドラインに関する情報が含まれていると思われる追加情報で補足する必要があります。たとえば、ビットコインとゴールドの2つの異なる製品があり、それらの入力ベクトルが同じである場合、ゴールドの変動は非常に少ないが、ビットコインの変動は非常に大きいと予想できます。

ネットワークへの入力機能には、ネットワークが学習するすべての情報が含まれています。したがって、意味のある予測を行うために十分な情報を提供していることを確認する必要があります。

ディープラーニングはデータに飢えています

約100,000以上のインスタンスが必要です。各インスタンスは一連の機能です。これらは独立して描かれ、同じように分布している必要があります。言い換えると、ネットワークで使用するさまざまなデータソースから複数のトレンドラインを取得し、ランダムに0〜6のポイント(つまり、フィーチャ)と7(ラベル)を描画します。

学習しようとしているデータの分布を検討してください。ネットワークで猫/犬を分類する場合は、ネットワークがこれらの両方のクラスに存在する差異を識別できるように、さまざまな見た目の猫と犬を与える必要があります。データソースを制限しすぎると、バイアスが高くなり、後でフィードする新しいデータに一般化されなくなります。


これらのことを試して、何が起こるか教えてください。


2

おそらく、入力と同じ予測は、ネットワークが十分にトレーニングされていないことを反映しています。時系列予測のいわゆる永続モデルは、他のモデルのベースラインとしてよく使用されます。持続性モデルは、最後の観測を予測として使用しています。それは単純で、しばしば妥当な精度をもたらします。私の推測では、ネットワークは永続性モデルを学習することから始まり、それをさらにトレーニングして、より優れたモデルを作成できる場合にのみ、学習します。ただし、これには多くのトレーニングが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.