We will proceed with predicting 6 numbers using the seq2pred technique, with an LSTM model, by applying STL decomposition to the time series.
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import joblib
import numpy as np
import pandas as pd
import tensorflow as tf
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.preprocessing import MinMaxScaler
from statsmodels.tsa.seasonal import STL
from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import LSTM, Dropout, Dense, Input
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
from tensorflow.keras import regularizers
from tensorflow.keras import backend as K
from tensorflow.keras.constraints import UnitNorm, MaxNorm
from tensorflow.keras.initializers import RandomUniform, GlorotUniform
from colorama import Fore, Style
# Set seed for reproducibility
seed_value = 1
tf.random.set_seed(seed_value)
np.random.seed(seed_value)
# Data
dataset_1 = np.array([0.05, 0.01, 0.11, 0.15, 0.01, 0.01, 0.02, 0.06, 0.07, 0.04, 0.03, 0.05, 0.04, 0.03, 0.04, 0.04, 0.12, 0.06, 0.04, 0.19, 0.27, 0.13, 0.01, 0.02, 0.05, 0.02, 0.06, 0.06, 0.06, 0.03, 0.08, 0.23, 0.13, 0.13, 0.08, 0.03, 0.01, 0.1, 0.01, 0.03, 0.03, 0.02, 0.08, 0.09, 0.03, 0.11, 0.05, 0.13, 0.07])
dataset_2 = np.diff(dataset_1)
dataset_3 = np.array([0.07, 0.13, 0.13, 0.23, 0.03, 0.16, 0.05, 0.09, 0.12, 0.07, 0.04, 0.11, 0.07, 0.19, 0.15, 0.07, 0.17, 0.1, 0.17, 0.26, 0.3, 0.14, 0.03, 0.08, 0.15, 0.07, 0.08, 0.11, 0.14, 0.13, 0.25, 0.26, 0.23, 0.14, 0.41, 0.05, 0.06, 0.11, 0.2, 0.05, 0.05, 0.07, 0.2, 0.11, 0.13, 0.24, 0.13, 0.22, 0.09])
dataset_4 = np.diff(dataset_3)
dataset_5 = np.array([0.11, 0.14, 0.21, 0.31, 0.23, 0.21, 0.4, 0.14, 0.34, 0.17, 0.1, 0.24, 0.11, 0.23, 0.16, 0.1, 0.2, 0.15, 0.27, 0.31, 0.31, 0.23, 0.26, 0.18, 0.25, 0.2, 0.12, 0.15, 0.18, 0.19, 0.31, 0.36, 0.36, 0.17, 0.42, 0.17, 0.08, 0.17, 0.24, 0.11, 0.22, 0.26, 0.23, 0.16, 0.36, 0.26, 0.14, 0.4, 0.13])
dataset_6 = np.diff(dataset_5)
dataset_7 = np.array([0.16, 0.21, 0.34, 0.39, 0.31, 0.27, 0.41, 0.18, 0.37, 0.19, 0.41, 0.35, 0.18, 0.39, 0.42, 0.32, 0.22, 0.38, 0.34, 0.32, 0.34, 0.28, 0.37, 0.24, 0.37, 0.3, 0.15, 0.31, 0.2, 0.22, 0.38, 0.41, 0.41, 0.24, 0.43, 0.26, 0.16, 0.19, 0.32, 0.25, 0.3, 0.39, 0.24, 0.25, 0.37, 0.32, 0.16, 0.41, 0.31])
dataset_8 = np.diff(dataset_7)
dataset_9 = np.array([0.23, 0.23, 0.46, 0.41, 0.37, 0.32, 0.43, 0.3, 0.4, 0.2, 0.45, 0.42, 0.28, 0.43, 0.45, 0.33, 0.42, 0.42, 0.36, 0.45, 0.35, 0.35, 0.46, 0.29, 0.39, 0.31, 0.21, 0.35, 0.23, 0.32, 0.39, 0.43, 0.46, 0.37, 0.44, 0.32, 0.21, 0.23, 0.42, 0.39, 0.39, 0.45, 0.3, 0.31, 0.38, 0.45, 0.26, 0.47, 0.32])
dataset_10 = np.diff(dataset_9)
dataset_11 = np.array([0.29, 0.31, 0.49, 0.42, 0.42, 0.41, 0.45, 0.44, 0.43, 0.37, 0.47, 0.49, 0.42, 0.49, 0.48, 0.4, 0.45, 0.48, 0.48, 0.48, 0.47, 0.36, 0.47, 0.4, 0.41, 0.34, 0.46, 0.49, 0.3, 0.38, 0.41, 0.47, 0.48, 0.46, 0.47, 0.44, 0.23, 0.33, 0.47, 0.45, 0.48, 0.49, 0.44, 0.45, 0.48, 0.49, 0.33, 0.48, 0.44])
dataset_12 = np.diff(dataset_11)
datasets = [dataset_1, dataset_2, dataset_3, dataset_4, dataset_5, dataset_6, dataset_7, dataset_8, dataset_9, dataset_10, dataset_11, dataset_12]
names = ["dataset_1", "dataset_2", "dataset_3", "dataset_4", "dataset_5", "dataset_6", "dataset_7", "dataset_8", "dataset_9", "dataset_10", "dataset_11", "dataset_12"]
def create_dataset(data, look_back=1):
X, y = [], []
for i in range(len(data) - look_back):
if data.ndim == 1:
a = data[i:(i + look_back)]
y.append(data[i + look_back])
else:
a = data[i:(i + look_back), :]
y.append(data[i + look_back, :])
X.append(a)
return np.array(X), np.array(y)
start_date = '2024-01-01'
datasets_with_date = []
for data in datasets:
dates = pd.date_range(start=start_date, periods=len(data), freq='D')
datasets_with_date.append(pd.Series(data, index=dates))
models = []
scalers = []
for i, data_series in enumerate(datasets_with_date):
# Reset seed for reproducibility
tf.random.set_seed(seed_value)
np.random.seed(seed_value)
# Use correct seasonal period (2)
result = STL(data_series, period=2, robust=True).fit()
data_combined = np.column_stack((result.seasonal, result.trend, result.resid))
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data_combined)
X, y = create_dataset(scaled_data, look_back=1)
split_point = int(len(X) * 0.8)
X_train, X_test = X[:split_point], X[split_point:]
y_train, y_test = y[:split_point], y[split_point:]
look_back = 1
features = 3
# Define LSTM model
input_layer = Input(shape=(look_back, features))
lstm1, state_h1, state_c1 = LSTM(64, return_sequences=True, return_state=True, activation='tanh',
recurrent_activation='sigmoid', use_bias=True, unit_forget_bias=True,
go_backwards=False, stateful=False, unroll=True, implementation=2,
bias_constraint=UnitNorm(axis=0), kernel_constraint=UnitNorm(axis=0),
recurrent_constraint=UnitNorm(axis=0),
bias_initializer=RandomUniform(minval=-0.49, maxval=0.49),
kernel_initializer=RandomUniform(minval=-0.49, maxval=0.49),
recurrent_initializer=RandomUniform(minval=-0.49, maxval=0.49),
bias_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
kernel_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
activity_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_dropout=0.1)(input_layer)
dropout1 = Dropout(0.2)(lstm1)
lstm2, state_h2, state_c2 = LSTM(64, return_sequences=True, return_state=True, activation='tanh',
recurrent_activation='sigmoid', use_bias=True, unit_forget_bias=True,
go_backwards=False, stateful=False, unroll=True, implementation=2,
bias_constraint=UnitNorm(axis=0), kernel_constraint=UnitNorm(axis=0),
recurrent_constraint=UnitNorm(axis=0),
bias_initializer=RandomUniform(minval=-0.49, maxval=0.49),
kernel_initializer=RandomUniform(minval=-0.49, maxval=0.49),
recurrent_initializer=RandomUniform(minval=-0.49, maxval=0.49),
bias_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
kernel_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
activity_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_dropout=0.1)(dropout1, initial_state=[state_h1, state_c1])
dropout2 = Dropout(0.2)(lstm2)
lstm3, state_h3, state_c3 = LSTM(64, return_sequences=False, return_state=True, activation='tanh',
recurrent_activation='sigmoid', use_bias=True, unit_forget_bias=True,
go_backwards=False, stateful=False, unroll=True, implementation=2,
bias_constraint=UnitNorm(axis=0), kernel_constraint=UnitNorm(axis=0),
recurrent_constraint=UnitNorm(axis=0),
bias_initializer=RandomUniform(minval=-0.49, maxval=0.49),
kernel_initializer=RandomUniform(minval=-0.49, maxval=0.49),
recurrent_initializer=RandomUniform(minval=-0.49, maxval=0.49),
bias_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
kernel_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
activity_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
recurrent_dropout=0.1)(dropout2, initial_state=[state_h2, state_c2])
dropout3 = Dropout(0.2)(lstm3)
output_layer = Dense(3, activation='tanh', use_bias=True, bias_initializer=RandomUniform(minval=-0.49, maxval=0.49),
kernel_initializer=RandomUniform(minval=-0.49, maxval=0.49),
bias_constraint=UnitNorm(axis=0), kernel_constraint=UnitNorm(axis=0),
bias_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
activity_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001),
kernel_regularizer=regularizers.l1_l2(l1=0.00000001, l2=0.00000001))(dropout3)
model = Model(inputs=input_layer, outputs=output_layer)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mean_squared_error',
metrics=[tf.keras.metrics.MeanSquaredError(), tf.keras.metrics.MeanAbsoluteError()])
early_stopping = EarlyStopping(monitor='val_loss', patience=80, verbose=2, mode='min', restore_best_weights=True)
reduce_lr = ReduceLROnPlateau(monitor= 'val_loss', patience=40, verbose=2, mode='min', factor=0.01, min_lr=0.0000001)
history = model.fit(X_train, y_train, epochs=150, batch_size=5, verbose=2, validation_data=(X_test, y_test),
callbacks=[early_stopping, reduce_lr])
model.save(f'model_{names[i]}.keras')
joblib.dump(scaler, f'scaler_{names[i]}.pkl')
models.append(model)
scalers.append(scaler)
tf.keras.backend.clear_session()
all_final_prediction = []
for i, model in enumerate(models):
scaler = scalers[i]
result = STL(datasets_with_date[i], period=2, robust=True).fit()
data_combined = np.column_stack((result.seasonal, result.trend, result.resid))
last_data = data_combined[-1].reshape(1, -1)
scaled_last_data = scaler.transform(last_data)
scaled_last_data = scaled_last_data.reshape(1, 1, 3)
prediction = model.predict(scaled_last_data)
prediction_rescaled = scaler.inverse_transform(prediction)
final_prediction = sum(prediction_rescaled[0])
print(f"Προβλεπόμενη επόμενη τιμή για το {names[i]}: {final_prediction:.2f}")
all_final_prediction.append(final_prediction)
print(f"{Fore.BLUE}\nΙστορικό εκπαίδευσης:{Style.RESET_ALL}")
for key in history.history.keys():
print(f"{Fore.RED}{key}:{Style.RESET_ALL} {history.history[key][-1]:.3f}")
print()
predicted_1 = all_final_prediction[-12]
predicted_1 = np.array([predicted_1])
predicted_1 = np.clip(predicted_1, 0.01, 0.49)
predicted_2 = all_final_prediction[-11]
difference2 = dataset_1[-1] + predicted_2
difference2 = np.array([difference2])
difference2 = np.clip(difference2, 0.01, 0.49)
predicted_3 = all_final_prediction[-10]
predicted_3 = np.array([predicted_3])
predicted_3 = np.clip(predicted_3, 0.01, 0.49)
predicted_4 = all_final_prediction[-9]
difference4 = dataset_3[-1] + predicted_4
difference4 = np.array([difference4])
difference4 = np.clip(difference4, 0.01, 0.49)
predicted_5 = all_final_prediction[-8]
predicted_5 = np.array([predicted_5])
predicted_5 = np.clip(predicted_5, 0.01, 0.49)
predicted_6 = all_final_prediction[-7]
difference6 = dataset_5[-1] + predicted_6
difference6 = np.array([difference6])
difference6 = np.clip(difference6, 0.01, 0.49)
predicted_7 = all_final_prediction[-6]
predicted_7 = np.array([predicted_7])
predicted_7 = np.clip(predicted_7, 0.01, 0.49)
predicted_8 = all_final_prediction[-5]
difference8 = dataset_7[-1] + predicted_8
difference8 = np.array([difference8])
difference8 = np.clip(difference8, 0.01, 0.49)
predicted_9 = all_final_prediction[-4]
predicted_9 = np.array([predicted_9])
predicted_9 = np.clip(predicted_9, 0.01, 0.49)
predicted_10 = all_final_prediction[-3]
difference10 = dataset_9[-1] + predicted_10
difference10 = np.array([difference10])
difference10 = np.clip(difference10, 0.01, 0.49)
predicted_11 = all_final_prediction[-2]
predicted_11 = np.array([predicted_11])
predicted_11 = np.clip(predicted_11, 0.01, 0.49)
predicted_12 = all_final_prediction[-1]
difference12 = dataset_11[-1] + predicted_12
difference12 = np.array([difference12])
difference12 = np.clip(difference12, 0.01, 0.49)
std_dev_1 = np.random.uniform(0.01, 0.1)
random_noise_1 = np.random.normal(0.05, std_dev_1, size=predicted_1.shape)
noise_sign1 = np.random.choice([-1, 1], size=predicted_1.shape)
predicted_1_with_noise_1 = predicted_1 + (random_noise_1 * noise_sign1)
predicted_1_with_noise_1 = np.clip(predicted_1_with_noise_1, 0.01, 0.49)
std_dev_2 = np.random.uniform(0.01, 0.1)
random_noise_2 = np.random.normal(0.05, std_dev_2, size=predicted_3.shape)
noise_sign2 = np.random.choice([-1, 1], size=predicted_3.shape)
predicted_3_with_noise_1 = predicted_3 + (random_noise_2 * noise_sign2)
predicted_3_with_noise_1 = np.clip(predicted_3_with_noise_1, 0.01, 0.49)
std_dev_3 = np.random.uniform(0.01, 0.1)
random_noise_3 = np.random.normal(0.05, std_dev_2, size=predicted_5.shape)
noise_sign3 = np.random.choice([-1, 1], size=predicted_5.shape)
predicted_5_with_noise_1 = predicted_5 + (random_noise_3 * noise_sign3)
predicted_5_with_noise_1 = np.clip(predicted_5_with_noise_1, 0.01, 0.49)
std_dev_4 = np.random.uniform(0.01, 0.1)
random_noise_4 = np.random.normal(0.05, std_dev_2, size=predicted_7.shape)
noise_sign4 = np.random.choice([-1, 1], size=predicted_7.shape)
predicted_7_with_noise_1 = predicted_7 + (random_noise_4 * noise_sign4)
predicted_7_with_noise_1 = np.clip(predicted_7_with_noise_1, 0.01, 0.49)
std_dev_5 = np.random.uniform(0.01, 0.1)
random_noise_5 = np.random.normal(0.05, std_dev_2, size=predicted_9.shape)
noise_sign5 = np.random.choice([-1, 1], size=predicted_9.shape)
predicted_9_with_noise_1 = predicted_9 + (random_noise_5 * noise_sign5)
predicted_9_with_noise_1 = np.clip(predicted_9_with_noise_1, 0.01, 0.49)
std_dev_6 = np.random.uniform(0.01, 0.1)
random_noise_6 = np.random.normal(0.05, std_dev_2, size=predicted_11.shape)
noise_sign6 = np.random.choice([-1, 1], size=predicted_11.shape)
predicted_11_with_noise_1 = predicted_11 + (random_noise_6 * noise_sign6)
predicted_11_with_noise_1 = np.clip(predicted_11_with_noise_1, 0.01, 0.49)
predicted_values = [
round(predicted_1[0] * 100),
round(difference2[0] * 100),
round(predicted_3[0] * 100),
round(difference4[0] * 100),
round(predicted_5[0] * 100),
round(difference6[0] * 100),
round(predicted_7[0] * 100),
round(difference8[0] * 100),
round(predicted_9[0] * 100),
round(difference10[0] * 100),
round(predicted_11[0] * 100),
round(difference12[0] * 100),
round(predicted_1_with_noise_1[0] * 100),
round(predicted_3_with_noise_1[0] * 100),
round(predicted_5_with_noise_1[0] * 100),
round(predicted_7_with_noise_1[0] * 100),
round(predicted_9_with_noise_1[0] * 100),
round(predicted_11_with_noise_1[0] * 100)
]
unique_sorted_values = sorted(set(predicted_values))
for index, predicted in enumerate(all_final_prediction):
print(f"{Fore.CYAN}Προβλέψεις για το dataset {index + 1}: {Style.RESET_ALL}{predicted:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 1: {Style.RESET_ALL}{predicted_1[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 1: {Style.RESET_ALL}{difference2[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 1: {Style.RESET_ALL}{predicted_1_with_noise_1[0]:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 3: {Style.RESET_ALL}{predicted_3[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 3: {Style.RESET_ALL}{difference4[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 3: {Style.RESET_ALL}{predicted_3_with_noise_1[0]:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 5: {Style.RESET_ALL}{predicted_5[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 5: {Style.RESET_ALL}{difference6[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 5: {Style.RESET_ALL}{predicted_5_with_noise_1[0]:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 7: {Style.RESET_ALL}{predicted_7[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 7: {Style.RESET_ALL}{difference8[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 7: {Style.RESET_ALL}{predicted_7_with_noise_1[0]:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 9: {Style.RESET_ALL}{predicted_9[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 9: {Style.RESET_ALL}{difference10[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 9: {Style.RESET_ALL}{predicted_9_with_noise_1[0]:.2f}")
print(f"\n{Fore.MAGENTA}Προβλέψεις καθαρές για το dataset 11: {Style.RESET_ALL}{predicted_11[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με διαφορά για το dataset 11: {Style.RESET_ALL}{difference12[0]:.2f}")
print(f"{Fore.MAGENTA}Προβλέψεις με τυχαιότητα για dataset 11: {Style.RESET_ALL}{predicted_11_with_noise_1[0]:.2f}")
print(f"\n{Fore.BLUE}ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ:{Style.RESET_ALL}{Fore.YELLOW}{unique_sorted_values}{Style.RESET_ALL}")
print(f"\n{Fore.GREEN}ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΚΑΘΑΡΕΣ:{Style.RESET_ALL} {[round(predicted_1[0] * 100), round(predicted_3[0] * 100), round(predicted_5[0] * 100), round(predicted_7[0] * 100), round(predicted_9[0] * 100), round(predicted_11[0] * 100), ]}")
print(f"\n{Fore.GREEN}ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΜΕ ΔΙΑΦΟΡΑ:{Style.RESET_ALL} {[ round(difference2[0] * 100), round(difference4[0] * 100), round(predicted_5[0] * 100), round(difference6[0] * 100), round(difference8[0] * 100), round(difference10[0] * 100), round(difference12[0] * 100) ]}")
print(f"\n{Fore.GREEN}ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΜΕ ΤΥΧΑΙΟΤΗΤΑ:{Style.RESET_ALL} {[ round(predicted_1_with_noise_1[0] * 100), round(predicted_3_with_noise_1[0] * 100), round(predicted_5_with_noise_1[0] * 100), round(predicted_7_with_noise_1[0] * 100), round(predicted_9_with_noise_1[0] * 100), round(predicted_11_with_noise_1[0] * 100), ]}")
last_values = ", ".join(map(str, [round(dataset_1[-1] * 100), round(dataset_3[-1] * 100), round(dataset_5[-1] * 100), round(dataset_7[-1] * 100), round(dataset_9[-1] * 100),round(dataset_11[-1] * 100)]))
print(f"\n{Fore.RED} Η ΤΕΛΕΥΤΑΙΑ ΚΛΗΡΩΣΗ :{Style.RESET_ALL} {last_values}")
Αποτελέσματα:
Το πρόγραμμα που αναφέρετε χρησιμοποιεί μια σύνθετη προσέγγιση για την πρόβλεψη αριθμών στο ΛΟΤΤΟ με την τεχνική seq2pred, χρησιμοποιώντας LSTM (Long Short-Term Memory) νευρωνικά δίκτυα. Εδώ είναι μια ανάλυση της διαδικασίας:
Κύρια Χαρακτηριστικά της Προσέγγισης
Αποσύνθεση STL: Πριν την εκπαίδευση του μοντέλου, τα δεδομένα υποβάλλονται σε αποσύνθεση STL (Seasonal and Trend decomposition using Loess) για να αναγνωριστούν και να απομονωθούν η σεζονικότητα, η τάση και η τυχαιότητα (υπόλοιπα).
Δημιουργία Χρονοσειρών: Μετά την αποσύνθεση, τα δεδομένα μετατρέπονται σε χρονοσειρές με την προσθήκη ημερομηνιών, δημιουργώντας έτσι μια σειρά που αποτυπώνει την πορεία των αριθμών με το πέρασμα του χρόνου.
Εκπαίδευση Μοντέλου LSTM: Το μοντέλο LSTM ρυθμίζεται με πολλαπλά επίπεδα και παραμέτρους για την εκπαίδευση, επιτρέποντας την εξαγωγή χαρακτηριστικών από την επεξεργασμένη χρονοσειρά και την πρόβλεψη των επόμενων αριθμών.
Κανονικοποίηση και Ανασύνθεση: Οι προβλέψεις ανασυνθέτονται σε μορφή πραγματικών αριθμών μετά την κανονικοποίηση, διατηρώντας τη συνάφεια με τις αρχικές μορφές των δεδομένων.
Διαχείριση Υπερεκπαίδευσης: Χρησιμοποιούνται τεχνικές όπως Early Stopping και ReduceLROnPlateau για να ελέγχεται η υπερεκπαίδευση και να βελτιστοποιηθεί η απόδοση του μοντέλου.
Αποτελέσματα και Ανάλυση
Προβλέψεις: Το μοντέλο παράγει προβλέψεις για τους επόμενους αριθμούς της λαχειοφόρου αγοράς, προσπαθώντας να προβλέψει τόσο τους καθαρούς αριθμούς όσο και τις διαφορές από την προηγούμενη κλήρωση.
Τυχαιότητα: Πειραματισμός με την προσθήκη τυχαίου θορύβου για να εξεταστεί πώς τα μοντέλα ανταποκρίνονται σε διαφοροποιήσεις και να μιμηθούν την τυχαιότητα των πραγματικών κληρώσεων.
Συμπεράσματα
Αυτή η προσέγγιση αποτελεί μια καινοτόμο τεχνική για την ανάλυση και πρόβλεψη σε παιχνίδια τύχης, όπου η σεζονικότητα και η τάση των δεδομένων μπορούν να παράσχουν σημαντικές πληροφορίες για την πρόβλεψη μελλοντικών αποτελεσμάτων, ενώ η ενσωμάτωση τυχαίων στοιχείων προσομοιάζει την τυχαιότητα που υπάρχει στις πραγματικές κληρώσεις.
Ιστορικό εκπαίδευσης:
loss: 0.017
mean_absolute_error: 0.080
mean_squared_error: 0.017
val_loss: 0.020
val_mean_absolute_error: 0.102
val_mean_squared_error: 0.020
learning_rate: 0.001
Προβλέψεις για το dataset 1: 0.11
Προβλέψεις για το dataset 2: -0.02
Προβλέψεις για το dataset 3: 0.23
Προβλέψεις για το dataset 4: 0.09
Προβλέψεις για το dataset 5: 0.22
Προβλέψεις για το dataset 6: -0.20
Προβλέψεις για το dataset 7: 0.30
Προβλέψεις για το dataset 8: 0.21
Προβλέψεις για το dataset 9: 0.38
Προβλέψεις για το dataset 10: -0.04
Προβλέψεις για το dataset 11: 0.44
Προβλέψεις για το dataset 12: 0.07
Προβλέψεις καθαρές για το dataset 1: 0.11
Προβλέψεις με διαφορά για το dataset 1: 0.05
Προβλέψεις με τυχαιότητα για dataset 1: 0.10
Προβλέψεις καθαρές για το dataset 3: 0.23
Προβλέψεις με διαφορά για το dataset 3: 0.18
Προβλέψεις με τυχαιότητα για dataset 3: 0.26
Προβλέψεις καθαρές για το dataset 5: 0.22
Προβλέψεις με διαφορά για το dataset 5: 0.01
Προβλέψεις με τυχαιότητα για dataset 5: 0.13
Προβλέψεις καθαρές για το dataset 7: 0.30
Προβλέψεις με διαφορά για το dataset 7: 0.49
Προβλέψεις με τυχαιότητα για dataset 7: 0.36
Προβλέψεις καθαρές για το dataset 9: 0.38
Προβλέψεις με διαφορά για το dataset 9: 0.28
Προβλέψεις με τυχαιότητα για dataset 9: 0.39
Προβλέψεις καθαρές για το dataset 11: 0.44
Προβλέψεις με διαφορά για το dataset 11: 0.49
Προβλέψεις με τυχαιότητα για dataset 11: 0.31
ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ:[1, 5, 10, 11, 13, 18, 22, 23, 26, 28, 30, 31, 36, 38, 39,44, 49]ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΚΑΘΑΡΕΣ: [11, 23, 22, 30, 38, 44]
ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΜΕ ΔΙΑΦΟΡΑ: [5, 18, 22, 1, 49, 28, 49]
ΟΛΕΣ ΟΙ ΠΡΟΒΛΕΨΕΙΣ ΜΕ ΤΥΧΑΙΟΤΗΤΑ: [10, 26, 13, 36, 39, 31]
Η ΤΕΛΕΥΤΑΙΑ ΚΛΗΡΩΣΗ : 7, 9, 13, 31, 32, 44