Add Deep Learning (LSTM) + Quick Wins automation features

Major improvements:
- Deep Learning integration with PyTorch LSTM (Bidirectional, 128→64 units)
- Hybrid predictor: 40% RandomForest + 60% Deep Learning
- LaunchAgent for automatic weekly tip generation (Tue/Fri 21:00)
- Health-Check system with auto-recovery and Telegram alerts
- Model caching and intelligent retraining logic
- Updated CSV data and generated tips
- Performance reports for recent draws

Technical details:
- PyTorch used instead of TensorFlow (Python 3.14 compatibility)
- Apple Silicon MPS acceleration support
- Sequence learning with 20-draw history
- Early stopping and learning rate scheduling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
cbazzaandClaude Sonnet 4.5 committed 2026-01-07 09:20:49 +01:00
1 parent f6106b8333
commit 428403557e
33 files changed
+31776 -62

No files matched your search

@@ -40,15 +40,34 @@ try:
except ImportError:
ML_AVAILABLE = False
# Deep Learning (optional)
# Deep Learning (optional) - PyTorch or TensorFlow
DEEP_LEARNING_AVAILABLE = False
try:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam
import torch
DEEP_LEARNING_AVAILABLE = True
except ImportError:
DEEP_LEARNING_AVAILABLE = False
try:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam
DEEP_LEARNING_AVAILABLE = True
except ImportError:
DEEP_LEARNING_AVAILABLE = False
# Import Deep Learning Engine (PyTorch-based for Python 3.14+ compatibility)
try:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'utils'))
from deep_learning_engine_pytorch import DeepLearningEngine, HybridDeepLearningPredictor
DL_ENGINE_AVAILABLE = True
except ImportError:
try:
from deep_learning_engine import DeepLearningEngine, HybridDeepLearningPredictor
DL_ENGINE_AVAILABLE = True
except ImportError:
DL_ENGINE_AVAILABLE = False
DeepLearningEngine = None
HybridDeepLearningPredictor = None
class UltimateAIMLHybridGenerator:
@@ -159,11 +178,13 @@ class UltimateAIMLHybridGenerator:
"""Zeigt System-Status."""
print("\n📊 SYSTEM STATUS:")
print(f" 🧠 ML Available: {'✅' if ML_AVAILABLE else '❌ (pip install scikit-learn)'}")
print(f" 🚀 Deep Learning: {'✅' if DEEP_LEARNING_AVAILABLE else '⚠️ Optional (pip install tensorflow)'}")
print(f" 🚀 Deep Learning: {'✅ ACTIVE' if self.ai_ml_engine.use_deep_learning else '⚠️ Optional (pip install tensorflow)'}")
print(f" 🎯 Models Trained: {'✅' if self.is_trained else '⚠️ Using frequency-based fallback'}")
print(f" 📁 Data Size: {len(self.df):,} drawings")
print(f" 🎨 Patterns: {len(self.pattern_engine.pattern_frequencies)}")
print(f" ⚡ Fast Mode: {'ON' if self.fast_mode else 'OFF'}")
if self.ai_ml_engine.use_deep_learning:
print(f" 🔮 LSTM: Hybrid Mode (RF 40% + DL 60%)")
def generate_ultimate_tips(self, num_tips=10):
"""
@@ -586,19 +607,26 @@ class UltimateAIMLHybridGenerator:
# ============================================================================
class AIMLEngine:
"""AI/ML Engine - OPTIMIZED."""
"""AI/ML Engine - OPTIMIZED mit Deep Learning Support."""
def __init__(self, fast_mode=True):
self.models = {}
self.trained_models = {}
self.scaler = StandardScaler()
self.is_trained = False
self.fast_mode = fast_mode
# Deep Learning
self.dl_engine = None
self.hybrid_predictor = None
self.use_deep_learning = DL_ENGINE_AVAILABLE and DEEP_LEARNING_AVAILABLE
def initialize(self, df, features_df, cache_path):
"""Initialisiert AI/ML System mit intelligentem Retraining."""
self.cache_path = cache_path
self.data_file = None # Wird vom Generator gesetzt
self.df = df # Store for DL
self.features_df = features_df # Store for DL
if not ML_AVAILABLE:
print(" ⚠️ ML not available - using frequency-based fallback")
@@ -630,6 +658,36 @@ class AIMLEngine:
else:
print(" ⚠️ Insufficient data - using fallback")
# Initialize Deep Learning
if self.use_deep_learning:
print(" 🧠 Initializing Deep Learning (LSTM)...", end=" ", flush=True)
try:
self.dl_engine = DeepLearningEngine(
num_numbers=49,
sequence_length=20,
cache_dir=os.path.join(cache_path, 'deep_learning'),
fast_mode=self.fast_mode
)
# Train or load LSTM
self.dl_engine.train(df, features_df, force_retrain=needs_retrain)
# Create hybrid predictor
self.hybrid_predictor = HybridDeepLearningPredictor(
dl_engine=self.dl_engine,
rf_weight=0.4,
dl_weight=0.6
)
print("✅")
except Exception as e:
print(f"⚠️ DL init failed: {e}")
self.use_deep_learning = False
else:
if not DEEP_LEARNING_AVAILABLE:
print(" ℹ️ Deep Learning disabled (TensorFlow not installed)")
elif not DL_ENGINE_AVAILABLE:
print(" ℹ️ Deep Learning Engine not available")
def _needs_retraining(self, cache_file):
"""Prüft ob Retraining nötig ist."""
if not os.path.exists(cache_file):
@@ -735,46 +793,57 @@ class AIMLEngine:
return np.array(X), np.array(y)
def predict_all_numbers(self, features_df):
"""Vorhersage für alle Zahlen."""
"""Vorhersage für alle Zahlen - mit Deep Learning Hybrid."""
predictions = {}
# Get RandomForest predictions
if not self.is_trained or not self.trained_models:
# Fallback
for num in range(1, 50):
predictions[num] = 0.2 + random.random() * 0.3
return predictions
current_features = self._get_current_features(features_df)
for number in range(1, 50):
if number not in self.trained_models:
predictions[number] = 0.15 + (number % 10) * 0.03
continue
number_models = self.trained_models[number]
ensemble_pred = 0
total_weight = 0
for model_name, model_data in number_models.items():
try:
model = model_data['model']
scaler = model_data['scaler']
score = model_data['score']
features_scaled = scaler.transform([current_features])
pred = model.predict(features_scaled)[0]
weight = score
ensemble_pred += pred * weight
total_weight += weight
except:
pass
if total_weight > 0:
predictions[number] = np.clip(ensemble_pred / total_weight, 0, 1)
else:
predictions[number] = 0.2 + random.random() * 0.2
else:
current_features = self._get_current_features(features_df)
for number in range(1, 50):
if number not in self.trained_models:
predictions[number] = 0.15 + (number % 10) * 0.03
continue
number_models = self.trained_models[number]
ensemble_pred = 0
total_weight = 0
for model_name, model_data in number_models.items():
try:
model = model_data['model']
scaler = model_data['scaler']
score = model_data['score']
features_scaled = scaler.transform([current_features])
pred = model.predict(features_scaled)[0]
weight = score
ensemble_pred += pred * weight
total_weight += weight
except:
pass
if total_weight > 0:
predictions[number] = np.clip(ensemble_pred / total_weight, 0, 1)
else:
predictions[number] = 0.2 + random.random() * 0.2
# Use Deep Learning Hybrid if available
if self.use_deep_learning and self.hybrid_predictor:
try:
predictions = self.hybrid_predictor.predict(
predictions,
self.df,
self.features_df
)
except Exception as e:
print(f"⚠️ DL prediction failed: {e}, using RF only")
return predictions
def _get_current_features(self, features_df):