Çok Katmanlı LSTM'de Grafik Gösterimi Hakkında

Arkadaşlar merhabalar,

Ben çok katmanlı LSTM Modeller ile çalışıyorum. Burada elde ettiğim gerçek değerler ve tahmini değerleri ayrı ayrı grafiklerde gösterebiliyorum. Ancak gerçek sonuçlar ve tahmini sonuçları aynı grafik üzerinde nasıl göstereceğim bunu çözemedim. Bu konuda yardımcı olursanız çok sevinirim.

Covid19 sonuçları üzerinde çalışıyorum. Yaptığım çalışmam şu şekilde;

Kütüphaneleri yükledim ve verilerimi çekiyorum sonra da hesaplamalarımı yapıyorum. Grafiklerimi çizdiriyorum ancak dediğim gibi tahmini veri grafği ile gerçek değerlerin çizimini aynı grafikte gösteremiyorum. Bu konuda yardım edebilir misiniz. Çok teşekkür ediyorum şimdiden.

import os
import sys
os.chdir('/Users/onurk/Covid-19/')
import pandas as pd
import numpy as np
pd.options.display.max_columns=None
import plotly.graph_objects as go
import plotly.express as px
import matplotlib.pyplot as plt
import time
start = time.process_time()
from plotly.offline import init_notebook_mode, iplot
import warnings
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
warnings.filterwarnings('ignore')
init_notebook_mode(connected=True)
import tensorflow as tf
tf.get_logger().setLevel('INFO')
tf.autograph.set_verbosity(0)
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.callbacks import Callback, ModelCheckpoint, EarlyStopping, ReduceLROnPlateau
def plot_timeseries(x_axis,data,name):
    num_cols=data.shape[1]
    go_arr=[]
    for i in range(num_cols):
        go_arr.append(go.Scatter(x=x_axis, y=data.iloc[:,i],name=data.columns[i]))   
    fig=go.Figure(go_arr)

    fig.update_layout(
    title=name,font=dict(
        family="Courier New, monospace",
        color="#7f7f6a"))
    fig.show()
    

def plot_lines(df, title='', annotations=None):
    common_kw = dict(x=df.index, mode='lines+markers')
    xaxis = dict(title='Time Steps')
    data=[]
    for c in df.columns:
        data.append(go.Scatter(y=df[c], name=c, **common_kw))

    layout = dict(title=title, showlegend=True, annotations=annotations, xaxis=xaxis)
    fig=dict(data=data, layout=layout)
    iplot(fig,show_link=True)

agir_hasta_sayisi_data_df=pd.read_csv('http://facadium.com.tr/lstm_dataset/agir_hasta_sayisi.csv')
toplam_iyilesen_hasta_sayisi_data_df=pd.read_csv('http://facadium.com.tr/lstm_dataset/toplam_iyilesen_hasta_sayisi.csv')
toplam_vefat_sayisi_data_df=pd.read_csv('http://facadium.com.tr/lstm_dataset/toplam_vefat_sayisi.csv')
toplam_vaka_sayisi_data_df=pd.read_csv('http://facadium.com.tr/lstm_dataset/toplam_vaka_sayisi.csv')
toplam_test_sayisi_data_df=pd.read_csv('http://facadium.com.tr/lstm_dataset/toplam_test_sayisi.csv')
country_pred_df=pd.DataFrame()
model_performance_df=pd.DataFrame()

