UmarAF commited on
Commit
8c240d4
·
verified ·
1 Parent(s): c3b0934
app.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ 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']
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,
25
+ t1_p1_name, t1_p1_agent, t1_p2_name, t1_p2_agent,
26
+ t1_p3_name, t1_p3_agent, t1_p4_name, t1_p4_agent, t1_p5_name, t1_p5_agent,
27
+ t2_p1_name, t2_p1_agent, t2_p2_name, t2_p2_agent,
28
+ t2_p3_name, t2_p3_agent, t2_p4_name, t2_p4_agent, t2_p5_name, t2_p5_agent):
29
+
30
+ # A. Buat DataFrame Input Kosong
31
+ input_data = pd.DataFrame(columns=training_columns)
32
+ input_data.loc[0] = 0 # Isi baris pertama dengan 0 semua
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:
59
+ input_data.at[0, f'T1_P{idx}_General_WR'] = stats['General_WR']
60
+ if f'T1_P{idx}_Agent_Exp' in training_columns:
61
+ input_data.at[0, f'T1_P{idx}_Agent_Exp'] = stats['Exp']
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)
69
+ ]
70
+ t2_general_wrs = []
71
+
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
84
+ if 'WR_Diff' in training_columns:
85
+ t1_avg = np.mean(t1_general_wrs)
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
+ # Agent OHE
102
+ # T1 Agents
103
+ for _, agent in t1_inputs:
104
+ # Jika pakai logika "T1_P1_Agent_Jett" (Slot Based)
105
+ # Atau "T1_Has_Jett" (Aggregated Based) - Sesuaikan dengan model terakhir Anda!
106
+
107
+ # Asumsi: Masih pakai Slot Based (sesuai kode terakhir di chat)
108
+ # Kita loop kolom training untuk mencocokkan
109
+ pass
110
+
111
+ # Karena OHE manual agak ribet mencocokkan nama kolom tepatnya,
112
+ # kita gunakan cara pintar: Loop semua input agent, cari kolom yang sesuai di training_columns
113
+
114
+ # Set 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
+ # Set 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
+ # --- 3. PREDIKSI ---
127
+ # Convert ke float agar aman
128
+ input_data = input_data.astype(float)
129
+
130
+ prob = model.predict_proba(input_data)[0]
131
+ win_prob_t1 = prob[1] # Probabilitas kelas 1 (T1 Win)
132
+
133
+ winner = "TEAM 1" if win_prob_t1 > 0.5 else "TEAM 2"
134
+ confidence = win_prob_t1 if win_prob_t1 > 0.5 else 1 - win_prob_t1
135
+
136
+ return f"{winner} WIN ({confidence:.1%} Confidence)"
137
+
138
+ # --- 3. UI GRADIO ---
139
+ with gr.Blocks(title="Valorant Match Predictor") as demo:
140
+ gr.Markdown("# 🔮 Valorant AI Predictor (Skenario 4)")
141
+ gr.Markdown("Prediksi pemenang berdasarkan sejarah performa player dan komposisi agent.")
142
+
143
+ with gr.Row():
144
+ with gr.Column():
145
+ map_input = gr.Dropdown(MAP_LIST, label="Select Map")
146
+ side_input = gr.Radio(["Attack", "Defense"], label="Team 1 Start Side", value="Attack")
147
+
148
+ with gr.Row():
149
+ # Team 1 Inputs
150
+ with gr.Column():
151
+ gr.Markdown("### 🔵 Team 1 Roster")
152
+ t1_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. f0rsakeN")
153
+ t1_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
154
+
155
+ t1_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. mindfreak")
156
+ t1_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
157
+
158
+ t1_p3_n = gr.Textbox(label="P3 Name")
159
+ t1_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
160
+
161
+ t1_p4_n = gr.Textbox(label="P4 Name")
162
+ t1_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
163
+
164
+ t1_p5_n = gr.Textbox(label="P5 Name")
165
+ t1_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
166
+
167
+ # Team 2 Inputs
168
+ with gr.Column():
169
+ gr.Markdown("### 🔴 Team 2 Roster")
170
+ t2_p1_n = gr.Textbox(label="P1 Name", placeholder="e.g. Tenz")
171
+ t2_p1_a = gr.Dropdown(AGENT_LIST, label="P1 Agent")
172
+
173
+ t2_p2_n = gr.Textbox(label="P2 Name", placeholder="e.g. Zekken")
174
+ t2_p2_a = gr.Dropdown(AGENT_LIST, label="P2 Agent")
175
+
176
+ t2_p3_n = gr.Textbox(label="P3 Name")
177
+ t2_p3_a = gr.Dropdown(AGENT_LIST, label="P3 Agent")
178
+
179
+ t2_p4_n = gr.Textbox(label="P4 Name")
180
+ t2_p4_a = gr.Dropdown(AGENT_LIST, label="P4 Agent")
181
+
182
+ t2_p5_n = gr.Textbox(label="P5 Name")
183
+ t2_p5_a = gr.Dropdown(AGENT_LIST, label="P5 Agent")
184
+
185
+ btn = gr.Button("🚀 PREDICT WINNER", variant="primary")
186
+ output = gr.Label(label="Prediction Result")
187
+
188
+ # Connect Button
189
+ btn.click(
190
+ fn=predict_match,
191
+ inputs=[
192
+ map_input, side_input,
193
+ t1_p1_n, t1_p1_a, t1_p2_n, t1_p2_a, t1_p3_n, t1_p3_a, t1_p4_n, t1_p4_a, t1_p5_n, t1_p5_a,
194
+ t2_p1_n, t2_p1_a, t2_p2_n, t2_p2_a, t2_p3_n, t2_p3_a, t2_p4_n, t2_p4_a, t2_p5_n, t2_p5_a
195
+ ],
196
+ outputs=output
197
+ )
198
+
199
+ demo.launch()
player_knowledge_base.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce5ba5393c4c113c8bb0db130ed399bb13ae35fd0b6bcd1016f0b6e0d4b84c65
3
+ size 2173681
training_columns.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56c542d7d9ff130f501a64e53f9f6297ea8a296bfe93f96776739518d5b19fdf
3
+ size 6120
xgboost_valorant_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b0bb94f3bb8e18c6f9e31ddd398863cc02775c2b4152ff9b5590f436e287facc
3
+ size 6088068