LSTM ile Döviz Kuru Tahmini Çalışmam

Arkadaşlar merhabalar,

Ben yeni yeni LSTM öğrenmeye çalışıyorum. Birçok şeyi yeni öğrendiğim için takılıp kalıyorum. Birkaç hazır örnek ile çalıştım hatasız ilerledim. Ancak döviz kuru tahmini çalışmamda bir hata alıyorum ancak hatayı anlayamıyorum. Sizlere danışmak istedim.

import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

kütüphaneleri yükledim.

output_size = 2         
epochs = 700            
features = 3

İşlem sayısını ve sonraki 2 değeri tahmin edeceğim dedim.

def get_data(y):
    train_size = int(len(y)*0.7)
    train = y[0:train_size]
    test = y[train_size:len(y)]
    train_x = []
    train_y = []
    for i in range(0, train_size - features - output_size):
        tmp_x = y[i:(i+features)]
        tmp_y = y[(i+features):(i+features+output_size)]
        train_x.append(np.reshape(tmp_x, (1, features)))
        train_y.append(tmp_y)
    rain_x = np.array(train_x)
    train_y = np.array(train_y)
    test_x = []
    test_y = []
    last = len(y) - output_size - features
    for i in range(train_size, last):
        tmp_x = y[i:(i+features)]
        tmp_y = y[(i + features):(i + features + output_size)]
        test_x.append(np.reshape(tmp_x, (1, features)))
        test_y.append(tmp_y)
    test_x = np.array(test_x)
    test_y = np.array(test_y)
    data_x = []
    tmp_x = y[-features:len(y)]
    data_x.append(np.reshape(tmp_x, (1, features)))
    data_x = np.array(data_x)
    return train_x, train_y, test_x, test_y, data_x

train ve test için fonksiyonumu yazdım.

raw_data = pd.read_csv('http://www.facadium.com.tr/ply/doviz_kuru.csv', header=None, names=["i", "t", "y"])
t = np.array(raw_data.t.values)
y = np.array(raw_data.y.values)

Zaman ve veri sütunlarımı internettten çekerek sisteme tanıttım.

min = y.min()
max = y.max()
y = np.interp(y, (min, max), (-1, +1))
x_train, y_train, x_test, y_test, data_x = get_data(y)
model = Sequential()
model.add(LSTM(5, input_shape=(1, features), return_sequences=True))
model.add(Dropout(0.25))
model.add(LSTM(7))
model.add(Dense(output_size))

Burada LSTM kullanıyorum. Buraya kadar hata almıyorum. Ancak projeyi derlerken

model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=epochs, verbose=0)

Bu derleme kodunda hata alıyorum. Aldığım hata ise şu şekilde;


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-42-41d7e4cc7e4a> in <module>
      1 model.compile(loss='mse', optimizer='rmsprop', metrics=['accuracy'])
----> 2 model.fit(x_train, y_train, epochs=epochs, verbose=0)

~\anaconda3\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1106          training_utils.RespectCompiledTrainableState(self):
   1107       # Creates a `tf.data.Dataset` and handles batch and epoch iteration.
-> 1108       data_handler = data_adapter.get_data_handler(
   1109           x=x,
   1110           y=y,

~\anaconda3\lib\site-packages\keras\engine\data_adapter.py in get_data_handler(*args, **kwargs)
   1346   if getattr(kwargs["model"], "_cluster_coordinator", None):
   1347     return _ClusterCoordinatorDataHandler(*args, **kwargs)
-> 1348   return DataHandler(*args, **kwargs)
   1349 
   1350 

~\anaconda3\lib\site-packages\keras\engine\data_adapter.py in __init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution, distribute)
   1136     adapter_cls = select_data_adapter(x, y)
   1137     self._verify_data_adapter_compatibility(adapter_cls)
-> 1138     self._adapter = adapter_cls(
   1139         x,
   1140         y,

~\anaconda3\lib\site-packages\keras\engine\data_adapter.py in __init__(self, x, y, sample_weights, sample_weight_modes, batch_size, epochs, steps, shuffle, **kwargs)
    240 
    241     num_samples = set(int(i.shape[0]) for i in tf.nest.flatten(inputs)).pop()
--> 242     _check_data_cardinality(inputs)
    243 
    244     # If batch_size is not passed but steps is, calculate from the input data.

~\anaconda3\lib\site-packages\keras\engine\data_adapter.py in _check_data_cardinality(data)
   1612           label, ", ".join(str(i.shape[0]) for i in tf.nest.flatten(single_data)))
   1613     msg += "Make sure all arrays contain the same number of samples."
-> 1614     raise ValueError(msg)
   1615 
   1616 

ValueError: Data cardinality is ambiguous:
  x sizes: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  y sizes: 172
Make sure all arrays contain the same number of samples.

Ancak bu hatayı aldıktan sonra devam ediyorum. Skora bakıyorum

score = model.evaluate(x_test, y_test)
print("%2s: %.2f%%" % (model.metrics_names[1], score[1]*100))
model.summary()

Buradan sonra hata almıyorum. Aldığım sonuç :

3/3 [==============================] - 1s 8ms/step - loss: 0.1706 - accuracy: 0.2055
accuracy: 20.00%
Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_6 (LSTM)                (None, 1, 5)              180       
_________________________________________________________________
dropout_3 (Dropout)          (None, 1, 5)              0         
_________________________________________________________________
lstm_7 (LSTM)                (None, 7)                 364       
_________________________________________________________________
dense_3 (Dense)              (None, 4)                 32        
=================================================================
Total params: 576
Trainable params: 576
Non-trainable params: 0
_________________________________________________________________

Daha sonra sonuçları ekrana yazdırmak istiyorum:

data_y = model.predict(data_x)
result = np.interp(data_y, (-1, +1), (min, max))
print("Gelecekteki Degerler (output_size) :", result)

Buradan da hata almıyorum. Aldığım değer;

Gelecekteki Degerler (output_size) : [[4.20010142 4.20045725 4.2000851 4.20027894]]

Acaba burada aldığım hata ile neden karşılaşıyorum. Ayrıca hata alsam da ilerlememe rağmen sonuç almış olmam benim hatalı sonu aldığımı mı gösteriyor? Bunu çözemedim. Birçok yere baktım ama bulamadım cevabı. Acaba bu konuda bana yardımcı olabilir misiniz?

Teşekkürler

X ve Y’nin bulunduğu ilk ölçü birbirlerine eşit olmalıdır. (1,*)

1 Beğeni

Modeliniz fit metodunu çağırdığınızda hata veriyor. Bu da modelinizin hiç eğitilemediğini gösterir. Siz ise sonraki kodlarda eğitilmemiş bir modeli kullanmaya devam ediyorsunuz.

1 Beğeni

Çok teşekkür ederim arkadaşlar @Empera0 @EkremDincel

1 Beğeni