This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
# V25 Model Güncelleme Özeti
|
||||
|
||||
**Tarih:** 12 Mart 2026
|
||||
**Konu:** Target Leakage düzeltmesi ve model yeniden eğitimi
|
||||
|
||||
---
|
||||
|
||||
## 1. Sorun Tespiti
|
||||
|
||||
### Target Leakage (Hedef Sızıntısı)
|
||||
|
||||
Eski V25 modeli `total_goals` ve `ht_total_goals` feature'larını içeriyordu. Bu feature'lar:
|
||||
- Maç başlamadan bilinemez
|
||||
- Sadece maç bittikten sonra elde edilir
|
||||
- Model "hile yapmış" oluyor - sonuca bakarak tahmin yapıyor
|
||||
|
||||
**Örnek:**
|
||||
```
|
||||
Feature: total_goals = 3 (maçta atılan toplam gol)
|
||||
Target: over_2.5 = Yes (2.5 üstü)
|
||||
|
||||
Eğer total_goals'ü biliyorsan, zaten sonucu biliyorsun!
|
||||
total_goals > 2.5 ise over_2.5 = Yes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Yapılan Değişiklikler
|
||||
|
||||
### 2.1 CatBoost Opsiyonel Hale Getirildi
|
||||
|
||||
**Dosya:** `ai-engine/models/v25_ensemble.py`
|
||||
|
||||
```python
|
||||
# CatBoost is optional
|
||||
try:
|
||||
from catboost import CatBoostClassifier
|
||||
CATBOOST_AVAILABLE = True
|
||||
except ImportError:
|
||||
CatBoostClassifier = None
|
||||
CATBOOST_AVAILABLE = False
|
||||
```
|
||||
|
||||
**Neden?**
|
||||
- CatBoost modülü yüklü değildi
|
||||
- Import hatası veriyordu
|
||||
- Model CatBoost olmadan da çalışabilmeli
|
||||
|
||||
### 2.2 Yeni Training Script Oluşturuldu
|
||||
|
||||
**Dosya:** `ai-engine/scripts/train_v25_clean.py`
|
||||
|
||||
**Özellikler:**
|
||||
- 73 feature (target leakage YOK)
|
||||
- Market-specific modeller
|
||||
- XGBoost + LightGBM ensemble
|
||||
- Early stopping ile overfitting önleme
|
||||
|
||||
**Feature Listesi:**
|
||||
```
|
||||
ELO Features (8)
|
||||
Form Features (12)
|
||||
H2H Features (6)
|
||||
Team Stats Features (8)
|
||||
Odds Features (24)
|
||||
League Features (4)
|
||||
Upset Engine (4)
|
||||
Referee Engine (5)
|
||||
Momentum Engine (3)
|
||||
```
|
||||
|
||||
**Kaldırılan Feature'lar:**
|
||||
- `total_goals` ❌ (Target Leakage)
|
||||
- `ht_total_goals` ❌ (Target Leakage)
|
||||
|
||||
### 2.3 V25Predictor Sınıfı Yeniden Yazıldı
|
||||
|
||||
**Dosya:** `ai-engine/models/v25_ensemble.py`
|
||||
|
||||
**Yeni API:**
|
||||
```python
|
||||
# MS tahmini
|
||||
home_prob, draw_prob, away_prob = predictor.predict_ms(features)
|
||||
|
||||
# OU25 tahmini
|
||||
over_prob, under_prob = predictor.predict_ou25(features)
|
||||
|
||||
# BTTS tahmini
|
||||
btts_yes, btts_no = predictor.predict_btts(features)
|
||||
|
||||
# Tam maç tahmini
|
||||
prediction = predictor.predict_match(
|
||||
match_id='123',
|
||||
home_team='Team A',
|
||||
away_team='Team B',
|
||||
features=features,
|
||||
odds={'ms_h': 1.85, 'ms_d': 3.50, 'ms_a': 4.20}
|
||||
)
|
||||
```
|
||||
|
||||
### 2.4 Test Script Güncellendi
|
||||
|
||||
**Dosya:** `ai-engine/scripts/test_v25_predictor.py`
|
||||
|
||||
---
|
||||
|
||||
## 3. Eğitim Sonuçları
|
||||
|
||||
### Model Performansı
|
||||
|
||||
| Market | Accuracy | Log Loss | Açıklama |
|
||||
|--------|----------|----------|----------|
|
||||
| MS (1X2) | 52.2% | 0.9747 | Ev sahibi, Berabere, Deplasman |
|
||||
| OU25 | 59.7% | 0.6568 | Over/Under 2.5 gol |
|
||||
| BTTS | 55.9% | 0.6805 | Her iki takım gol atar mı? |
|
||||
|
||||
### Veri Seti
|
||||
|
||||
- **Toplam maç:** 19,819
|
||||
- **Train:** 14,319
|
||||
- **Validation:** 2,527
|
||||
- **Test:** 2,973
|
||||
|
||||
### Test Örneği Sonucu
|
||||
|
||||
```
|
||||
MS Prediction:
|
||||
Home Win (1): 52.5%
|
||||
Draw (X): 27.6%
|
||||
Away Win (2): 19.9%
|
||||
|
||||
OU25 Prediction:
|
||||
Over 2.5: 47.8%
|
||||
Under 2.5: 52.2%
|
||||
|
||||
BTTS Prediction:
|
||||
Yes: 52.8%
|
||||
No: 47.2%
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Dosya Yapısı
|
||||
|
||||
```
|
||||
ai-engine/
|
||||
├── models/
|
||||
│ └── v25/
|
||||
│ ├── xgb_v25_ms.json # XGBoost Match Result
|
||||
│ ├── lgb_v25_ms.txt # LightGBM Match Result
|
||||
│ ├── xgb_v25_ou25.json # XGBoost Over/Under 2.5
|
||||
│ ├── lgb_v25_ou25.txt # LightGBM Over/Under 2.5
|
||||
│ ├── xgb_v25_btts.json # XGBoost BTTS
|
||||
│ ├── lgb_v25_btts.txt # LightGBM BTTS
|
||||
│ └── feature_cols.json # Feature listesi
|
||||
├── scripts/
|
||||
│ ├── train_v25_clean.py # Yeni training script
|
||||
│ └── test_v25_predictor.py # Test script
|
||||
└── models/
|
||||
└── v25_ensemble.py # Predictor sınıfı
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Kavramlar
|
||||
|
||||
### CatBoost Nedir?
|
||||
|
||||
- Yandex tarafından geliştirilen gradient boosting kütüphanesi
|
||||
- XGBoost ve LightGBM gibi makine öğrenmesi modeli
|
||||
- Kategorik değişkenleri otomatik işler
|
||||
- Overfitting'e karşı dayanıklı
|
||||
- Opsiyonel - yoksa XGBoost ve LightGBM ile çalışır
|
||||
|
||||
### Target Leakage Nedir?
|
||||
|
||||
Model eğitiminde kullanılan bir feature'ın aslında hedef değişkenin sonucunu "bilmesi" durumudur.
|
||||
|
||||
**Gerçek Hayat Örneği:**
|
||||
- Doktor hastaya "hasta mısın?" diye sorar
|
||||
- Hasta "evet" derse, model bu bilgiyi kullanarak hastalık tahmin eder
|
||||
- Ama gerçek tahminde bu bilgi olmayacak!
|
||||
|
||||
**Futbol Örneği:**
|
||||
- `total_goals` feature'ı maç sonucunu zaten biliyor
|
||||
- Model bu bilgiyle "öğreniyor" ama gerçek tahminde bu bilgi yok
|
||||
- Sonuç: Model gerçek dünyada başarısız olur
|
||||
|
||||
---
|
||||
|
||||
## 6. Kullanım
|
||||
|
||||
### Modeli Yükleme
|
||||
|
||||
```python
|
||||
from models.v25_ensemble import get_v25_predictor
|
||||
|
||||
predictor = get_v25_predictor()
|
||||
```
|
||||
|
||||
### Tahmin Yapma
|
||||
|
||||
```python
|
||||
features = {
|
||||
'home_overall_elo': 1650.0,
|
||||
'away_overall_elo': 1580.0,
|
||||
'odds_ms_h': 1.85,
|
||||
'odds_ms_d': 3.50,
|
||||
'odds_ms_a': 4.20,
|
||||
# ... diğer feature'lar
|
||||
}
|
||||
|
||||
# MS tahmini
|
||||
home, draw, away = predictor.predict_ms(features)
|
||||
|
||||
# Tam tahmin
|
||||
prediction = predictor.predict_match(
|
||||
match_id='match_001',
|
||||
home_team='Galatasaray',
|
||||
away_team='Fenerbahce',
|
||||
features=features,
|
||||
odds={'ms_h': 1.85, 'ms_d': 3.50, 'ms_a': 4.20}
|
||||
)
|
||||
```
|
||||
|
||||
### Modeli Yeniden Eğitme
|
||||
|
||||
```bash
|
||||
cd ai-engine
|
||||
python scripts/train_v25_clean.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Sonraki Adımlar
|
||||
|
||||
1. **Hyperparameter Tuning:** Optuna ile daha iyi parametreler
|
||||
2. **Feature Engineering:** Yeni feature'lar ekleme
|
||||
3. **Calibration:** Probability calibration ile daha doğru olasılıklar
|
||||
4. **Cross-Validation:** Daha güvenilir model değerlendirme
|
||||
5. **Feature Importance:** Hangi feature'lar önemli?
|
||||
|
||||
---
|
||||
|
||||
## 8. Notlar
|
||||
|
||||
- Eski modeller `models/v25/` klasöründe yedeklendi
|
||||
- Yeni modeller aynı klasöre kaydedildi
|
||||
- Feature listesi `feature_cols.json` dosyasında
|
||||
- Training data: `ai-engine/data/training_data.csv` (19,819 maç)
|
||||
|
||||
---
|
||||
|
||||
**Düzenleyen:** AI Assistant
|
||||
**Tarih:** 12 Mart 2026
|
||||
Reference in New Issue
Block a user