GoshawkVortexAI commited on
Commit
4bb4fb8
·
verified ·
1 Parent(s): f514727

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -42
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import os
2
  import numpy as np
3
- import xgboost as xgb
4
  import gradio as gr
 
5
  from groq import Groq
6
 
7
  # ==========================================
@@ -13,33 +13,55 @@ if api_key:
13
  client = Groq(api_key=api_key)
14
 
15
  # ==========================================
16
- # 📊 2. SENTETİK XGBOOST MODELİ (MOCK TRAIN)
17
  # ==========================================
18
- def train_baseline_xgboost():
19
- X_synthetic = np.array([
20
- [1, 18, 13, 3, 0, 3],
21
- [15, 2, 4, 12, 2, 0],
22
- [8, 9, 7, 8, 1, 1],
23
- [4, 5, 10, 9, 0, 1],
24
- [20, 19, 2, 1, 3, 2],
25
- [3, 16, 11, 4, 1, 2],
26
- [17, 4, 3, 11, 2, 0]
27
- ])
28
- y_synthetic = np.array([0, 2, 1, 0, 1, 0, 2])
29
-
30
- model = xgb.XGBClassifier(
31
- n_estimators=30,
32
- max_depth=3,
33
- learning_rate=0.1,
34
- objective='multi:softprob',
35
- num_class=3,
36
- eval_metric='mlogloss',
37
- random_state=42
38
- )
39
- model.fit(X_synthetic, y_synthetic)
40
- return model
 
 
 
 
 
41
 
42
- xgb_model = train_baseline_xgboost()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
  # ==========================================
45
  # 🧠 3. TAHMİN VE ANALİZ MOTORU
@@ -48,17 +70,21 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
48
  if not home_team or not away_team:
49
  return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
50
 
51
- features = np.array([[home_rank, away_rank, home_form, away_form, home_injuries, away_injuries]])
52
- probabilities = xgb_model.predict_proba(features)[0]
53
-
54
- p_home = float(probabilities[0])
55
- p_draw = float(probabilities[1])
56
- p_away = float(probabilities[2])
 
 
 
57
 
 
58
  prob_dict = {
59
- f"{home_team} Galibiyeti (1)": p_home,
60
- "Beraberlik (X)": p_draw,
61
- f"{away_team} Galibiyeti (2)": p_away
62
  }
63
 
64
  prompt = f"""
@@ -70,13 +96,15 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
70
  - {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
71
  - {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
72
 
73
- XGBoost Makine Öğrenmesi Modeli Sonuçları:
 
74
  - {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
75
  - Beraberlik Olasılığı: %{p_draw*100:.1f}
76
  - {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
 
77
 
78
  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:
79
- 1. 🎯 Model Yorumu (XGBoost olasılıklarının mantığı)
80
  2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
81
  3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
82
 
@@ -85,7 +113,6 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
85
 
86
  if client:
87
  try:
88
- # Model güncellendi ve max_tokens eklendi
89
  response = client.chat.completions.create(
90
  model="openai/gpt-oss-120b",
91
  messages=[
@@ -98,7 +125,7 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
98
  except Exception as e:
99
  analysis_result = f"Groq API Analiz Hatası: {str(e)}\n\n(Lütfen GROQ_API_KEY değişkeninizi Hugging Face Secrets alanına doğru eklediğinizden emin olun.)"
100
  else:
101
- analysis_result = "Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına 'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki XGBoost grafik tahminini görebilirsiniz.)"
102
 
103
  return analysis_result, prob_dict
104
 
@@ -108,8 +135,8 @@ def predict_and_analyze(home_team, away_team, home_rank, away_rank, home_form, a
108
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
109
  gr.Markdown(
110
  """