def get_time_series_data(country_name):
    
    grouped_agir_hasta_sayisi_df=agir_hasta_sayisi_data_df.groupby('Country/Region')
    grouped_toplam_iyilesen_hasta_sayisi_df=toplam_iyilesen_hasta_sayisi_data_df.groupby('Country/Region')
    grouped_toplam_vefat_sayisi_df=toplam_vefat_sayisi_data_df.groupby('Country/Region')
    grouped_toplam_vaka_sayisi_df=toplam_vaka_sayisi_data_df.groupby('Country/Region')
    grouped_toplam_test_sayisi_df=toplam_test_sayisi_data_df.groupby('Country/Region')

    country_agir_hasta_sayisi_df=grouped_agir_hasta_sayisi_df.get_group(country_name)
    country_toplam_iyilesen_hasta_sayisi_df=grouped_toplam_iyilesen_hasta_sayisi_df.get_group(country_name)
    country_toplam_vefat_sayisi_df=grouped_toplam_vefat_sayisi_df.get_group(country_name)
    country_toplam_vaka_sayisi_df=grouped_toplam_vaka_sayisi_df.get_group(country_name)
    country_toplam_test_sayisi_df=grouped_toplam_test_sayisi_df.get_group(country_name)
    
    cleaned_agir_hasta_sayisi_df=country_agir_hasta_sayisi_df.drop(columns=['Province/State','Lat','Long']).sum(axis=0,skipna=True).to_frame()[1:]
    cleaned_toplam_iyilesen_hasta_sayisi_df=country_toplam_iyilesen_hasta_sayisi_df.drop(columns=['Province/State','Lat','Long']).sum(axis=0,skipna=True).to_frame()[1:]
    cleaned_toplam_vefat_sayisi_df=country_toplam_vefat_sayisi_df.drop(columns=['Province/State','Lat','Long']).sum(axis=0,skipna=True).to_frame()[1:]
    cleaned_toplam_vaka_sayisi_df=country_toplam_vaka_sayisi_df.drop(columns=['Province/State','Lat','Long']).sum(axis=0,skipna=True).to_frame()[1:]
    cleaned_toplam_test_sayisi_df=country_toplam_test_sayisi_df.drop(columns=['Province/State','Lat','Long']).sum(axis=0,skipna=True).to_frame()[1:]
    
    ts_df=pd.DataFrame(cleaned_agir_hasta_sayisi_df.values,columns=['agir_hasta_sayisi'])
    ts_df['toplam_iyilesen_hasta_sayisi']=cleaned_toplam_iyilesen_hasta_sayisi_df.values
    ts_df['toplam_vefat_sayisi']=cleaned_toplam_vefat_sayisi_df.values
    ts_df['toplam_vaka_sayisi']=cleaned_toplam_vaka_sayisi_df.values
    ts_df['toplam_test_sayisi']=cleaned_toplam_test_sayisi_df.values
    
    ts_df.index=cleaned_agir_hasta_sayisi_df.index
    return ts_df
def plot(ts_df,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['agir_hasta_sayisi','toplam_iyilesen_hasta_sayisi','toplam_vefat_sayisi','toplam_vaka_sayisi','toplam_test_sayisi']],name='Degerlerin Karşılaştırması '+country_name)

def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        end_ix = i + n_steps
        if end_ix > len(sequence)-1:
            break
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return np.asarray(X), np.asarray(y) 
def build_model_and_predict(ts_df, country_name):
    n_steps = 4  
    n_features = 1
    n_test = 4
    X, Y = split_sequence(ts_df.agir_hasta_sayisi.values.astype('float32'), n_steps)
    X = X.reshape((X.shape[0], X.shape[1], n_features))

    X_train, X_test, Y_train, Y_test = X[:-n_test], X[-n_test:], Y[:-n_test], Y[-n_test:]  
    c = [
        ModelCheckpoint(country_name+'.hdf5', save_best_only=True, monitor='val_loss', mode='min', verbose=0, save_freq=1),
        EarlyStopping(monitor='val_loss', min_delta=0, patience=600, verbose=0),
        ReduceLROnPlateau(monitor='val_loss',factor=0.2,patience=5,min_lr=0.00001)
    ]
    model = Sequential()
    model.add(LSTM(100, return_sequences=True, input_shape=(n_steps,1)))
    model.add(LSTM(100, return_sequences=True))
    model.add(LSTM(100))
    model.add(Dense(1))
    


    
    model.compile(optimizer='adam', loss='mse', metrics=['mae','mse','accuracy'])

    history=model.fit(X_train, Y_train, epochs=4000, batch_size=32, verbose=0,callbacks=c,validation_data=(X_test, Y_test),shuffle=False)

    [mse, mae, loss, accuracy]= model.evaluate(X_test, Y_test, batch_size=32, verbose=0)

    model_performance=pd.DataFrame({'Country':[country_name],'mae':np.array(mae),'mse':np.array(mse),
                                    'rmse':np.array(np.sqrt(mse)),'accuracy':np.array(accuracy)})
    row = np.asarray(ts_df[-n_steps:].agir_hasta_sayisi.values.astype('float32')).reshape((1, n_steps, n_features))
    yhat = model.predict(row)
    return yhat, model_performance
