01 Απριλίου, 1970

Πρόβλεψη 6 αριθμών (seq2pred) για το ΛΟΤΤΟ. (Prediction of 6 numbers (seq2pred) for LOTTO.)

 

Θα προχωρήσουμε σε πρόβλεψη 6 αριθμών με την τεχνική seq2pred, με μοντέλο LSTM, κάνοντας αποσύνθεση STL στις χρονοσειρές.
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) νευρωνικά δίκτυα. Εδώ είναι μια ανάλυση της διαδικασίας:

Κύρια Χαρακτηριστικά της Προσέγγισης

  1. Αποσύνθεση STL: Πριν την εκπαίδευση του μοντέλου, τα δεδομένα υποβάλλονται σε αποσύνθεση STL (Seasonal and Trend decomposition using Loess) για να αναγνωριστούν και να απομονωθούν η σεζονικότητα, η τάση και η τυχαιότητα (υπόλοιπα).

  2. Δημιουργία Χρονοσειρών: Μετά την αποσύνθεση, τα δεδομένα μετατρέπονται σε χρονοσειρές με την προσθήκη ημερομηνιών, δημιουργώντας έτσι μια σειρά που αποτυπώνει την πορεία των αριθμών με το πέρασμα του χρόνου.

  3. Εκπαίδευση Μοντέλου LSTM: Το μοντέλο LSTM ρυθμίζεται με πολλαπλά επίπεδα και παραμέτρους για την εκπαίδευση, επιτρέποντας την εξαγωγή χαρακτηριστικών από την επεξεργασμένη χρονοσειρά και την πρόβλεψη των επόμενων αριθμών.

  4. Κανονικοποίηση και Ανασύνθεση: Οι προβλέψεις ανασυνθέτονται σε μορφή πραγματικών αριθμών μετά την κανονικοποίηση, διατηρώντας τη συνάφεια με τις αρχικές μορφές των δεδομένων.

  5. Διαχείριση Υπερεκπαίδευσης: Χρησιμοποιούνται τεχνικές όπως 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