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ı.
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:
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?