ts_df=get_time_series_data('Turkiye')
plot(ts_df,'Turkiye')
def plot(agir_hasta_sayisi,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['agir_hasta_sayisi']],name='Ağır Hasta Sayısı Grafiği - '+country_name)
pd.set_option("display.max.rows", None)
agir_hasta_sayisi=get_time_series_data('Turkiye')
agir_hasta_sayisi
ts_df=get_time_series_data('Turkiye')
plot(agir_hasta_sayisi,'Turkiye')
def plot(toplam_iyilesen_hasta_sayisi,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['toplam_iyilesen_hasta_sayisi']],name='Toplam İyileşen Hasta Sayısı Sayısı Grafiği -  '+country_name)
pd.set_option("display.max.rows", None)
toplam_iyilesen_hasta_sayisi=get_time_series_data('Turkiye')
toplam_iyilesen_hasta_sayisi
ts_df=get_time_series_data('Turkiye')
plot(toplam_iyilesen_hasta_sayisi,'Turkiye')
def plot(toplam_vefat_sayisi,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['toplam_vefat_sayisi']],name='Toplam Vefat Sayısı Grafiği -  '+country_name)
pd.set_option("display.max.rows", None)
toplam_vefat_sayisi=get_time_series_data('Turkiye')
toplam_vefat_sayisi
ts_df=get_time_series_data('Turkiye')
plot(toplam_vefat_sayisi,'Turkiye')
def plot(toplam_vaka_sayisi,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['toplam_vaka_sayisi']],name='Toplam Vaka Sayısı Grafiği - '+country_name)
pd.set_option("display.max.rows", None)
toplam_vaka_sayisi=get_time_series_data('Turkiye')
toplam_vaka_sayisi
ts_df=get_time_series_data('Turkiye')
plot(toplam_vaka_sayisi,'Turkiye')
def plot(toplam_test_sayisi,country_name):
    plot_timeseries(x_axis=ts_df.index,data=ts_df[['toplam_test_sayisi']],name='Toplam Test Sayısı Grafiği - '+country_name)
pd.set_option("display.max.rows", None)
toplam_test_sayisi=get_time_series_data('Turkiye')
toplam_test_sayisi
ts_df=get_time_series_data('Turkiye')
plot(toplam_test_sayisi,'Turkiye')
n_steps = 4 
n_features = 1
X, Y = split_sequence(ts_df.agir_hasta_sayisi.values.astype('int'), n_steps)
for i in range(len(X)):
    print(X[i], Y[i])
country_names=['Turkiye']
for country_name in country_names:
    ts_df=get_time_series_data(country_name)
    yhat, model_performance = build_model_and_predict(ts_df,country_name)
    prediction=round(yhat[0][0])
    model_performance_df=model_performance_df.append(model_performance)
    country_pred_df=country_pred_df.append(pd.DataFrame({'Turkiye':[country_name],'SonDeger':ts_df[-1:].agir_hasta_sayisi.values,'TahminiDeger':np.array(prediction)}))
country_pred_df=country_pred_df.reset_index(drop=True)
country_pred_df=country_pred_df.sort_values(by='TahminiDeger',ascending=False)

fig = go.Figure()
fig.add_trace(go.Bar(x=country_pred_df['Turkiye'].values,
                y=country_pred_df['SonDeger'].values,
                name='# Dünkü Vakalar (Gerçek) ',
                marker_color='rgb(55, 83, 109)'
                ))
fig.add_trace(go.Bar(x=country_pred_df['Turkiye'].values,
                y=country_pred_df['TahminiDeger'].values,
                name='# Bugünkü Vakalar (Tahmini) ',
                marker_color='rgb(26, 118, 255)'
                ))

fig.update_layout(
    title='Ertesi Gün için Vaka Sayısını Tahmin Etmek için LSTM Modeli ',
    xaxis_tickfont_size=14,
    yaxis=dict(
        title='Vaka Sayısı',
        titlefont_size=16,
        tickfont_size=14,
    ),
    legend=dict(
        x=0,
        y=1.0,
        bgcolor='rgba(255, 255, 255, 0)',
        bordercolor='rgba(255, 255, 255, 0)'
    ),
    barmode='group',
    bargap=0.15,
    bargroupgap=0.1 
)
fig.show()
country_pred_df=country_pred_df.sort_values(by='Turkiye')
country_pred_df.index=country_pred_df['Turkiye']
country_pred_df=country_pred_df.drop(columns=['Turkiye'])

