File size: 6,919 Bytes
c90b9af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import os
import numpy as np
import xgboost as xgb
import gradio as gr
from google import genai
from google.genai import types

# ==========================================
# 🔌 1. GEMINI CLIENT BAŞLATMA
# ==========================================
api_key = os.environ.get("GEMINI_API_KEY")
client = None
if api_key:
    client = genai.Client(api_key=api_key)

# ==========================================
# 📊 2. SENTETİK XGBOOST MODELİ (MOCK TRAIN)
# ==========================================
# Arayüz açıldığında hızlıca kalibre edilen örnek XGBoost sınıflandırıcısı.
# Özellikler: [Ev_Sırası, Dep_Sırası, Ev_Form_Puanı, Dep_Form_Puanı, Ev_Sakat_Sayısı, Dep_Sakat_Sayısı]
def train_baseline_xgboost():
    X_synthetic = np.array([
        [1, 18, 13, 3, 0, 3],  # Güçlü ev sahibi favori
        [15, 2, 4, 12, 2, 0],  # Güçlü deplasman favori
        [8, 9, 7, 8, 1, 1],    # Denk takımlar
        [4, 5, 10, 9, 0, 1],   # Kafa kafaya zirve mücadelesi
        [20, 19, 2, 1, 3, 2],  # Alt sıraların mücadelesi
        [3, 16, 11, 4, 1, 2],  # Ev favori
        [17, 4, 3, 11, 2, 0]   # Deplasman favori
    ])
    # Hedef Değişkenler: 0 -> Ev Sahibi Kazanır, 1 -> Beraberlik, 2 -> Deplasman Kazanır
    y_synthetic = np.array([0, 2, 1, 0, 1, 0, 2])

    model = xgb.XGBClassifier(
        n_estimators=30,
        max_depth=3,
        learning_rate=0.1,
        objective='multi:softprob',
        num_class=3,
        eval_metric='mlogloss',
        random_state=42
    )
    model.fit(X_synthetic, y_synthetic)
    return model

# Uygulama başlarken modeli hafızaya yükle
xgb_model = train_baseline_xgboost()

# ==========================================
# 🧠 3. TAHMİN VE ANALİZ MOTORU
# ==========================================
def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, away_form, home_injuries, away_injuries):
    if not home_team or not away_team:
        return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}

    # XGBoost Tahmin Girdisini Hazırlama
    features = np.array([[home_rank, away_rank, home_form, away_form, home_injuries, away_injuries]])
    probabilities = xgb_model.predict_proba(features)[0]
    
    p_home = float(probabilities[0])
    p_draw = float(probabilities[1])
    p_away = float(probabilities[2])

    # Gradio grafiği için dictionary formatı
    prob_dict = {
        f"{home_team} Galibiyeti (1)": p_home,
        "Beraberlik (X)": p_draw,
        f"{away_team} Galibiyeti (2)": p_away
    }

    # Gemini Analiz Promptu
    prompt = f"""
    Sen uzman bir spor analisti ve profesyonel bir veri modelleyicisisin.
    
    Karşılaşma: {home_team} (Ev) vs {away_team} (Deplasman)
    
    İstastistiksel Göstergeler:
    - {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
    - {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
    
    XGBoost Makine Öğrenmesi Modeli Sonuçları:
    - {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
    - Beraberlik Olasılığı: %{p_draw*100:.1f}
    - {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
    
    Yukarıdaki matematiksel olasılıkları ve takım durumlarını analiz ederek Türkçe bir rapor hazırla. Raporda şu başlıklar mutlaka bulunsun:
    1. 🎯 Model Yorumu (XGBoost olasılıklarının mantığı)
    2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
    3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
    
    Yorumların rasyonel, nesnel ve profesyonel olsun.
    """

    # Gemini API Çağrısı
    if client:
        try:
            response = client.models.generate_content(
                model='gemini-2.5-flash',
                contents=prompt,
                config=types.GenerateContentConfig(
                    temperature=0.3
                )
            )
            analysis_result = response.text
        except Exception as e:
            analysis_result = f"Gemini API Analiz Hatası: {str(e)}\n\n(Lütfen GEMINI_API_KEY değişkeninizi Hugging Face Secrets alanına doğru eklediğinizden emin olun.)"
    else:
        analysis_result = "Gemini API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına 'GEMINI_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki XGBoost grafik tahminini görebilirsiniz.)"

    return analysis_result, prob_dict

# ==========================================
# 🎨 4. GRADIO ARAYÜZÜ (DARK THEME)
# ==========================================
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
    gr.Markdown(
        """
        # ⚽ XGBoost & Gemini Hibrit Maç Tahmin Radarı
        Bu uygulama, girdiğiniz takım verilerini **XGBoost** sınıflandırıcısı ile tarayıp olasılıkları hesaplar ve **Gemini** yapay zekası ile matematiksel olarak yorumlar.
        """
    )
    
    with gr.Row():
        with gr.Column():
            gr.Markdown("### 🏟️ Takım İsimleri")
            home_input = gr.Textbox(label="Ev Sahibi Takım", value="Arsenal")
            away_input = gr.Textbox(label="Deplasman Takım", value="Chelsea")
            
            gr.Markdown("### 📊 Lig ve Form Durumu")
            with gr.Row():
                home_rank_input = gr.Number(label="Ev Sahibi Lig Sırası", value=3, precision=0)
                away_rank_input = gr.Number(label="Deplasman Lig Sırası", value=12, precision=0)
            with gr.Row():
                home_form_input = gr.Slider(label="Ev Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=11, step=1)
                away_form_input = gr.Slider(label="Deplasman Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=4, step=1)
            with gr.Row():
                home_inj_input = gr.Number(label="Ev Sakat/Cezalı Sayısı", value=1, precision=0)
                away_inj_input = gr.Number(label="Deplasman Sakat/Cezalı Sayısı", value=3, precision=0)
                
            submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")

        with gr.Column():
            gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (XGBoost)")
            prob_output = gr.Label(label="Olasılık Dağılımı")
            
            gr.Markdown("### 🧠 Gemini Yapay Zeka Analiz Raporu")
            analysis_output = gr.Markdown(value="Verileri girdikten sonra butona basarak analizi başlatabilirsiniz.")

    submit_btn.click(
        fn=predict_and_analyze,
        inputs=[
            home_input, away_input,
            home_rank_input, away_rank_input,
            home_form_input, away_form_input,
            home_inj_input, away_inj_input
        ],
        outputs=[analysis_output, prob_output]
    )

if __name__ == "__main__":
    demo.launch()