UmarAF commited on
Commit
981a51d
Β·
verified Β·
1 Parent(s): 490eafd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -49
app.py CHANGED
@@ -4,21 +4,31 @@ import numpy as np
4
  import joblib
5
  import pickle
6
 
7
- # --- 1. LOAD MODEL & DATA ---
8
- model = joblib.load('xgboost_valorant_model.pkl')
9
-
10
- with open('player_knowledge_base.pkl', 'rb') as f:
11
- knowledge_base = pickle.load(f)
12
-
13
- with open('training_columns.pkl', 'rb') as f:
14
- training_columns = pickle.load(f)
 
 
 
 
 
 
 
 
15
 
16
  # Daftar Map & Agent (Sesuaikan dengan data Anda)
17
  MAP_LIST = ['Ascent', 'Bind', 'Breeze', 'Fracture', 'Haven', 'Icebox', 'Lotus', 'Pearl', 'Split', 'Sunset', 'Abyss', 'Corrode']
18
- AGENT_LIST = ['Jett', 'Raze', 'Reyna', 'Phoenix', 'Yoru', 'Neon', 'Iso', # Duelist
19
- 'Sova', 'Fade', 'Breach', 'Skye', 'Kayo', 'Gekko', # Initiator
20
- 'Omen', 'Brimstone', 'Viper', 'Astra', 'Harbor', 'Clove', 'Waylay', # Controller
21
- 'Sage', 'Cypher', 'Killjoy', 'Chamber', 'Deadlock', 'Vyse', 'Tejo', 'Veto'] # Sentinel
 
 
22
 
23
  # --- 2. FUNGSI PREDIKSI ---