country_pred_df
print('Toplam Süre : '+str((time.process_time() - start)/3600)+' hours')
print('Toplam Süre : '+str((time.process_time() - start)/60)+' mins')
plot_lines(country_pred_df,'Son Değer - Tahmini Değer')
model_performance_df.index=model_performance_df['Country'].values
model_performance_df=model_performance_df.drop(columns=['Country'])
plot_lines(model_performance_df)
model_performance_df
print('Toplam Süre : '+str((time.process_time() - start)/60)+' mins')

Merhaba, burası mı ayrı ayrı grafik oluşturan kısım? İki grafik mi oluşuyor?

Ağır Hasta Sayısı için şunu kullanıyorum;

ts_df=get_time_series_data('Turkiye')
plot(agir_hasta_sayisi,'Turkiye')

Toplam İyileşen Hasta Sayısı için şunu kullanıyorum:

ts_df=get_time_series_data('Turkiye')
plot(toplam_iyilesen_hasta_sayisi,'Turkiye')

Bu şekilde grafiklere döküyorum ancak bu grafikte aynı anda örnek veriyorum hem gerçek Toplam İyileşen Hasta Sayısı hem de tahmini Toplam İyileşen Hasta Sayısını tek bir grafik ekranında çizdiremyorum. Bu konuda ne yapmam gerekiyor acaba

İstediğiniz verileri bir araya getirip plot_timeseries’e paslasanız olmaz mı?

Burada öyle yapıyorsunuz zaten?

Diğer projemde bunu yaptım. Ancak bu LSTM çalışmada nasıl yapacağımı bilemiyorum. Ya doğru kodları yazamıyorum ya da başka bir yerde hata yapıyorum ama bulamıyorum. Acaba bu konuda bir fikriniz var mı?

Diğer proje derken neyi kastettiğinizi anlayamadım ama yukarıda alıntılanan kodu (ilk gönderide paylaştığınız) istediğiniz sütunları seçerek çalıştırmayı kastetmiştim:

plot_timeseries(x_axis=ts_df.index,
                data=ts_df[["agir_hasta_sayisi", "toplam_iyilesen_hasta_sayisi"],
                name="Başlık")

Şöyle ki ben 1 katmanlı yapay sinir ağı kullanarak bu çalışmayı yaptım. 3 Katmanlı da yaptım. Onlarda sorun yaşamadım. Ancak şu an LSTM kullanarak yapmaya çalışıyorum. Burada değerleri elde ediyorum ancak bunu aynı grafik ekranında çizdiremiyorum.

Yukarıdaki kodu denediniz mi?

Evet denedim ancak şöyle bir hata alıyorum.

image

Ortadaki satırda en sonda bir ] eksik kusura bakmayın. Yaptığı şey bazı sütunları seçmek. Siz de benzerini yukarıda yapmışsınz zaten.

Estağfurullah. Ben burada tahmin yaptırıyorum aslında. İlk üç değer gerçekleşen değer. 4. Değer ise tahmin edilen değer. Yanlış mıyım acaba?

n_steps = 4 
n_features = 1
X, Y = split_sequence(ts_df.agir_hasta_sayisi.values.astype('int'), n_steps)
for i in range(len(X)):
    print(X[i], Y[i])

image

Mesela bu örnek olarak incelediğim yabancı bir makale. Kodlar yok sadece konuyu anlatıyor ancak grafiklerde benim bahsettiğim çalışmayı yapmış. Gerçek ve Tahmini aynı grafikte yayınlamış.

Köşeli parantez içerisinde yer alan 4 değere bakarak yanında yer alan değeri tahmin etmeye çalışılır. X dizayn matrisi, yani neye bakılarak tahmin edileceğini söylüyor; y ise hedef vektörü yani tahmin edilmek isteneni temsil ediyor.