111
- # ⚽ XGBoost & Groq Hibrit Maç Tahmin Radarı
112
- Bu uygulama, girdiğiniz takım verilerini **XGBoost** sınıflandırıcısı ile tarayıp olasılıkları hesaplar ve **Groq (GPT-OSS)** yapay zekası ile matematiksel olarak yorumlar.
113
  """
114
  )
115
 
@@ -133,7 +160,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate"))
133
  submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
134
 
135
  with gr.Column():
136
- gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (XGBoost)")
137
  prob_output = gr.Label(label="Olasılık Dağılımı")
138
 
139
  gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")
 
1
  import os
2
  import numpy as np
 
3
  import gradio as gr
4
+ from scipy.stats import poisson
5
  from groq import Groq
6
 
7
  # ==========================================
 
13
  client = Groq(api_key=api_key)
14
 
15
  # ==========================================
16
+ # 📊 2. POISSON DAĞILIMI İLE GOL TAHMİN MOTORU
17
  # ==========================================
18
+ def calculate_poisson_probabilities(home_rank, away_rank, home_form, away_form, home_injuries, away_injuries):
19
+ """
20
+ Takım güçlerini (sıralama, form, sakatlık) kullanarak beklenen gol sayılarını (Lambda) hesaplar.
21
+ Ardından Poisson dağılımı ile 0-5 arası gol atma olasılıklarını matrise döker.
22
+ """
23
+ # 1. Takım Güçlerini Hesaplama (Basit bir formülasyon)
24
+ # Lig sıralaması: 1. sıra en güçlü, 20. sıra en zayıf (20 - sıra + 1)
25
+ home_rank_power = max(1, 21 - home_rank)
26
+ away_rank_power = max(1, 21 - away_rank)
27
+
28
+ # Form gücü: Form puanı 0-15 arası. (Form / 15) * 2 + 0.5 (0.5 ile 2.5 arası çarpan)
29
+ home_form_power = (home_form / 15.0) * 2 + 0.5
30
+ away_form_power = (away_form / 15.0) * 2 + 0.5
31
+
32
+ # Sakatlık cezası: Her sakat oyuncu gücü %10 düşürür
33
+ home_injury_penalty = max(0.5, 1.0 - (home_injuries * 0.10))
34
+ away_injury_penalty = max(0.5, 1.0 - (away_injuries * 0.10))
35
+
36
+ # Ev sahibi avantajı (Futbolda ortalama %15-20 avantajdır)
37
+ home_advantage = 1.20
38
+
39
+ # 2. Beklenen Gol Sayıları (Lambda - λ)
40
+ # Temel gol ortalaması varsayımı: Ev için 1.5, Deplasman için 1.2
41
+ base_home_goals = 1.5
42
+ base_away_goals = 1.2
43
+
44
+ lambda_home = base_home_goals * (home_rank_power / 10.0) * home_form_power * home_injury_penalty * home_advantage
45
+ lambda_away = base_away_goals * (away_rank_power / 10.0) * away_form_power * away_injury_penalty
46
 
47
+ # Lambda değerlerini mantıklı bir aralığa sıkıştır (0.1 ile 4.0 arası)
48
+ lambda_home = max(0.1, min(4.0, lambda_home))
49
+ lambda_away = max(0.1, min(4.0, lambda_away))
50
+
51
+ # 3. Poisson Matrisi (0-5 gol arası)
52
+ max_goals = 5
53
+ home_probs = [poisson.pmf(i, lambda_home) for i in range(max_goals + 1)]
54
+ away_probs = [poisson.pmf(i, lambda_away) for i in range(max_goals + 1)]
55
+
56
+ # Skor matrisi (Ev x Deplasman)
57
+ score_matrix = np.outer(home_probs, away_probs)
58
+
59
+ # 4. Kazanma Olasılıklarını Toplama
60
+ p_home_win = np.sum(np.tril(score_matrix, -1)) # Ev sahibinin daha fazla gol attığı alt üçgen
61
+ p_draw = np.sum(np.diag(score_matrix)) # Beraberlik (kökler)
62
+ p_away_win = np.sum(np.triu(score_matrix, 1)) # Deplasmanın daha fazla gol attığı üst üçgen
63
+
64
+ return p_home_win, p_draw, p_away_win, lambda_home, lambda_away, score_matrix
65
 
66
  # ==========================================
67
  # 🧠 3. TAHMİN VE ANALİZ MOTORU
 
70
  if not home_team or not away_team:
71
  return "Lütfen ev sahibi ve deplasman takımlarının isimlerini giriniz.", {}
72
 
73
+ # Poisson hesaplamalarını yap
74
+ p_home, p_draw, p_away, lam_home, lam_away, score_matrix = calculate_poisson_probabilities(
75
+ home_rank, away_rank, home_form, away_form, home_injuries, away_injuries
76
+ )
77
+
78
+ # En olası skoru bulma
79
+ max_prob_idx = np.unravel_index(np.argmax(score_matrix), score_matrix.shape)
80
+ most_likely_score = f"{max_prob_idx[0]} - {max_prob_idx[1]}"
81
+ most_likely_prob = score_matrix[max_prob_idx] * 100
82
 
83
+ # Gradio grafiği için dictionary formatı
84
  prob_dict = {
85
+ f"{home_team} Galibiyeti (1)": float(p_home),
86
+ "Beraberlik (X)": float(p_draw),
87
+ f"{away_team} Galibiyeti (2)": float(p_away)
88
  }
89
 
90
  prompt = f"""
 