24
  def predict_match(map_name, t1_side,
@@ -33,26 +43,26 @@ def predict_match(map_name, t1_side,
33
 
34
  # B. Helper: Ambil Stats dari Knowledge Base
35
  def get_stats(player, agent):
36
- # Jika player/agent ada di database, ambil statsnya
37
- # Jika tidak (player baru), pakai nilai default (WR=0.5, Exp=0)
38
- key = (player, agent)
 
 
39
  stats = knowledge_base.get(key, {'Agent_WR': 0.5, 'General_WR': 0.5, 'Exp': 0})
40
  return stats
41
 
42
  # C. Isi Fitur Winrate (Skenario 4 Logic)
43
- # Team 1
44
  t1_inputs = [
45
  (t1_p1_name, t1_p1_agent), (t1_p2_name, t1_p2_agent), (t1_p3_name, t1_p3_agent),
46
  (t1_p4_name, t1_p4_agent), (t1_p5_name, t1_p5_agent)
47
  ]
48
-
49
  t1_general_wrs = []
50
 
51
  for i, (p_name, p_agent) in enumerate(t1_inputs):
52
  stats = get_stats(p_name, p_agent)
53
  idx = i + 1
54
 
55
- # Isi ke DataFrame (Cek apakah kolom ada di training_columns agar tidak error)
56
  if f'T1_P{idx}_Agent_WR' in training_columns:
57
  input_data.at[0, f'T1_P{idx}_Agent_WR'] = stats['Agent_WR']
58
  if f'T1_P{idx}_General_WR' in training_columns:
@@ -62,7 +72,7 @@ def predict_match(map_name, t1_side,
62
 
63
  t1_general_wrs.append(stats['General_WR'])
64
 
65
- # Team 2 (Lakukan hal sama)
66
  t2_inputs = [
67
  (t2_p1_name, t2_p1_agent), (t2_p2_name, t2_p2_agent), (t2_p3_name, t2_p3_agent),
68
  (t2_p4_name, t2_p4_agent), (t2_p5_name, t2_p5_agent)
@@ -72,12 +82,14 @@ def predict_match(map_name, t1_side,
72
  for i, (p_name, p_agent) in enumerate(t2_inputs):
73
  stats = get_stats(p_name, p_agent)
74
  idx = i + 1
 
75
  if f'T2_P{idx}_Agent_WR' in training_columns:
76
  input_data.at[0, f'T2_P{idx}_Agent_WR'] = stats['Agent_WR']
77
  if f'T2_P{idx}_General_WR' in training_columns:
78
  input_data.at[0, f'T2_P{idx}_General_WR'] = stats['General_WR']
79
  if f'T2_P{idx}_Agent_Exp' in training_columns:
80
  input_data.at[0, f'T2_P{idx}_Agent_Exp'] = stats['Exp']
 
81
  t2_general_wrs.append(stats['General_WR'])
82
 
83
  # D. Hitung WR Diff
@@ -86,46 +98,98 @@ def predict_match(map_name, t1_side,
86
  t2_avg = np.mean(t2_general_wrs)
87
  input_data.at[0, 'WR_Diff'] = t1_avg - t2_avg
88
 
89
- # E. One-Hot Encoding Manual (Set Nilai 1)
90
  # Map
91
  map_col = f'MAP_{map_name}'
92
  if map_col in training_columns:
93
  input_data.at[0, map_col] = 1
94
 
95
- # Start Side (Jika ada fitur ini)
96
  if 'T1_StartSide_Defense' in training_columns:
97
  input_data.at[0, 'T1_StartSide_Defense'] = 1 if t1_side == 'Defense' else 0
98
- if 'T2_StartSide_Defense' in training_columns: # Biasanya kebalikan T1
99
  input_data.at[0, 'T2_StartSide_Defense'] = 1 if t1_side == 'Attack' else 0
100
 
101
-
102
-
103
- # Karena OHE manual agak ribet mencocokkan nama kolom tepatnya,
104
- # kita gunakan cara pintar: Loop semua input agent, cari kolom yang sesuai di training_columns
105
-
106
- # Set T1 Agents
107
  for i, (_, agent) in enumerate(t1_inputs):
108
  col_name = f'T1_P{i+1}_Agent_{agent}'
109
  if col_name in training_columns:
110
  input_data.at[0, col_name] = 1
111
 
112
- # Set T2 Agents
113
  for i, (_, agent) in enumerate(t2_inputs):
114
  col_name = f'T2_P{i+1}_Agent_{agent}'
115
  if col_name in training_columns:
116
  input_data.at[0, col_name] = 1
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  # --- 3. PREDIKSI ---
119
- # Convert ke float agar aman
120
  input_data = input_data.astype(float)
121
 
122
- prob = model.predict_proba(input_data)[0]
123
- win_prob_t1 = prob[1] # Probabilitas kelas 1 (T1 Win)
124
-
125
- winner = "TEAM 1" if win_prob_t1 > 0.5 else "TEAM 2"
126
- confidence = win_prob_t1 if win_prob_t1 > 0.5 else 1 - win_prob_t1
127
-
128
- return f"{winner} WIN ({confidence:.1%} Confidence)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
 
130
  # --- 3. UI GRADIO ---
131
  with gr.Blocks(title="Valorant Match Predictor") as demo:
@@ -141,36 +205,28 @@ with gr.Blocks(title="Valorant Match Predictor") as demo:
141
  # Team 1 Inputs
142
  with gr.Column():
143
  gr.Markdown("### πŸ”΅ Team 1 Roster")
144
- t1_p1_n = gr.Textbox(label="P1 Name")
145
  t1_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
146
-
147
- t1_p2_n = gr.Textbox(label="P2 Name")
148
  t1_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
149
-
150
  t1_p3_n = gr.Textbox(label="P3 Name")
151
  t1_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
152
-
153
  t1_p4_n = gr.Textbox(label="P4 Name")
154
  t1_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
155
-
156
  t1_p5_n = gr.Textbox(label="P5 Name")
157
  t1_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
158
 
159
  # Team 2 Inputs
160
  with gr.Column():
161
  gr.Markdown("### πŸ”΄ Team 2 Roster")
162
- t2_p1_n = gr.Textbox(label="P1 Name")
163
  t2_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
164
-
165
- t2_p2_n = gr.Textbox(label="P2 Name")
166
  t2_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
167
-
168
  t2_p3_n = gr.Textbox(label="P3 Name")
169
  t2_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
170
-
171
  t2_p4_n = gr.Textbox(label="P4 Name")
172
  t2_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
173
-
174
  t2_p5_n = gr.Textbox(label="P5 Name")
175
  t2_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
176
 
 
4
  import joblib
5
  import pickle
6
 
7
+ try:
8
+ model = joblib.load('xgboost_valorant_model.pkl')
9
+
10
+ # Sesuaikan nama file dengan output training
11
+ with open('player_stats.pkl', 'rb') as f:
12
+ knowledge_base = pickle.load(f)
13
+
14
+ with open('model_columns.pkl', 'rb') as f:
15
+ training_columns = pickle.load(f)
16
+
17
+ print("βœ… Model dan Data berhasil dimuat.")
18
+ except Exception as e:
19
+ print(f"❌ Error loading files: {e}")
20
+ # Dummy data untuk mencegah crash saat development lokal tanpa file
21
+ knowledge_base = {}
22
+ training_columns = []
23
 
24
  # Daftar Map & Agent (Sesuaikan dengan data Anda)
25
  MAP_LIST = ['Ascent', 'Bind', 'Breeze', 'Fracture', 'Haven', 'Icebox', 'Lotus', 'Pearl', 'Split', 'Sunset', 'Abyss', 'Corrode']
26
+ AGENT_LIST = [
27
+ 'Jett', 'Raze', 'Reyna', 'Phoenix', 'Yoru', 'Neon', 'Iso', 'Waylay', # Duelist
28
+ 'Sova', 'Fade', 'Breach', 'Skye', 'Kayo', 'Gekko', 'Tejo', # Initiator
29
+ 'Omen', 'Brimstone', 'Viper', 'Astra', 'Harbor', 'Clove', # Controller
30
+ 'Sage', 'Cypher', 'Killjoy', 'Chamber', 'Deadlock', 'Vyse', 'Veto' # Sentinel
31
+ ]
32
 
33
  # --- 2. FUNGSI PREDIKSI ---
34
  def predict_match(map_name, t1_side,
 
43
 
44
  # B. Helper: Ambil Stats dari Knowledge Base
45
  def get_stats(player, agent):
46
+ # Normalisasi input nama player (strip whitespace)
47
+ player_clean = player.strip() if player else ""
48
+ key = (player_clean, agent)
49
+
50
+ # Ambil stats, default 0.5 jika tidak ada
51
  stats = knowledge_base.get(key, {'Agent_WR': 0.5, 'General_WR': 0.5, 'Exp': 0})
52
  return stats
53
 
54
  # C. Isi Fitur Winrate (Skenario 4 Logic)
55
+ # Team 1 Inputs
56
  t1_inputs = [
57
  (t1_p1_name, t1_p1_agent), (t1_p2_name, t1_p2_agent), (t1_p3_name, t1_p3_agent),
58
  (t1_p4_name, t1_p4_agent), (t1_p5_name, t1_p5_agent)
59
  ]
 
60
  t1_general_wrs = []
61
 
62
  for i, (p_name, p_agent) in enumerate(t1_inputs):
63
  stats = get_stats(p_name, p_agent)
64
  idx = i + 1
65
 
 
66
  if f'T1_P{idx}_Agent_WR' in training_columns:
67
  input_data.at[0, f'T1_P{idx}_Agent_WR'] = stats['Agent_WR']
68
  if f'T1_P{idx}_General_WR' in training_columns:
 
72
 
73
  t1_general_wrs.append(stats['General_WR'])
74
 
75
+ # Team 2 Inputs
76
  t2_inputs = [
77
  (t2_p1_name, t2_p1_agent), (t2_p2_name, t2_p2_agent), (t2_p3_name, t2_p3_agent),
78
  (t2_p4_name, t2_p4_agent), (t2_p5_name, t2_p5_agent)
 
82
  for i, (p_name, p_agent) in enumerate(t2_inputs):
83
  stats = get_stats(p_name, p_agent)
84
  idx = i + 1
85
+
86
  if f'T2_P{idx}_Agent_WR' in training_columns:
87
  input_data.at[0, f'T2_P{idx}_Agent_WR'] = stats['Agent_WR']
88
  if f'T2_P{idx}_General_WR' in training_columns:
89
  input_data.at[0, f'T2_P{idx}_General_WR'] = stats['General_WR']
90
  if f'T2_P{idx}_Agent_Exp' in training_columns:
91
  input_data.at[0, f'T2_P{idx}_Agent_Exp'] = stats['Exp']
92
+
93
  t2_general_wrs.append(stats['General_WR'])
94
 
95
  # D. Hitung WR Diff
 
98
  t2_avg = np.mean(t2_general_wrs)
99
  input_data.at[0, 'WR_Diff'] = t1_avg - t2_avg
100
 
101
+ # E. One-Hot Encoding Manual
102
  # Map
103
  map_col = f'MAP_{map_name}'
104
  if map_col in training_columns:
105
  input_data.at[0, map_col] = 1
106
 
107
+ # Start Side
108
  if 'T1_StartSide_Defense' in training_columns:
109
  input_data.at[0, 'T1_StartSide_Defense'] = 1 if t1_side == 'Defense' else 0
110
+ if 'T2_StartSide_Defense' in training_columns:
111
  input_data.at[0, 'T2_StartSide_Defense'] = 1 if t1_side == 'Attack' else 0
112
 
113
+ # Agent OHE (Slot Based)
114
+ # T1 Agents
 
 
 
 
115
  for i, (_, agent) in enumerate(t1_inputs):
116
  col_name = f'T1_P{i+1}_Agent_{agent}'
117
  if col_name in training_columns:
118
  input_data.at[0, col_name] = 1
119
 
120
+ # T2 Agents
121
  for i, (_, agent) in enumerate(t2_inputs):
122
  col_name = f'T2_P{i+1}_Agent_{agent}'
123
  if col_name in training_columns:
124
  input_data.at[0, col_name] = 1
125
 
126
+ # ==============================================================================
127
+ # --- BAGIAN DEBUGGING YANG DITAMBAHKAN ---
128
+ # Log ini akan muncul di Terminal / Logs Hugging Face, bukan di UI
129
+ print("\n" + "="*40)
130
+ print(f"πŸ” DEBUGGING PREDICTION INPUT")
131
+ print(f"Map: {map_name} | T1 Side: {t1_side}")
132
+ print("-" * 40)
133
+
134
+ print("πŸ”΅ TIM 1 STATS:")
135
+ for i, (p, a) in enumerate(t1_inputs):
136
+ # Ambil nilai yang sudah masuk ke input_data
137
+ wr = input_data.at[0, f'T1_P{i+1}_Agent_WR']
138
+ gen_wr = input_data.at[0, f'T1_P{i+1}_General_WR']
139
+ exp = input_data.at[0, f'T1_P{i+1}_Agent_Exp']
140
+
141
+ status = "βœ… FOUND" if wr != 0.5 or gen_wr != 0.5 else "❌ NOT FOUND (Using Default)"
142
+ print(f" P{i+1}: {p:<15} ({a:<8}) | WR: {wr:.2f} | GenWR: {gen_wr:.2f} | Exp: {exp:<3} -> {status}")
143
+
144
+ print("-" * 40)
145
+ print("πŸ”΄ TIM 2 STATS:")
146
+ for i, (p, a) in enumerate(t2_inputs):
147
+ wr = input_data.at[0, f'T2_P{i+1}_Agent_WR']
148
+ gen_wr = input_data.at[0, f'T2_P{i+1}_General_WR']
149
+ exp = input_data.at[0, f'T2_P{i+1}_Agent_Exp']
150
+
151
+ status = "βœ… FOUND" if wr != 0.5 or gen_wr != 0.5 else "❌ NOT FOUND (Using Default)"
152
+ print(f" P{i+1}: {p:<15} ({a:<8}) | WR: {wr:.2f} | GenWR: {gen_wr:.2f} | Exp: {exp:<3} -> {status}")
153
+
154
+ if 'WR_Diff' in training_columns:
155
+ print("-" * 40)
156
+ print(f"πŸ“Š Final WR_Diff (T1 - T2): {input_data.at[0, 'WR_Diff']:.4f}")
157
+ if input_data.at[0, 'WR_Diff'] > 0:
158
+ print(" -> Tim 1 Secara Statistik Lebih Unggul.")
159
+ elif input_data.at[0, 'WR_Diff'] < 0:
160
+ print(" -> Tim 2 Secara Statistik Lebih Unggul.")
161
+ else:
162
+ print(" -> Kekuatan Statistik Seimbang (Netral).")
163
+
164
+ print("="*40 + "\n")
165
+ # ==============================================================================
166
+
167
  # --- 3. PREDIKSI ---
 
168
  input_data = input_data.astype(float)
169
 
170
+ try:
171
+ prob = model.predict_proba(input_data)[0]
172
+ win_prob_t1 = prob[1]
173
+
174
+ if win_prob_t1 > 0.5:
175
+ winner = "πŸ”΅ TEAM 1 WINS"
176
+ confidence = win_prob_t1
177
+ color = "blue"
178
+ else:
179
+ winner = "πŸ”΄ TEAM 2 WINS"
180
+ confidence = 1 - win_prob_t1
181
+ color = "red"
182
+
183
+ # Format Output Debugging ke UI juga (Optional)
184
+ debug_msg = "βœ… Data found for players."
185
+ # Cek jika banyak player not found (WR_Diff 0)
186
+ if 'WR_Diff' in input_data and input_data.at[0, 'WR_Diff'] == 0:
187
+ debug_msg = "⚠️ WARNING: Player stats not found (WR_Diff = 0). Check spelling!"
188
+
189
+ return f"{winner}\nConfidence: {confidence:.1%}\n({debug_msg})"
190
+
191
+ except Exception as e:
192
+ return f"Error during prediction: {str(e)}"
193
 
194
  # --- 3. UI GRADIO ---
195
  with gr.Blocks(title="Valorant Match Predictor") as demo:
 
205
  # Team 1 Inputs
206
  with gr.Column():
207
  gr.Markdown("### πŸ”΅ Team 1 Roster")
208
+ t1_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. f0rsakeN")
209
  t1_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
210
+ t1_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. mindfreak")
 
211
  t1_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
 
212
  t1_p3_n = gr.Textbox(label="P3 Name")
213
  t1_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
 
214
  t1_p4_n = gr.Textbox(label="P4 Name")
215
  t1_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
 
216
  t1_p5_n = gr.Textbox(label="P5 Name")
217
  t1_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
218
 
219
  # Team 2 Inputs
220
  with gr.Column():
221
  gr.Markdown("### πŸ”΄ Team 2 Roster")
222
+ t2_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. Tenz")
223
  t2_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
224
+ t2_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. Zekken")
 
225
  t2_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
 
226
  t2_p3_n = gr.Textbox(label="P3 Name")
227
  t2_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
 
228
  t2_p4_n = gr.Textbox(label="P4 Name")
229
  t2_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
 
230
  t2_p5_n = gr.Textbox(label="P5 Name")
231
  t2_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
232