Burada “sliding window” metodu kullanılarak düz / 1 boyutlu bir zaman serisi LSTM ve benzeri mimarilere beslenebilmek adına şekillendiriliyor. n_steps aslında ne kadar geriye bakılacağını söyler. Sizde bu 4’e eşit. Yani 4 veriye bakarak 5. tahmin edilmeye çalışılacak.

Diyelim ki 9 uzunluğa sahip bir serimiz var ve n_steps == 4. İlk adımda şu oluyor:

1   2   3   4   5   6   7   8   9
^   ^   ^   ^   O

^ ile işaretlenenler X’e gider, O ise y’ye. Yani bu adımda X’e [1, 2, 3, 4]'ü topladık, y’ye ise 5 değerini.

Sonra

1   2   3   4   5   6   7   8   9
    ^   ^   ^   ^   O

Dikkat ederseniz hepsi 1 kaydı sağa (sliding window; window’un boyutu 4 + 1 diye düşünülebilir, sliding miktarı da genelde 1 alınır o yüzden 1 kaydı sağa). Şimdi ise X’e [2, 3, 4, 5] giderken, y’ye 6 gider. Önemli bir husus: 5’i az önce tahmin etmeye çalışıyorduk (y’de idi), şimdi ise X’e kattık. Bu, yaptığımızın 1-adım ötesi için tahmin olduğunu söyler zira tahminden sonra gerçek değeri kullanıyoruz bir sonraki adımda.

Tabii bu kayma verinin sonuna kadar gider (buradaki örnekte 3 kere daha kayar ve biter). Sonrasında elinizde bir X verisi olur boyutu (5, 4) olan (genel formül: (serinin_uzunluğu - n_step, n_step)). y de 5 elemana sahip olur (serinin_uzunluğu - n_step). Sonra siz bunları makine öğrenmesi modeline paslarsınız.

Bu arada grafik mevzusu çözüldü mü emin değilim :d

Çok teşekkür ederim anlatım için. Ben grafiği çözemedim. Yani değerleri yanlış mı yapıyorum anlamadım. Ben şöyle yaptım gerçek değerler mavi renkte olanlar, tahmini değerler de sağdaki kırmızı alan içindekiler. Buraya kadar bir hata yok galiba. LSTM ile ağır hasta sayılarında bulduğum sonuçlar bu şekilde değil mi. Peki buradan sonra ben nasıl gerçek ve tahmini değerleri aynı grafikte gösterebilirim. Bunu yapamıyorum işte.

image

Bu değerleri nerede tutuyorsunuz? Bir DataFrame’de mi? Yoksa ayrı ayrı değişkenlerde mi? Paylaştığınız kod hayli uzun olduğu için tespiti zor oluyor.

Herhangi bir yerde tutmuyorum. Açıkçası ben verilen listenin içinden kendi çekip alsın istiyorum. Burada;

image

çıkan listedeki tahmin değerleri kendisi çekebilir mi diye uğraşıyorum. Yoksa yanlış mı yapıyorum. Yani excel içerisine kayıt edip ondan sonra excel içinden mi grafiği çekip yayınlayacağım…?

“Tahmini Değerler” diye işaret ettiğiniz kısım aslında gerçek değerler. “Gerçek Değerler” dediğiniz kısım ise modelin tahmin yaparken kullanacağı değerler. Onları modele yolladıktan sonra tahmini değerleri elde edersiniz. İlk gönderideki kodda onu yapıyor musunuz emin değilim.

:smiley: yani tam olarak nasıl yapmam gerekiyor :smiley: cidden kafam yandı.

Verilen bir zaman serisinden başlayarak veriyi hazırlama, modeli eğitme ve sonucu grafiksel olarak gösterme adımlarını aşağıda aktarmaya çalıştım. Yorumlarla ilgili kısımları belirtmeye çalıştım. Kendinize uyarlayabilirsiniz belki.

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, LSTM

# veriyi elde ediyoruz
url = "https://raw.githubusercontent.com/mustafaaydn/mustafaaydn.github.io/master/from_2021.csv"
zaman_serisi = pd.read_csv(url, index_col=0, squeeze=True)

# veriye bir bakış
ax = zaman_serisi.plot(label=zaman_serisi.name)
ax.set_title("Yazbel Forumunda Günlere Göre Açılan Konu Sayısı")
ax.set_xlabel("Gün")
ax.tick_params(axis="x", rotation=20)
ax.set_ylabel("Konu Sayısı")
ax.set_ylim(ymin=0, ymax=zaman_serisi.max() + 1)


