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:
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):
|
||||
|
||||
Reference in new issue
Block a user