tejani commited on
Commit
dd5925f
·
verified ·
1 Parent(s): 165b26a

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +160 -0
  2. requirements.txt +1 -0
app.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+ from sklearn.model_selection import train_test_split, GridSearchCV
4
+ from xgboost import XGBClassifier
5
+ from sklearn.metrics import accuracy_score, classification_report
6
+ from sklearn.preprocessing import StandardScaler
7
+ from imblearn.over_sampling import SMOTE
8
+ import gradio as gr
9
+ import io
10
+ import warnings
11
+ warnings.filterwarnings('ignore')
12
+
13
+ # Function to load and preprocess data
14
+ def load_and_preprocess_data(file_path):
15
+ try:
16
+ data = pd.read_csv(file_path)
17
+
18
+ # Convert suits and ranks to numerical values
19
+ suit_order = {'spades': 0, 'hearts': 1, 'clubs': 2, 'diamonds': 3}
20
+ rank_order = {'ace': 0, '2': 1, '3': 2, '4': 3, '5': 4, '6': 5, '7': 6, '8': 7, '9': 8, '10': 9,
21
+ 'jack': 10, 'queen': 11, 'king': 12}
22
+
23
+ data['Dragon Suit Num'] = data['Dragon Suit'].map(suit_order)
24
+ data['Dragon Rank Num'] = data['Dragon Rank'].map(rank_order)
25
+ data['Tiger Suit Num'] = data['Tiger Suit'].map(suit_order)
26
+ data['Tiger Rank Num'] = data['Tiger Rank'].map(rank_order)
27
+ data['Lion Suit Num'] = data['Lion Suit'].map(suit_order)
28
+ data['Lion Rank Num'] = data['Lion Rank'].map(rank_order)
29
+
30
+ return data
31
+ except Exception as e:
32
+ return f"Error loading data: {str(e)}"
33
+
34
+ # Feature engineering
35
+ def create_features(data, n_games=3):
36
+ features = []
37
+ for i in range(n_games, len(data)):
38
+ game_features = []
39
+ for j in range(1, n_games + 1):
40
+ game_features.extend([
41
+ data['Dragon Suit Num'].iloc[i - j],
42
+ data['Dragon Rank Num'].iloc[i - j],
43
+ data['Tiger Suit Num'].iloc[i - j],
44
+ data['Tiger Rank Num'].iloc[i - j],
45
+ data['Lion Suit Num'].iloc[i - j],
46
+ data['Lion Rank Num'].iloc[i - j]
47
+ ])
48
+ for j in range(1, n_games + 1):
49
+ game_features.extend([
50
+ data['Dragon Suit Num'].iloc[i - j] * data['Dragon Rank Num'].iloc[i - j],
51
+ data['Tiger Suit Num'].iloc[i - j] * data['Tiger Rank Num'].iloc[i - j],
52
+ data['Lion Suit Num'].iloc[i - j] * data['Lion Rank Num'].iloc[i - j]
53
+ ])
54
+ recent_games = data.iloc[i-n_games:i]
55
+ suit_freq = recent_games[['Dragon Suit Num', 'Tiger Suit Num', 'Lion Suit Num']].values.flatten()
56
+ rank_freq = recent_games[['Dragon Rank Num', 'Tiger Rank Num', 'Lion Rank Num']].values.flatten()
57
+ game_features.extend([
58
+ np.mean(suit_freq), np.std(suit_freq),
59
+ np.mean(rank_freq), np.std(rank_freq)
60
+ ])
61
+ features.append(game_features)
62
+
63
+ columns = ([f'{hand}_{attr}_t-{j}' for j in range(1, n_games + 1)
64
+ for hand in ['Dragon', 'Tiger', 'Lion'] for attr in ['Suit', 'Rank']] +
65
+ [f'{hand}_suit_rank_inter_t-{j}' for j in range(1, n_games + 1)
66
+ for hand in ['Dragon', 'Tiger', 'Lion']] +
67
+ ['suit_mean', 'suit_std', 'rank_mean', 'rank_std'])
68
+ return pd.DataFrame(features, columns=columns)
69
+
70
+ # Training function
71
+ def train_model(file_path, n_estimators, learning_rate, max_depth, subsample):
72
+ output = io.StringIO()
73
+
74
+ try:
75
+ # Load and preprocess data
76
+ data = load_and_preprocess_data(file_path)
77
+ if isinstance(data, str):
78
+ return data
79
+
80
+ # Create features
81
+ n_games = 3
82
+ features = create_features(data, n_games)
83
+ targets = {
84
+ 'dragon_suit': data['Dragon Suit Num'][n_games:],
85
+ 'dragon_rank': data['Dragon Rank Num'][n_games:],
86
+ 'tiger_suit': data['Tiger Suit Num'][n_games:],
87
+ 'tiger_rank': data['Tiger Rank Num'][n_games:],
88
+ 'lion_suit': data['Lion Suit Num'][n_games:],
89
+ 'lion_rank': data['Lion Rank Num'][n_games:]
90
+ }
91
+
92
+ # Scale features
93
+ scaler = StandardScaler()
94
+ features_scaled = scaler.fit_transform(features)
95
+ features_scaled = pd.DataFrame(features_scaled, columns=features.columns)
96
+
97
+ results = []
98
+ for target_name, target in targets.items():
99
+ # Split data
100
+ X_train, X_test, y_train, y_test = train_test_split(
101
+ features_scaled, target, test_size=0.2, random_state=42
102
+ )
103
+
104
+ # Apply SMOTE
105
+ smote = SMOTE(random_state=42)
106
+ X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
107
+
108
+ # Train model
109
+ model = XGBClassifier(
110
+ random_state=42,
111
+ eval_metric='mlogloss',
112
+ n_estimators=int(n_estimators),
113
+ learning_rate=float(learning_rate),
114
+ max_depth=int(max_depth),
115
+ subsample=float(subsample)
116
+ )
117
+
118
+ model.fit(
119
+ X_train_res,
120
+ y_train_res,
121
+ eval_set=[(X_test, y_test)],
122
+ early_stopping_rounds=10,
123
+ verbose=False
124
+ )
125
+
126
+ # Evaluate
127
+ y_pred = model.predict(X_test)
128
+ accuracy = accuracy_score(y_test, y_pred)
129
+ report = classification_report(y_test, y_pred, zero_division=0)
130
+
131
+ results.append(f"**{target_name} Results**\n")
132
+ results.append(f"Accuracy: {accuracy:.2f}\n")
133
+ results.append(f"Classification Report:\n{report}\n")
134
+
135
+ return "\n".join(results)
136
+
137
+ except Exception as e:
138
+ return f"Error during training: {str(e)}"
139
+
140
+ # Gradio interface
141
+ with gr.Blocks() as demo:
142
+ gr.Markdown("# Card Game Prediction Model Training")
143
+ gr.Markdown("Upload the training dataset and configure hyperparameters to train the model.")
144
+
145
+ file_input = gr.File(label="Upload TRAINING_CARD_DATA.csv")
146
+ n_estimators = gr.Slider(50, 300, value=100, step=10, label="Number of Estimators")
147
+ learning_rate = gr.Slider(0.01, 0.3, value=0.1, step=0.01, label="Learning Rate")
148
+ max_depth = gr.Slider(3, 10, value=5, step=1, label="Max Depth")
149
+ subsample = gr.Slider(0.5, 1.0, value=0.8, step=0.1, label="Subsample")
150
+
151
+ train_button = gr.Button("Train Model")
152
+ output = gr.Textbox(label="Training Results")
153
+
154
+ train_button.click(
155
+ fn=train_model,
156
+ inputs=[file_input, n_estimators, learning_rate, max_depth, subsample],
157
+ outputs=output
158
+ )
159
+
160
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pandas numpy scikit-learn xgboost imbalanced-learn gradio