# veriyi modellenebilir duruma getirme
def split_sequence(sequence, n_steps):
    """
    Sizdeki fonksiyon (neredeyse...).
    """
    X, y = [], []
    for i in range(len(sequence)):
        end_ix = i + n_steps
        if end_ix > len(sequence)-1:
            break
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return np.asarray(X), np.asarray(y)


# 4 gün geriye bakarak yarını tahmin etmek adına
n_steps = 4
X, y = split_sequence(zaman_serisi, n_steps=n_steps)
print(f"Seride {zaman_serisi.size} eleman vardı")
print(f"Oluşturulan `X` ve `y`'nin boyutları X: {X.shape}, y: {y.shape}")

# Eğitim ve test adına `X` ve `y`'yi ikiye ayırıyoruz
test_frac = 0.2
test_size = int(len(X) * test_frac)
train_X, train_y = X[:-test_size], y[:-test_size]
test_X, test_y   = X[-test_size:], y[-test_size:]
print(f"Eğitim verisinin uzunluğu {len(train_y)}, "
      f"test verisinin uzunluğu {len(test_y)}")

# Training'den önce veriyi scale ediyoruz
scaler_X = StandardScaler()
train_X = scaler_X.fit_transform(train_X)
test_X  = scaler_X.transform(test_X)

scaler_y = StandardScaler()
train_y = scaler_y.fit_transform(train_y[:, np.newaxis]).ravel()
test_y  = scaler_y.transform(test_y[:, np.newaxis]).ravel()

# LSTM `(batch_size, n_steps, n_features)` bekler boyutu,
# dolayısıyla `X`'i bir reshape'den geçiriyoruz; `n_features == 1`
n_features = 1
train_X = train_X.reshape(-1, n_steps, n_features)
test_X  = test_X.reshape(-1, n_steps, n_features)