96
  - {home_team}: Lig Sıralaması: {home_rank}, Son 5 Maç Form Puanı (Max 15): {home_form}, Eksik/Sakat Oyuncu: {home_injuries}
97
  - {away_team}: Lig Sıralaması: {away_rank}, Son 5 Maç Form Puanı (Max 15): {away_form}, Eksik/Sakat Oyuncu: {away_injuries}
98
 
99
+ Poisson Dağılım Modeli Sonuçları:
100
+ - Beklenen Gol Sayıları (λ): {home_team} {lam_home:.2f} - {away_team} {lam_away:.2f}
101
  - {home_team} Kazanma Olasılığı: %{p_home*100:.1f}
102
  - Beraberlik Olasılığı: %{p_draw*100:.1f}
103
  - {away_team} Kazanma Olasılığı: %{p_away*100:.1f}
104
+ - En Olası Skor: {most_likely_score} (Olasılık: %{most_likely_prob:.1f})
105
 
106
  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:
107
+ 1. 🎯 Model Yorumu (Poisson dağılımı ve beklenen gol sayılarının mantığı)
108
  2. ⚽ Olası Skor ve Gol Tahmini (Alt/Üst değerlendirmesi)
109
  3. 💡 Değerli Bahis Önerisi (+EV Değerlendirmesi)
110
 
 
113
 
114
  if client:
115
  try:
 
116
  response = client.chat.completions.create(
117
  model="openai/gpt-oss-120b",
118
  messages=[
 
125
  except Exception as e:
126
  analysis_result = f"Groq API Analiz Hatası: {str(e)}\n\n(Lütfen GROQ_API_KEY değişkeninizi Hugging Face Secrets alanına doğru eklediğinizden emin olun.)"
127
  else:
128
+ analysis_result = "Groq API Anahtarı bulunamadı! Lütfen Hugging Face Space alanına 'GROQ_API_KEY' adıyla bir Secret ekleyin. (Yine de yukarıdaki Poisson grafik tahminini görebilirsiniz.)"
129
 
130
  return analysis_result, prob_dict
131
 
 
135
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="slate")) as demo:
136
  gr.Markdown(
137
  """
138
+ # ⚽ Poisson Dağılımı & Groq Hibrit Maç Tahmin Radarı
139
+ Bu uygulama, girdiğiniz takım verilerini **Poisson Dağılımı** ile analiz ederek beklenen gol sayılarını ve kazanma olasılıklarını hesaplar, ardından **Groq (GPT-OSS)** yapay zekası ile matematiksel olarak yorumlar.
140
  """
141
  )
142
 
 
160
  submit_btn = gr.Button("Analiz Et ve Tahmin Üret", variant="primary")
161
 
162
  with gr.Column():
163
+ gr.Markdown("### 📈 Matematiksel Kazanma Olasılıkları (Poisson)")
164
  prob_output = gr.Label(label="Olasılık Dağılımı")
165
 
166
  gr.Markdown("### 🧠 Groq Yapay Zeka Analiz Raporu")