UmarAF commited on
Commit
447fb82
·
verified ·
1 Parent(s): af99cab

Update app.py

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