# Modeli oluşturuyoruz; 1-layer LSTM + dense
n_hidden_units = 20
model = Sequential()
model.add(LSTM(n_hidden_units, input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer="sgd", loss="mse")

# Eğitim başlıyor
n_epochs = 30
batch_size = 16
history = model.fit(train_X, train_y, epochs=n_epochs, batch_size=batch_size)

# eğitim ve test verisindeki tahminler
train_preds = model.predict(train_X)
test_preds = model.predict(test_X)

# geri scale etmek gerekir
train_preds = scaler_y.inverse_transform(train_preds)
test_preds = scaler_y.inverse_transform(test_preds)

# pandas serisine çevirelim, indeksli olması çizimde işe yarar
train_preds = pd.Series(train_preds.ravel(),
                        index=zaman_serisi.index[n_steps:-test_size])
test_preds  = pd.Series(test_preds.ravel(),
                        index=zaman_serisi.index[-test_size:])

# Performans raporu
train_truth = zaman_serisi.iloc[:-test_size]
test_truth  = zaman_serisi.iloc[-test_size:]
# eğitim verisinin tahmininde ilk `n_steps` gün yok
in_sample_rmse  = mean_squared_error(train_truth[n_steps:], train_preds,
                                     squared=False)
out_sample_rmse = mean_squared_error(test_truth,  test_preds, squared=False)
print(f"Eğitim verisindeki RMSE: {in_sample_rmse:.3f} soru.")
print(f"Test   verisindeki RMSE: {out_sample_rmse:.3f} soru.")

# Sonuçları çizdirme
fig, ax = plt.subplots()
ax.plot(train_truth, label="Gerçek değerler")
ax.plot(train_preds, label="Tahminler")
ax.set(title="Eğitim verisi tahminleri ve gerçek değerleri "
             f"(RMSE = {in_sample_rmse:.2f} soru)",
       xlabel="Gün", ylabel="Soru sayısı")
ax.xaxis.set_major_locator(ticker.MultipleLocator(28))
ax.legend()

fig, ax = plt.subplots()
ax.plot(test_truth, label="Gerçek değerler")
ax.plot(test_preds, label="Tahminler")
ax.set(title="Test verisi tahminleri ve gerçek değerleri "
             f"(RMSE = {out_sample_rmse:.2f} soru)",
       xlabel="Gün", ylabel="Soru sayısı")
ax.xaxis.set_major_locator(ticker.MultipleLocator(14))
ax.legend()

plt.show()

2021’in başından itibarenki verileri kullanarak forumda yarın kaç konu açılacağını tahmin etmeye çalışıyor. Herhangi bir validasyon yok diyebiliriz, varsayılan/rastgele değerleri kullandım hiperparametrelerde; asıl amaç işleyiş olsun diye, ümit ediyorum yararlı olur.

Şu çıktıları alıyorum:

Verinin kendisi:

Tahminler

eğitim verisi

dikkat ederseniz ilk 4 (yani n_steps) günün tahmini yok; zira geride bakılabilecek 4 gün yok onlar için.

test verisi

Koddaki zaman_serisi = pd.read_csv(url, index_col=0, squeeze=True) satırı yerine kendi verinizi koyup bir deneyin isterseniz neler oluyor. zaman_serisi = ts_df.agir_hasta_sayisi.


Yarın (24 Şubat 2022) için yaklaşık 5 konu bekleniyor…

>>> (scaler_y.inverse_transform(
         model.predict(scaler_X.transform(
                           [zaman_serisi.tail(n_steps)])[..., None])).item())
5.172051429748535
2 Beğeni

Çok teşekkür ederim çok faydalı oldu. Şu an sizin kodlarını inceliyorum. Ben şu an sizin kodları kendi projeme dahil ederken şu kod bloğunda şöyle bir hata ile karşılaştım.

# Training'den önce veriyi scale ediyoruz
scaler_X = StandardScaler()
train_X = scaler_X.fit_transform(train_X)
test_X  = scaler_X.transform(test_X)
scaler_y = StandardScaler()
train_y = scaler_y.fit_transform(train_y[:, np.newaxis]).ravel()
test_y  = scaler_y.transform(test_y[:, np.newaxis]).ravel()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-1d91d12d09c5> in <module>
      1 # Training'den önce veriyi scale ediyoruz
      2 scaler_X = StandardScaler()
----> 3 train_X = scaler_X.fit_transform(train_X)
      4 test_X  = scaler_X.transform(test_X)
      5 scaler_y = StandardScaler()

~\anaconda3\lib\site-packages\sklearn\base.py in fit_transform(self, X, y, **fit_params)
    697         if y is None:
    698             # fit method of arity 1 (unsupervised transformation)
--> 699             return self.fit(X, **fit_params).transform(X)
    700         else:
    701             # fit method of arity 2 (supervised transformation)

~\anaconda3\lib\site-packages\sklearn\preprocessing\_data.py in fit(self, X, y, sample_weight)
    728         # Reset internal state before fitting
    729         self._reset()
--> 730         return self.partial_fit(X, y, sample_weight)
    731 
    732     def partial_fit(self, X, y=None, sample_weight=None):

~\anaconda3\lib\site-packages\sklearn\preprocessing\_data.py in partial_fit(self, X, y, sample_weight)
    764         """
    765         first_call = not hasattr(self, "n_samples_seen_")
--> 766         X = self._validate_data(X, accept_sparse=('csr', 'csc'),
    767                                 estimator=self, dtype=FLOAT_DTYPES,
    768                                 force_all_finite='allow-nan', reset=first_call)

~\anaconda3\lib\site-packages\sklearn\base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
    419             out = X
    420         elif isinstance(y, str) and y == 'no_validation':
--> 421             X = check_array(X, **check_params)
    422             out = X
    423         else:

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
     61             extra_args = len(args) - len(all_args)
     62             if extra_args <= 0:
---> 63                 return f(*args, **kwargs)
     64 
     65             # extra_args > 0

~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)
    635             # If input is 1D raise error
    636             if array.ndim == 1:
--> 637                 raise ValueError(
    638                     "Expected 2D array, got 1D array instead:\narray={}.\n"
    639                     "Reshape your data either using array.reshape(-1, 1) if "

ValueError: Expected 2D array, got 1D array instead:
array=[].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

Burada ben örnek bir veri seti hazırladım 3-4 satırlık acaba o yüzden mi hata aldım. Ya da nerede hata yaptım acaba.

image