GoshawkVortexAI commited on
Commit
b785ebf
·
verified ·
1 Parent(s): 9bf2293

Upload app (1).py

Browse files
Files changed (1) hide show
  1. app (1).py +161 -0
app (1).py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import numpy as np
3
+ import xgboost as xgb
4
+ import gradio as gr
5
+ from google import genai
6
+ from google.genai import types
7
+
8
+ # ==========================================
9
+ # 🔌 1. GEMINI CLIENT BAŞLATMA
10
+ # ==========================================
11
+ api_key = os.environ.get("GEMINI_API_KEY")
12
+ client = None
13
+ if api_key:
14
+ client = genai.Client(api_key=api_key)
15
+
16
+ # ==========================================
17
+ # 📊 2. SENTETİK XGBOOST MODELİ (MOCK TRAIN)
18
+ # ==========================================
19
+ # Arayüz açıldığında hızlıca kalibre edilen örnek XGBoost sınıflandırıcısı.
20
+ # Özellikler: [Ev_Sırası, Dep_Sırası, Ev_Form_Puanı, Dep_Form_Puanı, Ev_Sakat_Sayısı, Dep_Sakat_Sayısı]
21
+ def train_baseline_xgboost():
22
+ X_synthetic = np.array([
23
+ [1, 18, 13, 3, 0, 3], # Güçlü ev sahibi favori
24
+ [15, 2, 4, 12, 2, 0], # Güçlü deplasman favori
25
+ [8, 9, 7, 8, 1, 1], # Denk takımlar
26
+ [4, 5, 10, 9, 0, 1], # Kafa kafaya zirve mücadelesi
27
+ [20, 19, 2, 1, 3, 2], # Alt sıraların mücadelesi
28
+ [3, 16, 11, 4, 1, 2], # Ev favori
29
+ [17, 4, 3, 11, 2, 0] # Deplasman favori
30
+ ])
31
+ # Hedef Değişkenler: 0 -> Ev Sahibi Kazanır, 1 -> Beraberlik, 2 -> Deplasman Kazanır
32
+ y_synthetic = np.array([0, 2, 1, 0, 1, 0, 2])
33
+
34
+ model = xgb.XGBClassifier(
35
+ n_estimators=30,
36
+ max_depth=3,
37
+ learning_rate=0.1,
38
+ objective='multi:softprob',
39
+ num_class=3,
40
+ eval_metric='mlogloss',
41
+ random_state=42
42
+ )
43
+ model.fit(X_synthetic, y_synthetic)
44
+ return model
45
+
46
+ # Uygulama başlarken modeli hafızaya yükle
47
+ xgb_model = train_baseline_xgboost()
48
+
49
+ # ==========================================
50
+ # 🧠 3. TAHMİN VE ANALİZ MOTORU
51
+ # ==========================================
52
+ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, away_form, home_injuries, away_injuries):
53
+ if not home_team or not away_team:
54
+ return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
55
+
56
+ # XGBoost Tahmin Girdisini Hazırlama
57
+ features = np.array([[home_rank, away_rank, home_form, away_form, home_injuries, away_injuries]])
58
+ probabilities = xgb_model.predict_proba(features)[0]
59
+
60
+ p_home = float(probabilities[0])
61
+ p_draw = float(probabilities[1])
62
+ p_away = float(probabilities[2])
63
+
64
+ # Gradio grafiği için dictionary formatı
65
+ prob_dict = {
66
+ f"{home_team} Galibiyeti (1)": p_home,
67
+ "Beraberlik (X)": p_draw,
68
+ f"{away_team} Galibiyeti (2)": p_away
69
+ }
70
+
71
+ # Gemini Analiz Promptu
72
+ prompt = f"""
73
+ Sen uzman bir spor analisti ve profesyonel bir veri modelleyicisisin.
74
+
75
+ Karşılaşma: {home_team} (Ev) vs {away_team} (Deplasman)
76
+
77
+ İstastistiksel Göstergeler:
78
+ - {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
79
+ - {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
80
+
81
+ XGBoost Makine Öğrenmesi Modeli Sonuçları:
82
+ - {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
83
+ - Beraberlik Olasılığı: %{p_draw*100:.1f}
84
+ - {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
85
+
86
+ 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:
87
+ 1. 🎯 Model Yorumu (XGBoost olasılıklarının mantığı)
88
+ 2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
89
+ 3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
90
+
91
+ Yorumların rasyonel, nesnel ve profesyonel olsun.
92
+ """
93
+
94
+ # Gemini API Çağrısı
95
+ if client:
96
+ try:
97
+ response = client.models.generate_content(
98
+ model='gemini-2.5-flash',
99
+ contents=prompt,
100
+ config=types.GenerateContentConfig(
101
+ temperature=0.3
102
+ )
103
+ )
104
+ analysis_result = response.text
105
+ except Exception as e:
106
+ 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.)"
107
+ else:
108
+ 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.)"
109
+
110
+ return analysis_result, prob_dict
111
+
112
+ # ==========================================
113
+ # 🎨 4. GRADIO ARAYÜZÜ (DARK THEME)
114
+ # ==========================================
115
+ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
116
+ gr.Markdown(
117
+ """
118
+ # ⚽ XGBoost & Gemini Hibrit Maç Tahmin Radarı
119
+ 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.
120
+ """
121
+ )
122
+
123
+ with gr.Row():
124
+ with gr.Column():
125
+ gr.Markdown("### 🏟️ Takım İsimleri")
126
+ home_input = gr.Textbox(label="Ev Sahibi Takım", value="Arsenal")
127
+ away_input = gr.Textbox(label="Deplasman Takım", value="Chelsea")
128
+
129
+ gr.Markdown("### 📊 Lig ve Form Durumu")
130
+ with gr.Row():
131
+ home_rank_input = gr.Number(label="Ev Sahibi Lig Sırası", value=3, precision=0)
132
+ away_rank_input = gr.Number(label="Deplasman Lig Sırası", value=12, precision=0)
133
+ with gr.Row():
134
+ home_form_input = gr.Slider(label="Ev Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=11, step=1)
135
+ away_form_input = gr.Slider(label="Deplasman Form Puanı (Son 5 Maç)", minimum=0, maximum=15, value=4, step=1)
136
+ with gr.Row():
137
+ home_inj_input = gr.Number(label="Ev Sakat/Cezalı Sayısı", value=1, precision=0)
138
+ away_inj_input = gr.Number(label="Deplasman Sakat/Cezalı Sayısı", value=3, precision=0)
139
+
140
+ submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
141
+
142
+ with gr.Column():
143
+ gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (XGBoost)")
144
+ prob_output = gr.Label(label="Olasılık Dağılımı")
145
+
146
+ gr.Markdown("### 🧠 Gemini Yapay Zeka Analiz Raporu")
147
+ analysis_output = gr.Markdown(value="Verileri girdikten sonra butona basarak analizi başlatabilirsiniz.")
148
+
149
+ submit_btn.click(
150
+ fn=predict_and_analyze,
151
+ inputs=[
152
+ home_input, away_input,
153
+ home_rank_input, away_rank_input,
154
+ home_form_input, away_form_input,
155
+ home_inj_input, away_inj_input
156
+ ],
157
+ outputs=[analysis_output, prob_output]
158
+ )
159
+
160
+ if __name__ == "__main__":
161
+ demo.launch()