4.3 KiB
Executable File
4.3 KiB
Executable File
Derin Teknik Düzeltmeler ve Analiz Günlüğü
Dosya: 02_deep_fixes_log.md
Amaç: Son geliştirme döngüsünde çözülen karmaşık sorunların teknik detaylarını belgelemek.
1. Live Match Synchronization & DB Safety
Sorun Tanımı
Canlı maçlar (Live Matches), ana matches tablosuna henüz işlenmemiş olabiliyor. Ancak sistem bunları analiz etmeye çalıştığında:
match_player_participationtablosuna oyuncu eklemeye çalışıyor ->matchestablosunda ID olmadığı için Foreign Key Constraint Error alıyordu.- Veri tabana yazılamadığı için Python scripti "Lineup not found" hatasıyla patlıyordu.
Uygulanan Çözüm
Dual-Persistence Strategy (Çift Yazma Stratejisi):
- Logic:
FeederPersistenceService.saveLineupsvesaveOddsmetodları artık öncematchestablosundamatchIdvar mı diye kontrol ediyor. - Varsa: Hem ilişkisel tablolara (
match_player_participation) hem delive_matchesJSON kolonuna yazıyor. - Yoksa (Sadece Canlı): İlişkisel tabloları tamamen pas geçiyor (SKIP), veriyi sadece
live_matches.lineupsvelive_matches.oddsJSON kolonlarına strüktüre edilmiş olarak yazıyor.
Fallback Mechanism (Python & NestJS):
- NestJS:
getPlayerCountmetodu önce ilişkisel tabloyu sayıyor. Sayı 0 iselive_matchesJSON'ını parse edip oradaki oyuncu sayısını dönüyor. - Python:
_run_modeliçinde önce SQL sorgusu ile kadro çekmeye çalışıyor. Liste boşsa,live_matchestablosundaki JSON kolonunu çekip manuel parse ediyor.
2. Model Score & Context Mapping (Kritik)
Sorun Tanımı
Kullanıcı, modelin skor tahminlerinin ve maç sonucu (1/X/2) tercihlerinin tutarsız olduğundan şikayetçiydi ("Home win diyor ama skor 0-1" gibi).
Tespit Edilen Kök Nedenler
- HT/FT Sıralaması: Model eğitimi
ht*3 + ft(0=X, 1=1, 2=2) mantığıyla yapılmıştı. Ancak tahmin scripti etiketleri1/1, 1/X...gibi rastgele bir sırayla diziyordu. Bu yüzden1/1tahminiX/Xgibi görünüyordu. - Beraberlik (Draw) Körlüğü: Data Feeder, beraberlik oranını
Xetiketiyle kaydediyordu (Mackolik verisi). Python scripti ise sadece0etiketini "Beraberlik" olarak kabul ediyordu. Sonuç olarak model "Beraberlik Oranı: 0.0" görüyordu (yani oran yok). Bu, modelin maçın dengesini yanlış anlamasına neden oluyordu. - Away Bias (Deplasman Yanlılığı): Backtest verileri, modelin sistematik olarak deplasman takımına fazla gol yazdığını (%15-20 fazla) gösterdi.
Uygulanan Çözüm
- Etiket Düzeltmesi:
htft_labelslistesi[X/X, X/1, X/2, 1/X, 1/1, 1/2, 2/X, 2/1, 2/2]olarak, eğitim verisiyle %100 uyumlu hale getirildi. - Oran Normalizasyonu: Python scripti artık hem
0hemXetiketlerini beraberlik oranı olarak kabul ediyor. - Skor Kalibrasyonu: Backtest sonrası optimizasyon katsayıları eklendi.
HOME_GOAL_SCALE = 1.00AWAY_GOAL_SCALE = 0.85
3. Akıllı Kupon Servisi (Smart Coupon)
Yapı
NestJS tarafında SmartCouponService ve Python tarafında smart_coupon_service.py (CLI) işbirliği ile çalışır.
Akış
- Request: POST
/api/coupon/analyze-match{ matchId } - Pre-Check 1 (Kadro): DB'de kadro var mı?
- Yoksa ->
FeederService.refreshMatch(lineups)-> Tekrar kontrol -> Hâlâ yoksa Hata Fırlat ("Yetersiz Veri").
- Yoksa ->
- Pre-Check 2 (Oran): DB'de oran var mı?
- Yoksa ->
FeederService.refreshMatch(odds)-> Log bas (Engelleyici değil).
- Yoksa ->
- Prediction: Python scripti çalıştırılır (
--analyze --json).- Script: DB veya JSON Fallback'ten veriyi okur.
- Script: Modeli çalıştırır, kalibrasyon katsayılarını uygular.
- Script: JSON döner.
- Response: NestJS JSON'ı parse edip kullanıcıya döner.
Gelecek İçin Notlar
- Database:
live_matchestablosundaki JSON kolonları artık kritik öneme sahip. Bunların şemasıPrismatarafındaJsonolarak tanımlı ama iç yapısı kod içinde (FeederPersistence) belirleniyor. Yapıyı değiştirirken dikkatli olunmalı. - Model: V17 modeli şu an stabil. V18'e geçilirse
player_model_v17.pydeğiştirilmeli vesmart_coupon_service.pyiçindeki scale faktörleri sıfırlanıp tekrar backtest yapılmalı.