TravisBoltz commited on
Commit
b4263ca
·
verified ·
1 Parent(s): 0642d7e

Upload 62 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .env +1 -0
  2. .gitattributes +3 -0
  3. .gitignore +1 -0
  4. Analysis.md +310 -0
  5. Procfile +1 -0
  6. api/__pycache__/main.cpython-312.pyc +0 -0
  7. api/main.py +62 -0
  8. api/package-lock.json +946 -0
  9. api/package.json +7 -0
  10. app.py +124 -0
  11. checkpoints/best_model.pth +3 -0
  12. checkpoints/best_model_cv.pth +3 -0
  13. checkpoints/latest_checkpoint.pt +3 -0
  14. config/model_config.json +18 -0
  15. data/cleaned_modv2.csv +0 -0
  16. data/data_encoders.pt +3 -0
  17. data/dataset.csv +3 -0
  18. data/engineered_data.csv +0 -0
  19. data/music_data.csv +0 -0
  20. data/name_gender.csv +0 -0
  21. data/o2_data.csv +3 -0
  22. data/test_data.csv +0 -0
  23. data/train_data.csv +3 -0
  24. data_utils.py +115 -0
  25. encoder_utils.py +56 -0
  26. evaluate_model.py +497 -0
  27. generate_recommendations.py +312 -0
  28. metrics/evaluation_results.json +67 -0
  29. metrics/training_metrics_20250102_064900.json +290 -0
  30. metrics/training_metrics_20250102_200715.json +200 -0
  31. metrics/training_metrics_20250102_203004.json +191 -0
  32. metrics/training_metrics_20250102_210550.json +200 -0
  33. metrics/training_metrics_20250103_030301.json +56 -0
  34. metrics/training_metrics_20250103_030828.json +200 -0
  35. metrics/training_metrics_20250103_033513.json +200 -0
  36. metrics/training_metrics_20250103_043332.json +200 -0
  37. metrics/training_metrics_20250103_044652.json +200 -0
  38. metrics/training_metrics_20250103_092757.json +200 -0
  39. metrics/training_metrics_20250103_165619.json +65 -0
  40. metrics/training_metrics_20250104_000005.json +83 -0
  41. metrics/training_metrics_20250104_002329.json +65 -0
  42. metrics/training_metrics_20250104_003816.json +101 -0
  43. metrics/training_metrics_20250104_010732.json +83 -0
  44. metrics/training_metrics_20250104_011443.json +128 -0
  45. metrics/training_metrics_20250104_012344.json +173 -0
  46. metrics/training_metrics_20250104_021315.json +74 -0
  47. metrics/training_metrics_20250104_021913.json +92 -0
  48. metrics/training_metrics_20250104_024710.json +128 -0
  49. metrics/training_metrics_20250104_030507.json +47 -0
  50. metrics/training_metrics_20250104_030726.json +65 -0
.env ADDED
@@ -0,0 +1 @@
 
 
1
+ ALLOWED_ORIGINS=https://lhydra.com,http://localhost:3000
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ data/dataset.csv filter=lfs diff=lfs merge=lfs -text
37
+ data/o2_data.csv filter=lfs diff=lfs merge=lfs -text
38
+ data/train_data.csv filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .env
Analysis.md ADDED
@@ -0,0 +1,310 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hybrid Music Recommendation System Analysis
2
+
3
+ ## Table of Contents
4
+ 1. [Overview](#overview)
5
+ 2. [Data Engineering](#data-engineering)
6
+ 3. [Model Architecture](#model-architecture)
7
+ 4. [Training Methodology](#training-methodology)
8
+ 5. [Evaluation Metrics](#evaluation-metrics)
9
+ 6. [Recommendation Generation](#recommendation-generation)
10
+ 7. [Performance Analysis](#performance-analysis)
11
+
12
+ ## Overview
13
+
14
+ This project implements a sophisticated hybrid music recommendation system that combines collaborative filtering with content-based features. The system leverages deep learning techniques to provide personalized music recommendations based on user listening history, music metadata, and acoustic features.
15
+
16
+ ### Key Features
17
+ - Hybrid neural network architecture
18
+ - Multi-modal feature processing
19
+ - Cold-start handling
20
+ - Scalable recommendation generation
21
+ - Comprehensive evaluation metrics
22
+
23
+ ## Data Engineering
24
+
25
+ ### Data Preprocessing
26
+ The system employs several sophisticated data preprocessing techniques:
27
+
28
+ ```python
29
+ # Example of feature normalization
30
+ numerical_features = [
31
+ 'danceability', 'energy', 'loudness', 'speechiness',
32
+ 'acousticness', 'instrumentalness', 'liveness', 'valence', 'tempo'
33
+ ]
34
+ scaler = StandardScaler()
35
+ df[numerical_features] = scaler.fit_transform(df[numerical_features])
36
+ ```
37
+
38
+ ### Feature Engineering
39
+ 1. **Categorical Encoding**
40
+ - User IDs → Dense embeddings
41
+ - Music IDs → Dense embeddings
42
+ - Artist IDs → Dense embeddings
43
+ - Genres → Multi-hot encoding
44
+
45
+ 2. **Numerical Features**
46
+ - Audio features normalization
47
+ - Temporal feature extraction
48
+ - Interaction strength calculation
49
+
50
+ 3. **Text Processing**
51
+ - Genre tokenization
52
+ - Artist name normalization
53
+ - Music title cleaning
54
+
55
+ ## Model Architecture
56
+
57
+ The `HybridMusicRecommender` class is a sophisticated neural network model designed to handle various types of input features. Here's a breakdown of its architecture:
58
+
59
+ 1. **Embedding Layers**: These layers transform categorical variables into dense vector representations. The model includes embeddings for users, music tracks, artists, and genres. This allows the model to capture latent features from these categories.
60
+
61
+ ```python
62
+ self.user_embedding = nn.Embedding(num_users, embedding_dim)
63
+ self.music_embedding = nn.Embedding(num_music, embedding_dim)
64
+ self.artist_embedding = nn.Embedding(num_artists, embedding_dim)
65
+ self.genre_embedding = nn.Embedding(num_genres, embedding_dim)
66
+ ```
67
+
68
+ 2. **Feature Processing Layers**: Numerical and binary features are processed through separate layers, which include linear transformations followed by ReLU activations and batch normalization. This helps in stabilizing the learning process and improving convergence.
69
+
70
+ ```python
71
+ self.numerical_layer = nn.Sequential(
72
+ nn.Linear(num_numerical, embedding_dim),
73
+ nn.ReLU(),
74
+ nn.BatchNorm1d(embedding_dim)
75
+ )
76
+ self.binary_layer = nn.Sequential(
77
+ nn.Linear(2, embedding_dim),
78
+ nn.ReLU(),
79
+ nn.BatchNorm1d(embedding_dim)
80
+ )
81
+ ```
82
+
83
+ 3. **MLP Layers with Residual Connections**: The model employs multiple fully connected layers with residual connections, which help in training deeper networks by mitigating the vanishing gradient problem.
84
+
85
+ ```python
86
+ for layer_size in layers:
87
+ self.fc_layers.append(nn.ModuleDict({
88
+ 'main': nn.Sequential(
89
+ nn.Linear(input_dim, layer_size),
90
+ nn.ReLU(),
91
+ nn.BatchNorm1d(layer_size),
92
+ nn.Dropout(dropout)
93
+ ),
94
+ 'residual': nn.Linear(input_dim, layer_size) if input_dim != layer_size else None
95
+ }))
96
+ ```
97
+
98
+ 4. **Final Layer**: The output layer is a single neuron that predicts the target variable, which in this case is the play count of a music track.
99
+
100
+ ```python
101
+ self.final_layer = nn.Linear(layers[-1], 1)
102
+ ```
103
+
104
+ ## Training Methodology
105
+
106
+ ### Training Configuration
107
+ ```python
108
+ config = {
109
+ 'embedding_dim': 64,
110
+ 'hidden_layers': [256, 128, 64],
111
+ 'dropout': 0.2,
112
+ 'learning_rate': 0.001,
113
+ 'weight_decay': 1e-5,
114
+ 'batch_size': 256,
115
+ 'early_stopping_patience': 10,
116
+ 'max_grad_norm': 1.0
117
+ }
118
+ ```
119
+
120
+ ### Training Process
121
+ 1. **Optimizer and Scheduler**
122
+ ```python
123
+ # Adam optimizer with weight decay
124
+ optimizer = optim.Adam(
125
+ model.parameters(),
126
+ lr=config['learning_rate'],
127
+ weight_decay=config['weight_decay']
128
+ )
129
+
130
+ # Learning rate scheduler
131
+ scheduler = optim.lr_scheduler.ReduceLROnPlateau(
132
+ optimizer, mode='min', patience=5, factor=0.5
133
+ )
134
+ ```
135
+
136
+ 2. **Training Loop**
137
+ ```python
138
+ def train_epoch(self):
139
+ self.model.train()
140
+ total_loss = 0
141
+ predictions, targets = [], []
142
+
143
+ for batch in self.train_loader:
144
+ # Move batch to device
145
+ batch = {k: v.to(self.device) for k, v in batch.items()}
146
+
147
+ # Forward pass
148
+ pred = self.model(batch)
149
+ loss = self.criterion(pred, batch['plays'])
150
+
151
+ # Backward pass
152
+ self.optimizer.zero_grad()
153
+ loss.backward()
154
+ torch.nn.utils.clip_grad_norm_(self.model.parameters(),
155
+ self.max_grad_norm)
156
+ self.optimizer.step()
157
+ ```
158
+
159
+ ## Evaluation Metrics
160
+
161
+ ### Metrics Calculation
162
+ ```python
163
+ def calculate_metrics(self, predictions: torch.Tensor, targets: torch.Tensor):
164
+ predictions = predictions.cpu().numpy()
165
+ targets = targets.cpu().numpy()
166
+
167
+ return {
168
+ 'rmse': np.sqrt(mean_squared_error(targets, predictions)),
169
+ 'mae': mean_absolute_error(targets, predictions),
170
+ 'ndcg': calculate_ndcg(predictions, targets)
171
+ }
172
+ ```
173
+
174
+ ### Performance Analysis
175
+ 1. **Basic Metrics**
176
+ - RMSE (Root Mean Square Error)
177
+ - MAE (Mean Absolute Error)
178
+ - NDCG (Normalized Discounted Cumulative Gain)
179
+
180
+ 2. **Advanced Analysis**
181
+ ```python
182
+ def analyze_cold_start(self, user_interactions):
183
+ # Analyze performance for different user interaction levels
184
+ cold_start = user_interactions < 5
185
+ warm_start = user_interactions >= 5
186
+
187
+ metrics = {
188
+ 'cold_start': calculate_metrics(predictions[cold_start],
189
+ targets[cold_start]),
190
+ 'warm_start': calculate_metrics(predictions[warm_start],
191
+ targets[warm_start])
192
+ }
193
+ ```
194
+
195
+ ## Data Handling and Preprocessing
196
+
197
+ - **Data Splitting and Encoding**: The use of consistent encoding across train and test datasets ensures that the model is trained and evaluated on uniformly processed data, reducing the risk of data leakage or inconsistencies.
198
+
199
+ ## Model Training and Optimization
200
+
201
+ - **Gradient Clipping and Early Stopping**: These techniques are employed to prevent overfitting and ensure stable training. Gradient clipping helps in managing exploding gradients, while early stopping halts training when the model's performance on the validation set stops improving.
202
+
203
+ ## Model Evaluation and Analysis
204
+
205
+ - **Cold Start Analysis**: Evaluating model performance on new users or items helps in understanding and mitigating the cold start problem, which is a common challenge in recommendation systems.
206
+
207
+ ## Recommendation Generation
208
+
209
+ ### Generation Process
210
+ ```python
211
+ def generate_recommendations(self, user_id, n_recommendations=10):
212
+ # Prepare user input
213
+ user_tensor = torch.tensor([user_id], device=self.device)
214
+ user_embed = self.user_embedding(user_tensor)
215
+
216
+ # Generate scores for all items
217
+ all_items = torch.arange(self.num_items, device=self.device)
218
+ scores = self.forward_recommendation(user_embed, all_items)
219
+
220
+ # Get top-K recommendations
221
+ top_k_scores, top_k_items = torch.topk(scores, k=n_recommendations)
222
+ return top_k_items.cpu().numpy(), top_k_scores.cpu().numpy()
223
+ ```
224
+
225
+ ### Post-processing
226
+ 1. **Diversity Enhancement**
227
+ ```python
228
+ def enhance_diversity(recommendations, similarity_matrix,
229
+ lambda_div=0.5):
230
+ scores = recommendations['scores']
231
+ items = recommendations['items']
232
+
233
+ # Calculate diversity penalty
234
+ diversity_penalty = calculate_diversity_penalty(
235
+ items, similarity_matrix
236
+ )
237
+
238
+ # Adjust scores
239
+ final_scores = scores - lambda_div * diversity_penalty
240
+ ```
241
+
242
+ 2. **Business Rules**
243
+ - Explicit content filtering
244
+ - Genre balancing
245
+ - Popularity consideration
246
+
247
+ ## Recommendation Post-processing
248
+
249
+ - **Diversity and Business Rules**: Enhancing recommendation diversity and applying business rules (e.g., explicit content filtering, genre balancing) ensure that the recommendations are not only accurate but also aligned with user preferences and business goals.
250
+
251
+ ## Performance Analysis
252
+
253
+ ### Model Performance
254
+ 1. **Overall Metrics**
255
+ - RMSE: ~0.15-0.20
256
+ - MAE: ~0.12-0.15
257
+ - R²: ~0.65-0.70
258
+
259
+ 2. **Cold Start Performance**
260
+ - New User RMSE: ~0.25-0.30
261
+ - New Item RMSE: ~0.28-0.33
262
+
263
+ ### Visualization
264
+ The system includes comprehensive visualization tools for:
265
+ - Training progress monitoring
266
+ - Error distribution analysis
267
+ - Prediction bias visualization
268
+ - Performance metric tracking
269
+
270
+ ```python
271
+ def plot_prediction_analysis(self, metrics):
272
+ """
273
+ Creates a comprehensive prediction analysis plot with:
274
+ - Scatter plot with density
275
+ - Error distribution
276
+ - Q-Q plot
277
+ - Residuals analysis
278
+ """
279
+ fig = plt.figure(figsize=(15, 10))
280
+ gs = GridSpec(2, 2, figure=fig)
281
+ # ... plotting code ...
282
+ ```
283
+
284
+ ### System Requirements
285
+ - Python 3.9+
286
+ - PyTorch 1.9+
287
+ - CUDA support (optional)
288
+ - 16GB+ RAM for training
289
+ - GPU with 8GB+ VRAM (recommended)
290
+
291
+ ## Future Improvements
292
+
293
+ 1. **Model Enhancements**
294
+ - Attention mechanisms
295
+ - Sequential modeling
296
+ - Multi-task learning
297
+
298
+ 2. **Feature Engineering**
299
+ - Advanced audio feature extraction
300
+ - Temporal pattern analysis
301
+ - Social network integration
302
+
303
+ 3. **System Optimization**
304
+ - Batch inference optimization
305
+ - Model quantization
306
+ - Caching strategies
307
+
308
+ ---
309
+
310
+ This analysis provides a comprehensive overview of the hybrid music recommendation system's technical implementation. For specific implementation details, refer to the corresponding source code files in the repository.
Procfile ADDED
@@ -0,0 +1 @@
 
 
1
+ web: python app.py
api/__pycache__/main.cpython-312.pyc ADDED
Binary file (2.54 kB). View file
 
api/main.py ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from pydantic import BaseModel
4
+ import pandas as pd
5
+ from generate_recommendations import RecommendationGenerator
6
+ import torch
7
+
8
+ app = FastAPI()
9
+
10
+ # CORS middleware configuration
11
+ app.add_middleware(
12
+ CORSMiddleware,
13
+ allow_origins=[
14
+ "http://localhost:3000",
15
+ "http://127.0.0.1:3000",
16
+ # Add your Windows IP if needed
17
+ "http://192.168.1.x:3000" # Replace x with your actual IP
18
+ ],
19
+ allow_credentials=True,
20
+ allow_methods=["*"],
21
+ allow_headers=["*"],
22
+ )
23
+
24
+ # Load model and data once when starting the server
25
+ try:
26
+ model_path = '../checkpoints/best_model.pth'
27
+ catalog_data = pd.read_csv('../../data/o2_data.csv')
28
+ recommender = RecommendationGenerator(model_path, catalog_data)
29
+ except Exception as e:
30
+ print(f"Error loading model: {str(e)}")
31
+ raise
32
+
33
+ class UserInput(BaseModel):
34
+ user_id: str
35
+ age: int
36
+ gender: str
37
+ genre: str
38
+ music: str
39
+
40
+ @app.post("/recommendations/")
41
+ async def get_recommendations(user_input: UserInput):
42
+ try:
43
+ user_info = {
44
+ 'user_id': user_input.user_id,
45
+ 'age': user_input.age,
46
+ 'gender': user_input.gender,
47
+ 'genre': user_input.genre,
48
+ 'music': user_input.music
49
+ }
50
+
51
+ recommendations = recommender.generate_recommendations(user_info, n_recommendations=10)
52
+
53
+ return {
54
+ "status": "success",
55
+ "recommendations": recommendations.to_dict(orient='records')
56
+ }
57
+ except Exception as e:
58
+ raise HTTPException(status_code=500, detail=str(e))
59
+
60
+ @app.get("/health")
61
+ async def health_check():
62
+ return {"status": "healthy"}
api/package-lock.json ADDED
@@ -0,0 +1,946 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "api",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "@emotion/react": "^11.14.0",
9
+ "@emotion/styled": "^11.14.0",
10
+ "@mui/material": "^6.3.1"
11
+ }
12
+ },
13
+ "node_modules/@babel/code-frame": {
14
+ "version": "7.26.2",
15
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
16
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
17
+ "dependencies": {
18
+ "@babel/helper-validator-identifier": "^7.25.9",
19
+ "js-tokens": "^4.0.0",
20
+ "picocolors": "^1.0.0"
21
+ },
22
+ "engines": {
23
+ "node": ">=6.9.0"
24
+ }
25
+ },
26
+ "node_modules/@babel/generator": {
27
+ "version": "7.26.3",
28
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
29
+ "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
30
+ "dependencies": {
31
+ "@babel/parser": "^7.26.3",
32
+ "@babel/types": "^7.26.3",
33
+ "@jridgewell/gen-mapping": "^0.3.5",
34
+ "@jridgewell/trace-mapping": "^0.3.25",
35
+ "jsesc": "^3.0.2"
36
+ },
37
+ "engines": {
38
+ "node": ">=6.9.0"
39
+ }
40
+ },
41
+ "node_modules/@babel/helper-module-imports": {
42
+ "version": "7.25.9",
43
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
44
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
45
+ "dependencies": {
46
+ "@babel/traverse": "^7.25.9",
47
+ "@babel/types": "^7.25.9"
48
+ },
49
+ "engines": {
50
+ "node": ">=6.9.0"
51
+ }
52
+ },
53
+ "node_modules/@babel/helper-string-parser": {
54
+ "version": "7.25.9",
55
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
56
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
57
+ "engines": {
58
+ "node": ">=6.9.0"
59
+ }
60
+ },
61
+ "node_modules/@babel/helper-validator-identifier": {
62
+ "version": "7.25.9",
63
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
64
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
65
+ "engines": {
66
+ "node": ">=6.9.0"
67
+ }
68
+ },
69
+ "node_modules/@babel/parser": {
70
+ "version": "7.26.3",
71
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
72
+ "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
73
+ "dependencies": {
74
+ "@babel/types": "^7.26.3"
75
+ },
76
+ "bin": {
77
+ "parser": "bin/babel-parser.js"
78
+ },
79
+ "engines": {
80
+ "node": ">=6.0.0"
81
+ }
82
+ },
83
+ "node_modules/@babel/runtime": {
84
+ "version": "7.26.0",
85
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
86
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
87
+ "dependencies": {
88
+ "regenerator-runtime": "^0.14.0"
89
+ },
90
+ "engines": {
91
+ "node": ">=6.9.0"
92
+ }
93
+ },
94
+ "node_modules/@babel/template": {
95
+ "version": "7.25.9",
96
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
97
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
98
+ "dependencies": {
99
+ "@babel/code-frame": "^7.25.9",
100
+ "@babel/parser": "^7.25.9",
101
+ "@babel/types": "^7.25.9"
102
+ },
103
+ "engines": {
104
+ "node": ">=6.9.0"
105
+ }
106
+ },
107
+ "node_modules/@babel/traverse": {
108
+ "version": "7.26.4",
109
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
110
+ "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
111
+ "dependencies": {
112
+ "@babel/code-frame": "^7.26.2",
113
+ "@babel/generator": "^7.26.3",
114
+ "@babel/parser": "^7.26.3",
115
+ "@babel/template": "^7.25.9",
116
+ "@babel/types": "^7.26.3",
117
+ "debug": "^4.3.1",
118
+ "globals": "^11.1.0"
119
+ },
120
+ "engines": {
121
+ "node": ">=6.9.0"
122
+ }
123
+ },
124
+ "node_modules/@babel/types": {
125
+ "version": "7.26.3",
126
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
127
+ "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
128
+ "dependencies": {
129
+ "@babel/helper-string-parser": "^7.25.9",
130
+ "@babel/helper-validator-identifier": "^7.25.9"
131
+ },
132
+ "engines": {
133
+ "node": ">=6.9.0"
134
+ }
135
+ },
136
+ "node_modules/@emotion/babel-plugin": {
137
+ "version": "11.13.5",
138
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
139
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
140
+ "dependencies": {
141
+ "@babel/helper-module-imports": "^7.16.7",
142
+ "@babel/runtime": "^7.18.3",
143
+ "@emotion/hash": "^0.9.2",
144
+ "@emotion/memoize": "^0.9.0",
145
+ "@emotion/serialize": "^1.3.3",
146
+ "babel-plugin-macros": "^3.1.0",
147
+ "convert-source-map": "^1.5.0",
148
+ "escape-string-regexp": "^4.0.0",
149
+ "find-root": "^1.1.0",
150
+ "source-map": "^0.5.7",
151
+ "stylis": "4.2.0"
152
+ }
153
+ },
154
+ "node_modules/@emotion/cache": {
155
+ "version": "11.14.0",
156
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
157
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
158
+ "dependencies": {
159
+ "@emotion/memoize": "^0.9.0",
160
+ "@emotion/sheet": "^1.4.0",
161
+ "@emotion/utils": "^1.4.2",
162
+ "@emotion/weak-memoize": "^0.4.0",
163
+ "stylis": "4.2.0"
164
+ }
165
+ },
166
+ "node_modules/@emotion/hash": {
167
+ "version": "0.9.2",
168
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
169
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
170
+ },
171
+ "node_modules/@emotion/is-prop-valid": {
172
+ "version": "1.3.1",
173
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
174
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
175
+ "dependencies": {
176
+ "@emotion/memoize": "^0.9.0"
177
+ }
178
+ },
179
+ "node_modules/@emotion/memoize": {
180
+ "version": "0.9.0",
181
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
182
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
183
+ },
184
+ "node_modules/@emotion/react": {
185
+ "version": "11.14.0",
186
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
187
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
188
+ "dependencies": {
189
+ "@babel/runtime": "^7.18.3",
190
+ "@emotion/babel-plugin": "^11.13.5",
191
+ "@emotion/cache": "^11.14.0",
192
+ "@emotion/serialize": "^1.3.3",
193
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
194
+ "@emotion/utils": "^1.4.2",
195
+ "@emotion/weak-memoize": "^0.4.0",
196
+ "hoist-non-react-statics": "^3.3.1"
197
+ },
198
+ "peerDependencies": {
199
+ "react": ">=16.8.0"
200
+ },
201
+ "peerDependenciesMeta": {
202
+ "@types/react": {
203
+ "optional": true
204
+ }
205
+ }
206
+ },
207
+ "node_modules/@emotion/serialize": {
208
+ "version": "1.3.3",
209
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
210
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
211
+ "dependencies": {
212
+ "@emotion/hash": "^0.9.2",
213
+ "@emotion/memoize": "^0.9.0",
214
+ "@emotion/unitless": "^0.10.0",
215
+ "@emotion/utils": "^1.4.2",
216
+ "csstype": "^3.0.2"
217
+ }
218
+ },
219
+ "node_modules/@emotion/sheet": {
220
+ "version": "1.4.0",
221
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
222
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="
223
+ },
224
+ "node_modules/@emotion/styled": {
225
+ "version": "11.14.0",
226
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
227
+ "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
228
+ "dependencies": {
229
+ "@babel/runtime": "^7.18.3",
230
+ "@emotion/babel-plugin": "^11.13.5",
231
+ "@emotion/is-prop-valid": "^1.3.0",
232
+ "@emotion/serialize": "^1.3.3",
233
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
234
+ "@emotion/utils": "^1.4.2"
235
+ },
236
+ "peerDependencies": {
237
+ "@emotion/react": "^11.0.0-rc.0",
238
+ "react": ">=16.8.0"
239
+ },
240
+ "peerDependenciesMeta": {
241
+ "@types/react": {
242
+ "optional": true
243
+ }
244
+ }
245
+ },
246
+ "node_modules/@emotion/unitless": {
247
+ "version": "0.10.0",
248
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
249
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="
250
+ },
251
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
252
+ "version": "1.2.0",
253
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
254
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
255
+ "peerDependencies": {
256
+ "react": ">=16.8.0"
257
+ }
258
+ },
259
+ "node_modules/@emotion/utils": {
260
+ "version": "1.4.2",
261
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
262
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="
263
+ },
264
+ "node_modules/@emotion/weak-memoize": {
265
+ "version": "0.4.0",
266
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
267
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="
268
+ },
269
+ "node_modules/@jridgewell/gen-mapping": {
270
+ "version": "0.3.8",
271
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
272
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
273
+ "dependencies": {
274
+ "@jridgewell/set-array": "^1.2.1",
275
+ "@jridgewell/sourcemap-codec": "^1.4.10",
276
+ "@jridgewell/trace-mapping": "^0.3.24"
277
+ },
278
+ "engines": {
279
+ "node": ">=6.0.0"
280
+ }
281
+ },
282
+ "node_modules/@jridgewell/resolve-uri": {
283
+ "version": "3.1.2",
284
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
285
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
286
+ "engines": {
287
+ "node": ">=6.0.0"
288
+ }
289
+ },
290
+ "node_modules/@jridgewell/set-array": {
291
+ "version": "1.2.1",
292
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
293
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
294
+ "engines": {
295
+ "node": ">=6.0.0"
296
+ }
297
+ },
298
+ "node_modules/@jridgewell/sourcemap-codec": {
299
+ "version": "1.5.0",
300
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
301
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
302
+ },
303
+ "node_modules/@jridgewell/trace-mapping": {
304
+ "version": "0.3.25",
305
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
306
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
307
+ "dependencies": {
308
+ "@jridgewell/resolve-uri": "^3.1.0",
309
+ "@jridgewell/sourcemap-codec": "^1.4.14"
310
+ }
311
+ },
312
+ "node_modules/@mui/core-downloads-tracker": {
313
+ "version": "6.3.1",
314
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.3.1.tgz",
315
+ "integrity": "sha512-2OmnEyoHpj5//dJJpMuxOeLItCCHdf99pjMFfUFdBteCunAK9jW+PwEo4mtdGcLs7P+IgZ+85ypd52eY4AigoQ==",
316
+ "funding": {
317
+ "type": "opencollective",
318
+ "url": "https://opencollective.com/mui-org"
319
+ }
320
+ },
321
+ "node_modules/@mui/material": {
322
+ "version": "6.3.1",
323
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.3.1.tgz",
324
+ "integrity": "sha512-ynG9ayhxgCsHJ/dtDcT1v78/r2GwQyP3E0hPz3GdPRl0uFJz/uUTtI5KFYwadXmbC+Uv3bfB8laZ6+Cpzh03gA==",
325
+ "dependencies": {
326
+ "@babel/runtime": "^7.26.0",
327
+ "@mui/core-downloads-tracker": "^6.3.1",
328
+ "@mui/system": "^6.3.1",
329
+ "@mui/types": "^7.2.21",
330
+ "@mui/utils": "^6.3.1",
331
+ "@popperjs/core": "^2.11.8",
332
+ "@types/react-transition-group": "^4.4.12",
333
+ "clsx": "^2.1.1",
334
+ "csstype": "^3.1.3",
335
+ "prop-types": "^15.8.1",
336
+ "react-is": "^19.0.0",
337
+ "react-transition-group": "^4.4.5"
338
+ },
339
+ "engines": {
340
+ "node": ">=14.0.0"
341
+ },
342
+ "funding": {
343
+ "type": "opencollective",
344
+ "url": "https://opencollective.com/mui-org"
345
+ },
346
+ "peerDependencies": {
347
+ "@emotion/react": "^11.5.0",
348
+ "@emotion/styled": "^11.3.0",
349
+ "@mui/material-pigment-css": "^6.3.1",
350
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
351
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
352
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
353
+ },
354
+ "peerDependenciesMeta": {
355
+ "@emotion/react": {
356
+ "optional": true
357
+ },
358
+ "@emotion/styled": {
359
+ "optional": true
360
+ },
361
+ "@mui/material-pigment-css": {
362
+ "optional": true
363
+ },
364
+ "@types/react": {
365
+ "optional": true
366
+ }
367
+ }
368
+ },
369
+ "node_modules/@mui/private-theming": {
370
+ "version": "6.3.1",
371
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.3.1.tgz",
372
+ "integrity": "sha512-g0u7hIUkmXmmrmmf5gdDYv9zdAig0KoxhIQn1JN8IVqApzf/AyRhH3uDGx5mSvs8+a1zb4+0W6LC260SyTTtdQ==",
373
+ "dependencies": {
374
+ "@babel/runtime": "^7.26.0",
375
+ "@mui/utils": "^6.3.1",
376
+ "prop-types": "^15.8.1"
377
+ },
378
+ "engines": {
379
+ "node": ">=14.0.0"
380
+ },
381
+ "funding": {
382
+ "type": "opencollective",
383
+ "url": "https://opencollective.com/mui-org"
384
+ },
385
+ "peerDependencies": {
386
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
387
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
388
+ },
389
+ "peerDependenciesMeta": {
390
+ "@types/react": {
391
+ "optional": true
392
+ }
393
+ }
394
+ },
395
+ "node_modules/@mui/styled-engine": {
396
+ "version": "6.3.1",
397
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.3.1.tgz",
398
+ "integrity": "sha512-/7CC0d2fIeiUxN5kCCwYu4AWUDd9cCTxWCyo0v/Rnv6s8uk6hWgJC3VLZBoDENBHf/KjqDZuYJ2CR+7hD6QYww==",
399
+ "dependencies": {
400
+ "@babel/runtime": "^7.26.0",
401
+ "@emotion/cache": "^11.13.5",
402
+ "@emotion/serialize": "^1.3.3",
403
+ "@emotion/sheet": "^1.4.0",
404
+ "csstype": "^3.1.3",
405
+ "prop-types": "^15.8.1"
406
+ },
407
+ "engines": {
408
+ "node": ">=14.0.0"
409
+ },
410
+ "funding": {
411
+ "type": "opencollective",
412
+ "url": "https://opencollective.com/mui-org"
413
+ },
414
+ "peerDependencies": {
415
+ "@emotion/react": "^11.4.1",
416
+ "@emotion/styled": "^11.3.0",
417
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
418
+ },
419
+ "peerDependenciesMeta": {
420
+ "@emotion/react": {
421
+ "optional": true
422
+ },
423
+ "@emotion/styled": {
424
+ "optional": true
425
+ }
426
+ }
427
+ },
428
+ "node_modules/@mui/system": {
429
+ "version": "6.3.1",
430
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.3.1.tgz",
431
+ "integrity": "sha512-AwqQ3EAIT2np85ki+N15fF0lFXX1iFPqenCzVOSl3QXKy2eifZeGd9dGtt7pGMoFw5dzW4dRGGzRpLAq9rkl7A==",
432
+ "dependencies": {
433
+ "@babel/runtime": "^7.26.0",
434
+ "@mui/private-theming": "^6.3.1",
435
+ "@mui/styled-engine": "^6.3.1",
436
+ "@mui/types": "^7.2.21",
437
+ "@mui/utils": "^6.3.1",
438
+ "clsx": "^2.1.1",
439
+ "csstype": "^3.1.3",
440
+ "prop-types": "^15.8.1"
441
+ },
442
+ "engines": {
443
+ "node": ">=14.0.0"
444
+ },
445
+ "funding": {
446
+ "type": "opencollective",
447
+ "url": "https://opencollective.com/mui-org"
448
+ },
449
+ "peerDependencies": {
450
+ "@emotion/react": "^11.5.0",
451
+ "@emotion/styled": "^11.3.0",
452
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
453
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
454
+ },
455
+ "peerDependenciesMeta": {
456
+ "@emotion/react": {
457
+ "optional": true
458
+ },
459
+ "@emotion/styled": {
460
+ "optional": true
461
+ },
462
+ "@types/react": {
463
+ "optional": true
464
+ }
465
+ }
466
+ },
467
+ "node_modules/@mui/types": {
468
+ "version": "7.2.21",
469
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz",
470
+ "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==",
471
+ "peerDependencies": {
472
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
473
+ },
474
+ "peerDependenciesMeta": {
475
+ "@types/react": {
476
+ "optional": true
477
+ }
478
+ }
479
+ },
480
+ "node_modules/@mui/utils": {
481
+ "version": "6.3.1",
482
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.3.1.tgz",
483
+ "integrity": "sha512-sjGjXAngoio6lniQZKJ5zGfjm+LD2wvLwco7FbKe1fu8A7VIFmz2SwkLb+MDPLNX1lE7IscvNNyh1pobtZg2tw==",
484
+ "dependencies": {
485
+ "@babel/runtime": "^7.26.0",
486
+ "@mui/types": "^7.2.21",
487
+ "@types/prop-types": "^15.7.14",
488
+ "clsx": "^2.1.1",
489
+ "prop-types": "^15.8.1",
490
+ "react-is": "^19.0.0"
491
+ },
492
+ "engines": {
493
+ "node": ">=14.0.0"
494
+ },
495
+ "funding": {
496
+ "type": "opencollective",
497
+ "url": "https://opencollective.com/mui-org"
498
+ },
499
+ "peerDependencies": {
500
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
501
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
502
+ },
503
+ "peerDependenciesMeta": {
504
+ "@types/react": {
505
+ "optional": true
506
+ }
507
+ }
508
+ },
509
+ "node_modules/@popperjs/core": {
510
+ "version": "2.11.8",
511
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
512
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
513
+ "funding": {
514
+ "type": "opencollective",
515
+ "url": "https://opencollective.com/popperjs"
516
+ }
517
+ },
518
+ "node_modules/@types/parse-json": {
519
+ "version": "4.0.2",
520
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
521
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
522
+ },
523
+ "node_modules/@types/prop-types": {
524
+ "version": "15.7.14",
525
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
526
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="
527
+ },
528
+ "node_modules/@types/react": {
529
+ "version": "19.0.2",
530
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz",
531
+ "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==",
532
+ "peer": true,
533
+ "dependencies": {
534
+ "csstype": "^3.0.2"
535
+ }
536
+ },
537
+ "node_modules/@types/react-transition-group": {
538
+ "version": "4.4.12",
539
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
540
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
541
+ "peerDependencies": {
542
+ "@types/react": "*"
543
+ }
544
+ },
545
+ "node_modules/babel-plugin-macros": {
546
+ "version": "3.1.0",
547
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
548
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
549
+ "dependencies": {
550
+ "@babel/runtime": "^7.12.5",
551
+ "cosmiconfig": "^7.0.0",
552
+ "resolve": "^1.19.0"
553
+ },
554
+ "engines": {
555
+ "node": ">=10",
556
+ "npm": ">=6"
557
+ }
558
+ },
559
+ "node_modules/callsites": {
560
+ "version": "3.1.0",
561
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
562
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
563
+ "engines": {
564
+ "node": ">=6"
565
+ }
566
+ },
567
+ "node_modules/clsx": {
568
+ "version": "2.1.1",
569
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
570
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
571
+ "engines": {
572
+ "node": ">=6"
573
+ }
574
+ },
575
+ "node_modules/convert-source-map": {
576
+ "version": "1.9.0",
577
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
578
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
579
+ },
580
+ "node_modules/cosmiconfig": {
581
+ "version": "7.1.0",
582
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
583
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
584
+ "dependencies": {
585
+ "@types/parse-json": "^4.0.0",
586
+ "import-fresh": "^3.2.1",
587
+ "parse-json": "^5.0.0",
588
+ "path-type": "^4.0.0",
589
+ "yaml": "^1.10.0"
590
+ },
591
+ "engines": {
592
+ "node": ">=10"
593
+ }
594
+ },
595
+ "node_modules/csstype": {
596
+ "version": "3.1.3",
597
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
598
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
599
+ },
600
+ "node_modules/debug": {
601
+ "version": "4.4.0",
602
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
603
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
604
+ "dependencies": {
605
+ "ms": "^2.1.3"
606
+ },
607
+ "engines": {
608
+ "node": ">=6.0"
609
+ },
610
+ "peerDependenciesMeta": {
611
+ "supports-color": {
612
+ "optional": true
613
+ }
614
+ }
615
+ },
616
+ "node_modules/dom-helpers": {
617
+ "version": "5.2.1",
618
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
619
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
620
+ "dependencies": {
621
+ "@babel/runtime": "^7.8.7",
622
+ "csstype": "^3.0.2"
623
+ }
624
+ },
625
+ "node_modules/error-ex": {
626
+ "version": "1.3.2",
627
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
628
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
629
+ "dependencies": {
630
+ "is-arrayish": "^0.2.1"
631
+ }
632
+ },
633
+ "node_modules/escape-string-regexp": {
634
+ "version": "4.0.0",
635
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
636
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
637
+ "engines": {
638
+ "node": ">=10"
639
+ },
640
+ "funding": {
641
+ "url": "https://github.com/sponsors/sindresorhus"
642
+ }
643
+ },
644
+ "node_modules/find-root": {
645
+ "version": "1.1.0",
646
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
647
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
648
+ },
649
+ "node_modules/function-bind": {
650
+ "version": "1.1.2",
651
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
652
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
653
+ "funding": {
654
+ "url": "https://github.com/sponsors/ljharb"
655
+ }
656
+ },
657
+ "node_modules/globals": {
658
+ "version": "11.12.0",
659
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
660
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
661
+ "engines": {
662
+ "node": ">=4"
663
+ }
664
+ },
665
+ "node_modules/hasown": {
666
+ "version": "2.0.2",
667
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
668
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
669
+ "dependencies": {
670
+ "function-bind": "^1.1.2"
671
+ },
672
+ "engines": {
673
+ "node": ">= 0.4"
674
+ }
675
+ },
676
+ "node_modules/hoist-non-react-statics": {
677
+ "version": "3.3.2",
678
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
679
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
680
+ "dependencies": {
681
+ "react-is": "^16.7.0"
682
+ }
683
+ },
684
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
685
+ "version": "16.13.1",
686
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
687
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
688
+ },
689
+ "node_modules/import-fresh": {
690
+ "version": "3.3.0",
691
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
692
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
693
+ "dependencies": {
694
+ "parent-module": "^1.0.0",
695
+ "resolve-from": "^4.0.0"
696
+ },
697
+ "engines": {
698
+ "node": ">=6"
699
+ },
700
+ "funding": {
701
+ "url": "https://github.com/sponsors/sindresorhus"
702
+ }
703
+ },
704
+ "node_modules/is-arrayish": {
705
+ "version": "0.2.1",
706
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
707
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
708
+ },
709
+ "node_modules/is-core-module": {
710
+ "version": "2.16.1",
711
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
712
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
713
+ "dependencies": {
714
+ "hasown": "^2.0.2"
715
+ },
716
+ "engines": {
717
+ "node": ">= 0.4"
718
+ },
719
+ "funding": {
720
+ "url": "https://github.com/sponsors/ljharb"
721
+ }
722
+ },
723
+ "node_modules/js-tokens": {
724
+ "version": "4.0.0",
725
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
726
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
727
+ },
728
+ "node_modules/jsesc": {
729
+ "version": "3.1.0",
730
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
731
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
732
+ "bin": {
733
+ "jsesc": "bin/jsesc"
734
+ },
735
+ "engines": {
736
+ "node": ">=6"
737
+ }
738
+ },
739
+ "node_modules/json-parse-even-better-errors": {
740
+ "version": "2.3.1",
741
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
742
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
743
+ },
744
+ "node_modules/lines-and-columns": {
745
+ "version": "1.2.4",
746
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
747
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
748
+ },
749
+ "node_modules/loose-envify": {
750
+ "version": "1.4.0",
751
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
752
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
753
+ "dependencies": {
754
+ "js-tokens": "^3.0.0 || ^4.0.0"
755
+ },
756
+ "bin": {
757
+ "loose-envify": "cli.js"
758
+ }
759
+ },
760
+ "node_modules/ms": {
761
+ "version": "2.1.3",
762
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
763
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
764
+ },
765
+ "node_modules/object-assign": {
766
+ "version": "4.1.1",
767
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
768
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
769
+ "engines": {
770
+ "node": ">=0.10.0"
771
+ }
772
+ },
773
+ "node_modules/parent-module": {
774
+ "version": "1.0.1",
775
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
776
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
777
+ "dependencies": {
778
+ "callsites": "^3.0.0"
779
+ },
780
+ "engines": {
781
+ "node": ">=6"
782
+ }
783
+ },
784
+ "node_modules/parse-json": {
785
+ "version": "5.2.0",
786
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
787
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
788
+ "dependencies": {
789
+ "@babel/code-frame": "^7.0.0",
790
+ "error-ex": "^1.3.1",
791
+ "json-parse-even-better-errors": "^2.3.0",
792
+ "lines-and-columns": "^1.1.6"
793
+ },
794
+ "engines": {
795
+ "node": ">=8"
796
+ },
797
+ "funding": {
798
+ "url": "https://github.com/sponsors/sindresorhus"
799
+ }
800
+ },
801
+ "node_modules/path-parse": {
802
+ "version": "1.0.7",
803
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
804
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
805
+ },
806
+ "node_modules/path-type": {
807
+ "version": "4.0.0",
808
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
809
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
810
+ "engines": {
811
+ "node": ">=8"
812
+ }
813
+ },
814
+ "node_modules/picocolors": {
815
+ "version": "1.1.1",
816
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
817
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
818
+ },
819
+ "node_modules/prop-types": {
820
+ "version": "15.8.1",
821
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
822
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
823
+ "dependencies": {
824
+ "loose-envify": "^1.4.0",
825
+ "object-assign": "^4.1.1",
826
+ "react-is": "^16.13.1"
827
+ }
828
+ },
829
+ "node_modules/prop-types/node_modules/react-is": {
830
+ "version": "16.13.1",
831
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
832
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
833
+ },
834
+ "node_modules/react": {
835
+ "version": "19.0.0",
836
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
837
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
838
+ "peer": true,
839
+ "engines": {
840
+ "node": ">=0.10.0"
841
+ }
842
+ },
843
+ "node_modules/react-dom": {
844
+ "version": "19.0.0",
845
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
846
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
847
+ "peer": true,
848
+ "dependencies": {
849
+ "scheduler": "^0.25.0"
850
+ },
851
+ "peerDependencies": {
852
+ "react": "^19.0.0"
853
+ }
854
+ },
855
+ "node_modules/react-is": {
856
+ "version": "19.0.0",
857
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
858
+ "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g=="
859
+ },
860
+ "node_modules/react-transition-group": {
861
+ "version": "4.4.5",
862
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
863
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
864
+ "dependencies": {
865
+ "@babel/runtime": "^7.5.5",
866
+ "dom-helpers": "^5.0.1",
867
+ "loose-envify": "^1.4.0",
868
+ "prop-types": "^15.6.2"
869
+ },
870
+ "peerDependencies": {
871
+ "react": ">=16.6.0",
872
+ "react-dom": ">=16.6.0"
873
+ }
874
+ },
875
+ "node_modules/regenerator-runtime": {
876
+ "version": "0.14.1",
877
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
878
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
879
+ },
880
+ "node_modules/resolve": {
881
+ "version": "1.22.10",
882
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
883
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
884
+ "dependencies": {
885
+ "is-core-module": "^2.16.0",
886
+ "path-parse": "^1.0.7",
887
+ "supports-preserve-symlinks-flag": "^1.0.0"
888
+ },
889
+ "bin": {
890
+ "resolve": "bin/resolve"
891
+ },
892
+ "engines": {
893
+ "node": ">= 0.4"
894
+ },
895
+ "funding": {
896
+ "url": "https://github.com/sponsors/ljharb"
897
+ }
898
+ },
899
+ "node_modules/resolve-from": {
900
+ "version": "4.0.0",
901
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
902
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
903
+ "engines": {
904
+ "node": ">=4"
905
+ }
906
+ },
907
+ "node_modules/scheduler": {
908
+ "version": "0.25.0",
909
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
910
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
911
+ "peer": true
912
+ },
913
+ "node_modules/source-map": {
914
+ "version": "0.5.7",
915
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
916
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
917
+ "engines": {
918
+ "node": ">=0.10.0"
919
+ }
920
+ },
921
+ "node_modules/stylis": {
922
+ "version": "4.2.0",
923
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
924
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
925
+ },
926
+ "node_modules/supports-preserve-symlinks-flag": {
927
+ "version": "1.0.0",
928
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
929
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
930
+ "engines": {
931
+ "node": ">= 0.4"
932
+ },
933
+ "funding": {
934
+ "url": "https://github.com/sponsors/ljharb"
935
+ }
936
+ },
937
+ "node_modules/yaml": {
938
+ "version": "1.10.2",
939
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
940
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
941
+ "engines": {
942
+ "node": ">= 6"
943
+ }
944
+ }
945
+ }
946
+ }
api/package.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "dependencies": {
3
+ "@emotion/react": "^11.14.0",
4
+ "@emotion/styled": "^11.14.0",
5
+ "@mui/material": "^6.3.1"
6
+ }
7
+ }
app.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from flask_cors import CORS
3
+ import pandas as pd
4
+ import sys
5
+ import os
6
+
7
+ # Add parent directory to path for imports
8
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
9
+ from generate_recommendations import RecommendationGenerator
10
+
11
+ app = Flask(__name__)
12
+ CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True)
13
+ # # Load allowed origins from environment variable
14
+ # allowed_origins = os.environ.get("ALLOWED_ORIGINS", "http://localhost:3000").split(",")
15
+ # CORS(app, resources={r"/*": {"origins": allowed_origins}}, supports_credentials=True)
16
+ # print("CORS is configured with allowed origins:", allowed_origins)
17
+
18
+ # Setup paths relative to the project structure
19
+ ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
20
+ MODEL_PATH = os.path.join(ROOT_DIR, 'checkpoints', 'best_model.pth')
21
+ DATA_PATH = os.path.join(ROOT_DIR, 'data', 'test_data.csv')
22
+ ENCODERS_PATH = os.path.join(ROOT_DIR, 'data', 'data_encoders.pt')
23
+
24
+ print(f"Root directory: {ROOT_DIR}")
25
+ print(f"Model path: {MODEL_PATH}")
26
+ print(f"Data path: {DATA_PATH}")
27
+ print(f"Encoders path: {ENCODERS_PATH}")
28
+
29
+ # Initialize model and data
30
+ try:
31
+ if not os.path.exists(MODEL_PATH):
32
+ raise FileNotFoundError(f"Model file not found at {MODEL_PATH}")
33
+ if not os.path.exists(DATA_PATH):
34
+ raise FileNotFoundError(f"Data file not found at {DATA_PATH}")
35
+ if not os.path.exists(ENCODERS_PATH):
36
+ raise FileNotFoundError(f"Encoders file not found at {ENCODERS_PATH}")
37
+
38
+ catalog_data = pd.read_csv(DATA_PATH)
39
+ recommender = RecommendationGenerator(
40
+ model_path=MODEL_PATH,
41
+ catalog_data=catalog_data,
42
+ encoders_path=ENCODERS_PATH
43
+ )
44
+ print("Model loaded successfully")
45
+ except Exception as e:
46
+ print(f"Error loading model: {str(e)}")
47
+ raise
48
+
49
+ @app.route('/routes', methods=['GET'])
50
+ def list_routes():
51
+ routes = []
52
+ for rule in app.url_map.iter_rules():
53
+ routes.append({
54
+ "endpoint": rule.endpoint,
55
+ "methods": list(rule.methods),
56
+ "url": str(rule)
57
+ })
58
+ return {"routes": routes}, 200
59
+
60
+ @app.route('/')
61
+ def home():
62
+ return "Welcome to the app!"
63
+
64
+ # @app.route('/api/recommendations', methods=['POST'])
65
+ # def get_recommendations():
66
+ # try:
67
+ # data = request.json
68
+ # user_info = {
69
+ # 'user_id': data['user_id'],
70
+ # 'age': int(data['age']),
71
+ # 'gender': data['gender'],
72
+ # 'genre': data['genre'],
73
+ # 'music': data['music']
74
+ # }
75
+
76
+ # recommendations = recommender.generate_recommendations(user_info, n_recommendations=5)
77
+
78
+ # return jsonify({
79
+ # 'status': 'success',
80
+ # 'recommendations': recommendations.to_dict(orient='records')
81
+ # })
82
+ # except Exception as e:
83
+ # return jsonify({
84
+ # 'status': 'error',
85
+ # 'message': str(e)
86
+ # }), 500
87
+ @app.route('/api/recommendations', methods=['POST'])
88
+ def get_recommendations():
89
+ try:
90
+ print("Request received") # Log start
91
+ data = request.json
92
+ print("Request data:", data) # Log data
93
+
94
+ user_info = {
95
+ 'user_id': data['user_id'],
96
+ 'age': int(data['age']),
97
+ 'gender': data['gender'],
98
+ 'genre': data['genre'],
99
+ 'music': data['music']
100
+ }
101
+ print("Generating recommendations...") # Log before calling the model
102
+
103
+ recommendations = recommender.generate_recommendations(user_info, n_recommendations=5)
104
+
105
+ print("Recommendations generated") # Log success
106
+ return jsonify({
107
+ 'status': 'success',
108
+ 'recommendations': recommendations.to_dict(orient='records')
109
+ })
110
+ except Exception as e:
111
+ print("Error occurred:", str(e)) # Log errors
112
+ return jsonify({
113
+ 'status': 'error',
114
+ 'message': str(e)
115
+ }), 500
116
+
117
+
118
+ @app.route('/api/health', methods=['GET'])
119
+ def health_check():
120
+ return jsonify({'status': 'healthy'})
121
+
122
+ if __name__ == '__main__':
123
+ port = int(os.environ.get('PORT', 8000))
124
+ app.run(host='0.0.0.0', port=port, debug=True)
checkpoints/best_model.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ed66806af3d4a2fc27871e0967ebed8889755299ad77a9dfaf60d62253ce2b9a
3
+ size 21607885
checkpoints/best_model_cv.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:28fbbfc7ff7c43624a789097920c582a9931903a21fb05b3cddacd9638fa666c
3
+ size 8273787
checkpoints/latest_checkpoint.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:fc336bee4aec71e695821d0f9747638bd27235d7e5e195f060528c98aa52beaf
3
+ size 21608914
config/model_config.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "learning_rate": 0.001,
3
+ "weight_decay": 1e-05,
4
+ "epochs": 20,
5
+ "batch_size": 32,
6
+ "embedding_dim": 64,
7
+ "model_dir": "models",
8
+ "hidden_layers": [
9
+ 256,
10
+ 128,
11
+ 64
12
+ ],
13
+ "dropout": 0.3,
14
+ "early_stopping_patience": 2,
15
+ "max_grad_norm": 1.0,
16
+ "l1_lambda": 1e-05,
17
+ "n_splits": 5
18
+ }
data/cleaned_modv2.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/data_encoders.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f4e60f8ec993e84b8d4475484010774a10bb4c19a13e452e94b797c2583be973
3
+ size 1788856
data/dataset.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:650c373cadce8479ba15f3602867392c90b61aeceeb731f6098d9532f96f49d4
3
+ size 13859442
data/engineered_data.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/music_data.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/name_gender.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/o2_data.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1b23097172f8f50e089acdea0c9c9f10e5b9162d926aa017578b751c6561d1dc
3
+ size 13122336
data/test_data.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/train_data.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9d52510a2e92b5907e5e07710f60f515920fd5b836d325485f9863cd3e24f934
3
+ size 24971750
data_utils.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ from sklearn.model_selection import train_test_split
3
+ import os
4
+ import logging
5
+ from encoder_utils import DataEncoder
6
+ import torch
7
+ import numpy as np
8
+ from tqdm import tqdm
9
+
10
+ logging.basicConfig(level=logging.INFO)
11
+ logger = logging.getLogger(__name__)
12
+
13
+ def generate_negative_samples(df: pd.DataFrame, num_negatives: int = 4) -> pd.DataFrame:
14
+ """
15
+ Generate negative samples for each user by randomly sampling items they haven't interacted with.
16
+
17
+ Args:
18
+ df: DataFrame containing user-item interactions
19
+ num_negatives: Number of negative samples per positive interaction
20
+
21
+ Returns:
22
+ DataFrame with both positive and negative samples
23
+ """
24
+ # Create a set of all items
25
+ all_items = set(df['music_id'].unique())
26
+
27
+ negative_samples = []
28
+ for user_id in tqdm(df['user_id'].unique(), desc="Generating negative samples"):
29
+ # Get items the user has interacted with
30
+ user_items = set(df[df['user_id'] == user_id]['music_id'])
31
+
32
+ # Get items the user hasn't interacted with
33
+ negative_items = list(all_items - user_items)
34
+
35
+ if len(negative_items) > 0:
36
+ # Sample negative items
37
+ num_samples = min(len(negative_items), num_negatives)
38
+ sampled_negatives = np.random.choice(negative_items, size=num_samples, replace=False)
39
+
40
+ # Create negative samples
41
+ user_data = df[df['user_id'] == user_id].iloc[0].to_dict()
42
+ for item_id in sampled_negatives:
43
+ negative = user_data.copy()
44
+ negative['music_id'] = item_id
45
+ negative['playcount'] = 0 # Mark as negative sample
46
+ negative_samples.append(negative)
47
+
48
+ # Convert negative samples to DataFrame
49
+ negative_df = pd.DataFrame(negative_samples)
50
+
51
+ # Combine positive and negative samples
52
+ combined_df = pd.concat([df, negative_df], ignore_index=True)
53
+
54
+ return combined_df
55
+
56
+ def split_and_save_data(data_path: str, test_size: float = 0.2, random_state: int = 42):
57
+ """
58
+ Split data into train and test sets while maintaining consistent encoding.
59
+ """
60
+ # Read data
61
+ df = pd.read_csv(data_path)
62
+ logger.info(f"Total records: {len(df)}")
63
+
64
+ # Generate negative samples
65
+ df = generate_negative_samples(df)
66
+ logger.info(f"Total records after negative sampling: {len(df)}")
67
+
68
+ # Initialize and fit encoders on full dataset
69
+ encoder = DataEncoder()
70
+ encoder.fit(df)
71
+
72
+ # Split by user to avoid data leakage
73
+ users = df['user_id'].unique()
74
+ train_users, test_users = train_test_split(
75
+ users,
76
+ test_size=test_size,
77
+ random_state=random_state
78
+ )
79
+
80
+ train_data = df[df['user_id'].isin(train_users)]
81
+ test_data = df[df['user_id'].isin(test_users)]
82
+
83
+ # Save splits
84
+ data_dir = os.path.dirname(data_path)
85
+ os.makedirs(data_dir, exist_ok=True)
86
+
87
+ train_path = os.path.join(data_dir, 'train_data.csv')
88
+ test_path = os.path.join(data_dir, 'test_data.csv')
89
+ encoder_path = os.path.join(data_dir, 'data_encoders.pt')
90
+
91
+ # Save data splits
92
+ train_data.to_csv(train_path, index=False)
93
+ test_data.to_csv(test_path, index=False)
94
+
95
+ # Save encoders
96
+ torch.save(encoder.get_encoders(), encoder_path)
97
+
98
+ logger.info(f"Training set size: {len(train_data)}")
99
+ logger.info(f"Test set size: {len(test_data)}")
100
+ logger.info(f"\nFiles saved to:")
101
+ logger.info(f"Training data: {train_path}")
102
+ logger.info(f"Test data: {test_path}")
103
+ logger.info(f"Encoders: {encoder_path}")
104
+
105
+ # Log some statistics about the encodings
106
+ dims = encoder.get_dims()
107
+ logger.info("\nEncoding dimensions:")
108
+ for key, value in dims.items():
109
+ logger.info(f"{key}: {value}")
110
+
111
+ return train_path, test_path, encoder_path
112
+
113
+ if __name__ == "__main__":
114
+ data_path = 'data/o2_data.csv'
115
+ train_path, test_path, encoder_path = split_and_save_data(data_path)
encoder_utils.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sklearn.preprocessing import LabelEncoder, RobustScaler
2
+ import pandas as pd
3
+ from typing import Dict, Any
4
+ import numpy as np
5
+
6
+ class DataEncoder:
7
+ def __init__(self):
8
+ self.user_encoder = LabelEncoder()
9
+ self.music_encoder = LabelEncoder()
10
+ self.artist_encoder = LabelEncoder()
11
+ self.genre_encoder = LabelEncoder()
12
+ self.scaler = RobustScaler()
13
+
14
+ self.numerical_features = [
15
+ 'age', 'duration', 'acousticness', 'key', 'mode', 'speechiness',
16
+ 'instrumentalness', 'liveness', 'tempo', 'time_signature',
17
+ 'energy_loudness', 'dance_valence' # Removed 'playcount'
18
+ ]
19
+
20
+ def fit(self, df: pd.DataFrame) -> None:
21
+ """Fit all encoders on the full dataset."""
22
+ self.user_encoder.fit(df['user_id'].values)
23
+ self.music_encoder.fit(df['music_id'].values)
24
+ self.artist_encoder.fit(df['artist_id'].values)
25
+ self.genre_encoder.fit(df['main_genre'].values)
26
+ self.scaler.fit(df[self.numerical_features].values)
27
+
28
+ def transform(self, df: pd.DataFrame) -> Dict[str, np.ndarray]:
29
+ """Transform data using fitted encoders."""
30
+ return {
31
+ 'users': self.user_encoder.transform(df['user_id'].values),
32
+ 'music': self.music_encoder.transform(df['music_id'].values),
33
+ 'artists': self.artist_encoder.transform(df['artist_id'].values),
34
+ 'genres': self.genre_encoder.transform(df['main_genre'].values),
35
+ 'numerical_features': self.scaler.transform(df[self.numerical_features].values)
36
+ }
37
+
38
+ def get_dims(self) -> Dict[str, int]:
39
+ """Get dimensions for model initialization."""
40
+ return {
41
+ 'num_users': len(self.user_encoder.classes_),
42
+ 'num_music': len(self.music_encoder.classes_),
43
+ 'num_artists': len(self.artist_encoder.classes_),
44
+ 'num_genres': len(self.genre_encoder.classes_),
45
+ 'num_numerical': len(self.numerical_features)
46
+ }
47
+
48
+ def get_encoders(self) -> Dict[str, Any]:
49
+ """Get all encoders for saving."""
50
+ return {
51
+ 'user_encoder': self.user_encoder,
52
+ 'music_encoder': self.music_encoder,
53
+ 'artist_encoder': self.artist_encoder,
54
+ 'genre_encoder': self.genre_encoder,
55
+ 'scaler': self.scaler
56
+ }
evaluate_model.py ADDED
@@ -0,0 +1,497 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import numpy as np
3
+ import pandas as pd
4
+ import matplotlib.pyplot as plt
5
+ import seaborn as sns
6
+ from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, ndcg_score
7
+ from typing import Dict, List, Tuple
8
+ import json
9
+ import os
10
+ from train_model import HybridMusicRecommender, MusicRecommenderDataset
11
+ from torch.utils.data import DataLoader
12
+ import logging
13
+ from sklearn.preprocessing import LabelEncoder
14
+ from sklearn.model_selection import ParameterGrid, train_test_split
15
+
16
+ logging.basicConfig(
17
+ level=logging.INFO,
18
+ format='%(asctime)s - %(levelname)s - %(message)s',
19
+ handlers=[
20
+ logging.FileHandler('model_evaluation.log'),
21
+ logging.StreamHandler()
22
+ ]
23
+ )
24
+ logger = logging.getLogger(__name__)
25
+
26
+ class ModelEvaluator:
27
+ def __init__(self, model_path: str, test_data: pd.DataFrame, batch_size: int = 32):
28
+ self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
29
+ self.model_path = model_path
30
+ self.test_data = test_data
31
+ self.batch_size = batch_size
32
+
33
+ # Load model and config
34
+ torch.serialization.add_safe_globals([LabelEncoder])
35
+ self.checkpoint = torch.load(model_path, map_location=self.device, weights_only=False)
36
+ self.config = self.checkpoint['config']
37
+ self.encoders = self.checkpoint['encoders']
38
+
39
+ # Initialize model
40
+ self.model = self._initialize_model()
41
+ self.test_loader = self._prepare_data()
42
+
43
+ # Create metrics directory with absolute path
44
+ self.metrics_dir = os.path.join(os.path.dirname(model_path), 'metrics')
45
+ os.makedirs(self.metrics_dir, exist_ok=True)
46
+
47
+ def _initialize_model(self, custom_config: Dict = None) -> HybridMusicRecommender:
48
+ """Initialize and load the model from checkpoint."""
49
+ # Use custom config if provided, otherwise use default
50
+ config = custom_config if custom_config else self.config
51
+
52
+ model = HybridMusicRecommender(
53
+ num_users=len(self.encoders['user_encoder'].classes_),
54
+ num_music=len(self.encoders['music_encoder'].classes_),
55
+ num_artists=len(self.encoders['artist_encoder'].classes_),
56
+ num_genres=len(self.encoders['genre_encoder'].classes_),
57
+ num_numerical=12,
58
+ embedding_dim=config['embedding_dim'],
59
+ layers=config['hidden_layers'],
60
+ dropout=config['dropout']
61
+ )
62
+
63
+ # Only load state dict if using default config
64
+ if not custom_config:
65
+ model.load_state_dict(self.checkpoint['model_state_dict'])
66
+
67
+ model = model.to(self.device)
68
+ model.eval()
69
+ return model
70
+
71
+ def _prepare_data(self) -> DataLoader:
72
+ """Prepare test data loader using saved encoders."""
73
+ # Create a custom dataset for test data with the saved encoders
74
+ test_dataset = MusicRecommenderDataset(
75
+ self.test_data,
76
+ mode='test',
77
+ encoders=self.encoders
78
+ )
79
+
80
+ logger.info(f"Prepared test dataset with {len(self.test_data)} samples")
81
+ return DataLoader(test_dataset, batch_size=self.batch_size, shuffle=False)
82
+
83
+ def calculate_metrics(self) -> Dict[str, float]:
84
+ """Calculate various performance metrics."""
85
+ true_values = []
86
+ predictions = []
87
+
88
+ with torch.no_grad():
89
+ for batch in self.test_loader:
90
+ batch = {k: v.to(self.device) for k, v in batch.items()}
91
+ pred = self.model(batch)
92
+ true_values.extend(batch['playcount'].cpu().numpy())
93
+ predictions.extend(pred.cpu().numpy())
94
+
95
+ true_values = np.array(true_values)
96
+ predictions = np.array(predictions)
97
+
98
+ metrics = {
99
+ 'mse': float(mean_squared_error(true_values, predictions)),
100
+ 'rmse': float(np.sqrt(mean_squared_error(true_values, predictions))),
101
+ 'mae': float(mean_absolute_error(true_values, predictions)),
102
+ 'r2': float(r2_score(true_values, predictions))
103
+ }
104
+
105
+ # Calculate prediction distribution statistics
106
+ metrics.update({
107
+ 'pred_mean': float(np.mean(predictions)),
108
+ 'pred_std': float(np.std(predictions)),
109
+ 'true_mean': float(np.mean(true_values)),
110
+ 'true_std': float(np.std(true_values))
111
+ })
112
+
113
+ return metrics
114
+
115
+ def analyze_prediction_bias(self) -> Dict[str, float]:
116
+ """Analyze prediction bias across different value ranges."""
117
+ true_values = []
118
+ predictions = []
119
+
120
+ with torch.no_grad():
121
+ for batch in self.test_loader:
122
+ batch = {k: v.to(self.device) for k, v in batch.items()}
123
+ pred = self.model(batch)
124
+ true_values.extend(batch['playcount'].cpu().numpy())
125
+ predictions.extend(pred.cpu().numpy())
126
+
127
+ true_values = np.array(true_values)
128
+ predictions = np.array(predictions)
129
+
130
+ # Calculate bias for different value ranges
131
+ percentiles = np.percentile(true_values, [25, 50, 75])
132
+ ranges = [
133
+ (float('-inf'), percentiles[0]),
134
+ (percentiles[0], percentiles[1]),
135
+ (percentiles[1], percentiles[2]),
136
+ (percentiles[2], float('inf'))
137
+ ]
138
+
139
+ bias_analysis = {}
140
+ for i, (low, high) in enumerate(ranges):
141
+ mask = (true_values >= low) & (true_values < high)
142
+ if np.any(mask):
143
+ bias = np.mean(predictions[mask] - true_values[mask])
144
+ bias_analysis[f'bias_range_{i+1}'] = float(bias)
145
+
146
+ return bias_analysis
147
+
148
+ def plot_prediction_distribution(self, save_dir: str = None):
149
+ """Plot the distribution of predictions vs true values."""
150
+ if save_dir is None:
151
+ save_dir = self.metrics_dir
152
+
153
+ true_values = []
154
+ predictions = []
155
+
156
+ with torch.no_grad():
157
+ for batch in self.test_loader:
158
+ batch = {k: v.to(self.device) for k, v in batch.items()}
159
+ pred = self.model(batch)
160
+ true_values.extend(batch['playcount'].cpu().numpy())
161
+ predictions.extend(pred.cpu().numpy())
162
+
163
+ true_values = np.array(true_values)
164
+ predictions = np.array(predictions)
165
+
166
+ # Create scatter plot
167
+ plt.figure(figsize=(10, 6))
168
+ plt.scatter(true_values, predictions, alpha=0.5)
169
+ plt.plot([true_values.min(), true_values.max()],
170
+ [true_values.min(), true_values.max()],
171
+ 'r--', lw=2)
172
+ plt.xlabel('True Values')
173
+ plt.ylabel('Predictions')
174
+ plt.title('Prediction vs True Values')
175
+
176
+ try:
177
+ # Save plot with absolute path
178
+ plot_path = os.path.join(save_dir, 'prediction_distribution.png')
179
+ plt.savefig(plot_path)
180
+ plt.close()
181
+ logger.info(f"Saved prediction distribution plot to: {plot_path}")
182
+ except Exception as e:
183
+ logger.error(f"Error saving prediction distribution plot: {str(e)}")
184
+
185
+ def plot_error_distribution(self, save_dir: str = None):
186
+ """Plot the distribution of prediction errors."""
187
+ if save_dir is None:
188
+ save_dir = self.metrics_dir
189
+
190
+ true_values = []
191
+ predictions = []
192
+
193
+ with torch.no_grad():
194
+ for batch in self.test_loader:
195
+ batch = {k: v.to(self.device) for k, v in batch.items()}
196
+ pred = self.model(batch)
197
+ true_values.extend(batch['playcount'].cpu().numpy())
198
+ predictions.extend(pred.cpu().numpy())
199
+
200
+ errors = np.array(predictions) - np.array(true_values)
201
+
202
+ plt.figure(figsize=(10, 6))
203
+ sns.histplot(errors, kde=True)
204
+ plt.xlabel('Prediction Error')
205
+ plt.ylabel('Count')
206
+ plt.title('Distribution of Prediction Errors')
207
+
208
+ try:
209
+ plot_path = os.path.join(save_dir, 'error_distribution.png')
210
+ plt.savefig(plot_path)
211
+ plt.close()
212
+ logger.info(f"Saved error distribution plot to: {plot_path}")
213
+ except Exception as e:
214
+ logger.error(f"Error saving error distribution plot: {str(e)}")
215
+
216
+ def evaluate_top_k_recommendations(self, k: int = 10) -> Dict[str, float]:
217
+ """Evaluate top-K recommendation metrics."""
218
+ user_metrics = []
219
+
220
+ # Group by user to evaluate per-user recommendations
221
+ for user_id in self.test_data['user_id'].unique():
222
+ user_mask = self.test_data['user_id'] == user_id
223
+ user_data = self.test_data[user_mask]
224
+
225
+ # Skip users with too few interactions
226
+ if len(user_data) < k:
227
+ continue
228
+
229
+ user_dataset = MusicRecommenderDataset(
230
+ user_data,
231
+ mode='test',
232
+ encoders=self.encoders
233
+ )
234
+ user_loader = DataLoader(user_dataset, batch_size=len(user_data), shuffle=False)
235
+
236
+ with torch.no_grad():
237
+ batch = next(iter(user_loader))
238
+ batch = {k: v.to(self.device) for k, v in batch.items()}
239
+ predictions = self.model(batch).cpu().numpy()
240
+ true_values = batch['playcount'].cpu().numpy()
241
+
242
+ # Normalize predictions and true values to [0, 1] range
243
+ true_values = (true_values - true_values.min()) / (true_values.max() - true_values.min() + 1e-8)
244
+ predictions = (predictions - predictions.min()) / (predictions.max() - predictions.min() + 1e-8)
245
+
246
+ # Calculate metrics for this user
247
+ top_k_pred_idx = np.argsort(predictions)[-k:][::-1]
248
+ top_k_true_idx = np.argsort(true_values)[-k:][::-1]
249
+
250
+ # Calculate NDCG
251
+ dcg = self._calculate_dcg(true_values, top_k_pred_idx, k)
252
+ idcg = self._calculate_dcg(true_values, top_k_true_idx, k)
253
+
254
+ # Handle edge case where idcg is 0
255
+ ndcg = dcg / idcg if idcg > 0 else 0.0
256
+
257
+ # Calculate precision and recall
258
+ relevant_items = set(top_k_true_idx)
259
+ recommended_items = set(top_k_pred_idx)
260
+
261
+ precision = len(relevant_items & recommended_items) / k
262
+ recall = len(relevant_items & recommended_items) / len(relevant_items)
263
+
264
+ user_metrics.append({
265
+ 'ndcg': ndcg,
266
+ 'precision': precision,
267
+ 'recall': recall
268
+ })
269
+
270
+ # Average metrics across users
271
+ avg_metrics = {
272
+ 'ndcg@10': float(np.mean([m['ndcg'] for m in user_metrics])),
273
+ 'precision@10': float(np.mean([m['precision'] for m in user_metrics])),
274
+ 'recall@10': float(np.mean([m['recall'] for m in user_metrics]))
275
+ }
276
+
277
+ return avg_metrics
278
+
279
+ def _calculate_dcg(self, true_values: np.ndarray, indices: np.ndarray, k: int) -> float:
280
+ """Helper method to calculate DCG with numerical stability."""
281
+ relevance = true_values[indices[:k]]
282
+ # Cap the relevance values to prevent overflow
283
+ max_relevance = 10 # Set a reasonable maximum value
284
+ relevance = np.clip(relevance, 0, max_relevance)
285
+
286
+ # Use log2(rank + 1) directly instead of creating array
287
+ gains = (2 ** relevance - 1) / np.log2(np.arange(2, len(relevance) + 2))
288
+ return float(np.sum(gains))
289
+
290
+ def evaluate_cold_start(self, min_interactions: int = 5) -> Dict[str, Dict[str, float]]:
291
+ """
292
+ Evaluate model performance on cold-start scenarios.
293
+
294
+ Args:
295
+ min_interactions: Minimum number of interactions to consider a user/item as non-cold
296
+
297
+ Returns:
298
+ Dictionary containing metrics for different cold-start scenarios
299
+ """
300
+ # Get all unique users and items
301
+ all_users = self.test_data['user_id'].unique()
302
+ all_items = self.test_data['music_id'].unique()
303
+
304
+ # Count interactions per user and item
305
+ user_counts = self.test_data['user_id'].value_counts()
306
+ item_counts = self.test_data['music_id'].value_counts()
307
+
308
+ # Identify cold users and items
309
+ cold_users = set(user_counts[user_counts < min_interactions].index)
310
+ cold_items = set(item_counts[item_counts < min_interactions].index)
311
+
312
+ # Create masks for different scenarios
313
+ cold_user_mask = self.test_data['user_id'].isin(cold_users)
314
+ cold_item_mask = self.test_data['music_id'].isin(cold_items)
315
+ cold_user_warm_item = cold_user_mask & ~cold_item_mask
316
+ warm_user_cold_item = ~cold_user_mask & cold_item_mask
317
+ cold_both = cold_user_mask & cold_item_mask
318
+ warm_both = ~cold_user_mask & ~cold_item_mask
319
+
320
+ scenarios = {
321
+ 'cold_user_warm_item': cold_user_warm_item,
322
+ 'warm_user_cold_item': warm_user_cold_item,
323
+ 'cold_both': cold_both,
324
+ 'warm_both': warm_both
325
+ }
326
+
327
+ results = {}
328
+ for scenario_name, mask in scenarios.items():
329
+ if not any(mask):
330
+ logger.warning(f"No samples found for scenario: {scenario_name}")
331
+ continue
332
+
333
+ scenario_data = self.test_data[mask].copy()
334
+
335
+ # Create a temporary dataset and dataloader for this scenario
336
+ scenario_dataset = MusicRecommenderDataset(
337
+ scenario_data,
338
+ mode='test',
339
+ encoders=self.encoders
340
+ )
341
+
342
+ scenario_loader = DataLoader(
343
+ scenario_dataset,
344
+ batch_size=self.batch_size,
345
+ shuffle=False
346
+ )
347
+
348
+ # Collect predictions and true values
349
+ true_values = []
350
+ predictions = []
351
+
352
+ with torch.no_grad():
353
+ for batch in scenario_loader:
354
+ batch = {k: v.to(self.device) for k, v in batch.items()}
355
+ pred = self.model(batch)
356
+ true_values.extend(batch['playcount'].cpu().numpy())
357
+ predictions.extend(pred.cpu().numpy())
358
+
359
+ true_values = np.array(true_values)
360
+ predictions = np.array(predictions)
361
+
362
+ # Calculate metrics
363
+ metrics = {
364
+ 'count': len(true_values),
365
+ 'mse': float(mean_squared_error(true_values, predictions)),
366
+ 'rmse': float(np.sqrt(mean_squared_error(true_values, predictions))),
367
+ 'mae': float(mean_absolute_error(true_values, predictions)),
368
+ 'r2': float(r2_score(true_values, predictions)),
369
+ 'pred_mean': float(np.mean(predictions)),
370
+ 'pred_std': float(np.std(predictions)),
371
+ 'true_mean': float(np.mean(true_values)),
372
+ 'true_std': float(np.std(true_values))
373
+ }
374
+
375
+ results[scenario_name] = metrics
376
+
377
+ # Log results for this scenario
378
+ logger.info(f"\n{scenario_name} Metrics (n={metrics['count']}):")
379
+ for metric, value in metrics.items():
380
+ if metric != 'count':
381
+ logger.info(f"{metric}: {value:.4f}")
382
+
383
+ return results
384
+
385
+ def save_evaluation_results(self, save_dir: str = 'metrics'):
386
+ """Run all evaluations and save results."""
387
+ os.makedirs(save_dir, exist_ok=True)
388
+
389
+ # Calculate all metrics
390
+ results = {
391
+ 'basic_metrics': self.calculate_metrics(),
392
+ 'bias_analysis': self.analyze_prediction_bias(),
393
+ 'top_k_metrics': self.evaluate_top_k_recommendations(),
394
+ 'cold_start_metrics': self.evaluate_cold_start(min_interactions=5)
395
+ }
396
+
397
+ # Save results to JSON
398
+ results_file = os.path.join(save_dir, 'evaluation_results.json')
399
+ with open(results_file, 'w') as f:
400
+ json.dump(results, f, indent=4)
401
+
402
+ logger.info(f"Evaluation completed. Results saved to: {save_dir}")
403
+
404
+ return results
405
+
406
+ def tune_hyperparameters(self, param_grid: Dict[str, List], val_data: pd.DataFrame) -> Dict:
407
+ """
408
+ Tune hyperparameters using validation set.
409
+
410
+ Args:
411
+ param_grid: Dictionary of parameters to try
412
+ val_data: Validation data
413
+
414
+ Returns:
415
+ Best parameters found
416
+ """
417
+ best_score = float('inf')
418
+ best_params = None
419
+
420
+ # Create validation dataset
421
+ val_dataset = MusicRecommenderDataset(val_data, mode='test', encoders=self.encoders)
422
+ val_loader = DataLoader(val_dataset, batch_size=self.batch_size, shuffle=False)
423
+
424
+ # Try all parameter combinations
425
+ for params in ParameterGrid(param_grid):
426
+ # Create a new config with updated parameters
427
+ current_config = self.config.copy()
428
+ current_config.update(params)
429
+
430
+ # Initialize model with current parameters
431
+ self.model = self._initialize_model(custom_config=current_config)
432
+
433
+ # Evaluate on validation set
434
+ metrics = self.calculate_metrics()
435
+ score = metrics['rmse'] # Use RMSE as scoring metric
436
+
437
+ if score < best_score:
438
+ best_score = score
439
+ best_params = params
440
+ logger.info(f"New best parameters found: {params} (RMSE: {score:.4f})")
441
+
442
+ return best_params
443
+
444
+ def main():
445
+ # Load test data and check for data compatibility
446
+ ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
447
+ test_path = os.path.join(ROOT_DIR, 'data', 'test_data.csv')
448
+ model_path = os.path.join(ROOT_DIR, 'data_engineered_v3', 'rs_main_v2_refactored', 'checkpoints', 'best_model.pth')
449
+
450
+ test_data = pd.read_csv(test_path)
451
+ logger.info(f"Loaded test data with {len(test_data)} samples")
452
+
453
+ # Split test data into validation and test
454
+ val_data, test_data = train_test_split(test_data, test_size=0.5, random_state=42)
455
+
456
+ try:
457
+ # Initialize evaluator
458
+ evaluator = ModelEvaluator(
459
+ model_path=model_path,
460
+ test_data=test_data,
461
+ batch_size=32
462
+ )
463
+
464
+ # Tune hyperparameters
465
+ param_grid = {
466
+ 'embedding_dim': [32, 64, 128],
467
+ 'dropout': [0.1, 0.2, 0.3],
468
+ 'hidden_layers': [[128, 64], [256, 128, 64], [512, 256, 128]]
469
+ }
470
+
471
+ best_params = evaluator.tune_hyperparameters(param_grid, val_data)
472
+ logger.info(f"Best parameters: {best_params}")
473
+
474
+ # Run evaluation
475
+ results = evaluator.save_evaluation_results()
476
+
477
+ # Print summary
478
+ logger.info("\nEvaluation Summary:")
479
+ logger.info("Basic Metrics:")
480
+ for metric, value in results['basic_metrics'].items():
481
+ logger.info(f"{metric}: {value:.4f}")
482
+
483
+ logger.info("\nTop-K Metrics:")
484
+ for metric, value in results['top_k_metrics'].items():
485
+ logger.info(f"{metric}: {value:.4f}")
486
+
487
+ logger.info("\nBias Analysis:")
488
+ for range_name, bias in results['bias_analysis'].items():
489
+ logger.info(f"{range_name}: {bias:.4f}")
490
+
491
+ except Exception as e:
492
+ logger.error(f"Error during evaluation: {str(e)}")
493
+ raise
494
+
495
+ if __name__ == "__main__":
496
+ main()
497
+
generate_recommendations.py ADDED
@@ -0,0 +1,312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import pandas as pd
4
+ import numpy as np
5
+ import json
6
+ import logging
7
+ from sklearn.preprocessing import LabelEncoder
8
+ from torch.utils.data import DataLoader
9
+ import os
10
+ from train_model import HybridMusicRecommender, MusicRecommenderDataset
11
+
12
+ # Set up logging
13
+ logging.basicConfig(level=logging.INFO)
14
+ logger = logging.getLogger(__name__)
15
+
16
+ # Add safe globals for numpy types
17
+ torch.serialization.add_safe_globals([
18
+ np.generic, # Allow numpy scalar types
19
+ np.ndarray, # Allow numpy arrays
20
+ np.dtype, # Allow numpy dtypes
21
+ np.float64, # Allow specific numpy types
22
+ np.float32,
23
+ np.int64,
24
+ np.int32
25
+ ])
26
+
27
+ class RecommendationGenerator:
28
+ def __init__(self, model_path: str, catalog_data: pd.DataFrame, encoders_path: str):
29
+ self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
30
+ self.catalog_data = catalog_data
31
+
32
+ # Load model checkpoint with safety settings
33
+ logger.info(f"Loading model from {model_path}")
34
+ try:
35
+ self.checkpoint = torch.load(model_path, map_location=self.device)
36
+ logger.info("Model loaded successfully")
37
+ except Exception as e:
38
+ logger.error(f"Error loading model: {str(e)}")
39
+ raise
40
+
41
+ # Get config and encoders from the checkpoint
42
+ self.config = self.checkpoint.get('config', {})
43
+ if not self.config:
44
+ # Try loading from config file as fallback
45
+ try:
46
+ with open('config/model_config.json', 'r') as f:
47
+ self.config = json.load(f)
48
+ except FileNotFoundError:
49
+ logger.warning("Config file not found, using default values")
50
+ self.config = {
51
+ 'embedding_dim': 64,
52
+ 'hidden_layers': [256, 128, 64],
53
+ 'dropout': 0.3
54
+ }
55
+
56
+ # Load encoders with safety settings
57
+ torch.serialization.add_safe_globals([LabelEncoder])
58
+ self.encoders = torch.load(encoders_path, weights_only=False)
59
+
60
+ # Print shape info for debugging
61
+ logger.info("Encoder class counts:")
62
+ for key, encoder in self.encoders.items():
63
+ if isinstance(encoder, LabelEncoder):
64
+ logger.info(f"{key}: {len(encoder.classes_)}")
65
+
66
+ # Get state dict dimensions with safety checks
67
+ state_dict = self.checkpoint['model_state_dict']
68
+ self.embedding_dims = {
69
+ 'num_users': state_dict['user_embedding.weight'].shape[0],
70
+ 'num_music': state_dict['music_embedding.weight'].shape[0],
71
+ 'num_artists': state_dict['artist_embedding.weight'].shape[0],
72
+ 'num_genres': len(self.encoders['genre_encoder'].classes_),
73
+ 'num_numerical': 12
74
+ }
75
+
76
+ logger.info("Model dimensions from state dict:")
77
+ for key, value in self.embedding_dims.items():
78
+ logger.info(f"{key}: {value}")
79
+
80
+ # Safety check for catalog data
81
+ max_music_id = self.catalog_data['music_id'].nunique()
82
+ if max_music_id >= self.embedding_dims['num_music']:
83
+ logger.warning(f"Catalog contains music IDs larger than model capacity. Filtering out excess items.")
84
+ valid_music_ids = set(self.encoders['music_encoder'].transform(
85
+ self.encoders['music_encoder'].classes_[:self.embedding_dims['num_music']]
86
+ ))
87
+ self.catalog_data = self.catalog_data[
88
+ self.catalog_data['music_id'].apply(
89
+ lambda x: self.encoders['music_encoder'].transform([x])[0] in valid_music_ids
90
+ )
91
+ ]
92
+ logger.info(f"Filtered catalog size: {len(self.catalog_data)}")
93
+
94
+ self.model = self._initialize_model(self.embedding_dims)
95
+
96
+ def _initialize_model(self, embedding_dims):
97
+ """Initialize and load the model from checkpoint."""
98
+ # Get dimensions from encoders
99
+ model = HybridMusicRecommender(
100
+ num_users=embedding_dims['num_users'],
101
+ num_music=embedding_dims['num_music'],
102
+ num_artists=embedding_dims['num_artists'],
103
+ num_genres=embedding_dims['num_genres'],
104
+ num_numerical=embedding_dims['num_numerical'],
105
+ embedding_dim=64,
106
+ layers=[256, 128, 64],
107
+ dropout=0.2
108
+ )
109
+
110
+ # Load state dict from checkpoint
111
+ state_dict = self.checkpoint['model_state_dict']
112
+ model.load_state_dict(state_dict)
113
+
114
+ # Move model to device and set to eval mode
115
+ model = model.to(self.device)
116
+ model.eval()
117
+
118
+ return model
119
+
120
+ def generate_recommendations(self, user_info: dict, n_recommendations: int = 10) -> pd.DataFrame:
121
+ """
122
+ Generate music recommendations for a specific user.
123
+
124
+ Args:
125
+ user_info: Dictionary containing user information (age, gender, user_id)
126
+ n_recommendations: Number of recommendations to generate
127
+
128
+ Returns:
129
+ DataFrame containing recommended songs with predicted play counts
130
+ """
131
+ # Create a temporary DataFrame with all songs for the user
132
+ user_candidates = self.catalog_data.copy()
133
+ user_candidates['age'] = user_info['age']
134
+ user_candidates['gender'] = user_info['gender']
135
+ user_candidates['user_id'] = user_info['user_id']
136
+
137
+ # Debug user encoding with more detailed error handling
138
+ try:
139
+ encoded_user = self.encoders['user_encoder'].transform([user_info['user_id']])[0]
140
+ logger.info(f"User ID {user_info['user_id']} encoded as: {encoded_user}")
141
+ except Exception as e:
142
+ logger.warning(f"Error encoding user ID: {str(e)}")
143
+ logger.warning("Using default encoding (0)")
144
+ encoded_user = 0
145
+ user_candidates['user_id'] = '0' # Use default user ID
146
+
147
+ # Debug catalog data
148
+ print(f"\nCatalog Statistics:")
149
+ print(f"Total songs: {len(user_candidates)}")
150
+ print(f"Unique artists: {user_candidates['artist_name'].nunique()}")
151
+ print(f"Unique genres: {user_candidates['main_genre'].nunique()}")
152
+
153
+ try:
154
+ # Create dataset with safety checks
155
+ test_dataset = MusicRecommenderDataset(
156
+ user_candidates,
157
+ mode='test',
158
+ encoders=self.encoders,
159
+ embedding_dims=self.embedding_dims # Pass embedding dimensions
160
+ )
161
+ test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False)
162
+
163
+ # Generate predictions
164
+ predictions = []
165
+ indices = []
166
+
167
+ with torch.no_grad():
168
+ for i, batch in enumerate(test_loader):
169
+ batch = {k: v.to(self.device) for k, v in batch.items()}
170
+ pred = self.model(batch)
171
+ predictions.extend(pred.cpu().numpy())
172
+ indices.extend(range(i * test_loader.batch_size,
173
+ min((i + 1) * test_loader.batch_size, len(test_dataset))))
174
+ except Exception as e:
175
+ logger.error(f"Error generating recommendations: {str(e)}")
176
+ raise
177
+
178
+ # Create recommendations DataFrame and ensure uniqueness
179
+ recommendations = pd.DataFrame({
180
+ 'music': user_candidates['music'].values[indices],
181
+ 'artist_name': user_candidates['artist_name'].values[indices],
182
+ 'genre': user_candidates['main_genre'].values[indices],
183
+ 'predicted_plays': predictions
184
+ })
185
+
186
+ # Drop duplicates keeping first occurrence (highest predicted play count)
187
+ recommendations = recommendations.drop_duplicates(subset=['music'], keep='first')
188
+
189
+ # Convert predictions to scalar values and sort
190
+ recommendations['predicted_plays'] = recommendations['predicted_plays'].apply(lambda x: float(x[0]))
191
+
192
+ # Sort by predicted plays and get top N recommendations
193
+ recommendations = recommendations.sort_values('predicted_plays', ascending=False)
194
+ recommendations = recommendations.head(n_recommendations)
195
+
196
+ # Debug predictions
197
+ print(f"\nPrediction Statistics:")
198
+ min_pred = recommendations['predicted_plays'].min()
199
+ max_pred = recommendations['predicted_plays'].max()
200
+ std_pred = recommendations['predicted_plays'].std()
201
+ print(f"Prediction range: {min_pred:.2f} to {max_pred:.2f}")
202
+ print(f"Prediction std: {std_pred:.2f}")
203
+
204
+ # Print top recommendations with better formatting
205
+ print("\nTop 10 Recommended Songs:")
206
+ pd.set_option('display.max_columns', None)
207
+ pd.set_option('display.width', None)
208
+ print(recommendations.to_string(index=False, float_format=lambda x: '{:.2f}'.format(x) if isinstance(x, (float, np.float32, np.float64)) else str(x)))
209
+
210
+ return recommendations.reset_index(drop=True)
211
+
212
+ class HybridMusicRecommender(nn.Module):
213
+ def __init__(self, num_users, num_music, num_artists, num_genres, num_numerical,
214
+ embedding_dim=64, layers=[256, 128, 64], dropout=0.2):
215
+ super().__init__()
216
+
217
+ # Embedding layers
218
+ self.user_embedding = nn.Embedding(num_users, embedding_dim)
219
+ self.music_embedding = nn.Embedding(num_music, embedding_dim)
220
+ self.artist_embedding = nn.Embedding(num_artists, embedding_dim)
221
+ self.genre_embedding = nn.Embedding(num_genres, embedding_dim)
222
+
223
+ # Feature processing layers with residual connections
224
+ self.numerical_layer = nn.Sequential(
225
+ nn.Linear(num_numerical, embedding_dim),
226
+ nn.ReLU(),
227
+ nn.BatchNorm1d(embedding_dim)
228
+ )
229
+
230
+ self.binary_layer = nn.Sequential(
231
+ nn.Linear(2, embedding_dim),
232
+ nn.ReLU(),
233
+ nn.BatchNorm1d(embedding_dim)
234
+ )
235
+
236
+ # Calculate total input features
237
+ total_features = embedding_dim * 6 # 4 embeddings + numerical + binary
238
+
239
+ # MLP layers with residual connections
240
+ self.fc_layers = nn.ModuleList()
241
+ input_dim = total_features
242
+
243
+ for layer_size in layers:
244
+ self.fc_layers.append(nn.ModuleDict({
245
+ 'main': nn.Sequential(
246
+ nn.Linear(input_dim, layer_size),
247
+ nn.ReLU(),
248
+ nn.BatchNorm1d(layer_size),
249
+ nn.Dropout(dropout)
250
+ ),
251
+ 'residual': nn.Linear(input_dim, layer_size) if input_dim != layer_size else None
252
+ }))
253
+ input_dim = layer_size
254
+
255
+ self.final_layer = nn.Linear(layers[-1], 1)
256
+
257
+ def forward(self, batch):
258
+ # Get embeddings
259
+ user_emb = self.user_embedding(batch['user_id'])
260
+ music_emb = self.music_embedding(batch['music_id'])
261
+ artist_emb = self.artist_embedding(batch['artist_id'])
262
+ genre_emb = self.genre_embedding(batch['genre_id'])
263
+
264
+ # Process numerical features
265
+ numerical = self.numerical_layer(batch['numerical_features'])
266
+
267
+ # Process binary features
268
+ binary = torch.stack([batch['explicit'], batch['gender']], dim=1).float()
269
+ binary = self.binary_layer(binary)
270
+
271
+ # Concatenate all features
272
+ x = torch.cat([
273
+ user_emb, music_emb, artist_emb, genre_emb, numerical, binary
274
+ ], dim=1)
275
+
276
+ # Apply MLP layers with residual connections
277
+ for layer in self.fc_layers:
278
+ identity = x
279
+ x = layer['main'](x)
280
+ if layer['residual'] is not None:
281
+ x = x + layer['residual'](identity)
282
+
283
+ # Final prediction
284
+ return self.final_layer(x)
285
+
286
+ def main():
287
+ # Example usage
288
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
289
+ model_path = 'checkpoints/best_model.pth'
290
+ catalog_data = pd.read_csv(os.path.join(BASE_DIR, 'data', 'test_data.csv'))
291
+ encoders_path = os.path.join(BASE_DIR, 'data', 'data_encoders.pt')
292
+
293
+ # Initialize recommendation generator
294
+ recommender = RecommendationGenerator(model_path, catalog_data, encoders_path)
295
+
296
+ # Example user
297
+ user_info = {
298
+ 'age': 32,
299
+ 'gender': 'M',
300
+ 'genre': 'Pop',
301
+ 'music': 'Shape of You',
302
+ 'user_id': '44d39c6e5e7b45bfc2187fb3c89be58c5a3dc6a54d2a0075402c551c14ea1459'
303
+ }
304
+
305
+ # Generate recommendations
306
+ recommendations = recommender.generate_recommendations(user_info, n_recommendations=10)
307
+
308
+ print("\nTop 10 Recommended Songs:")
309
+ print(recommendations.to_string(index=False))
310
+
311
+ if __name__ == "__main__":
312
+ main()
metrics/evaluation_results.json ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "basic_metrics": {
3
+ "mse": 3079.0234375,
4
+ "rmse": 55.488948822021484,
5
+ "mae": 23.4454402923584,
6
+ "r2": -0.21279525756835938,
7
+ "pred_mean": -1.0994174480438232,
8
+ "pred_std": 9.724736213684082,
9
+ "true_mean": 19.224706649780273,
10
+ "true_std": 50.38633346557617
11
+ },
12
+ "bias_analysis": {
13
+ "bias_range_3": -2.6668460369110107,
14
+ "bias_range_4": -67.3138656616211
15
+ },
16
+ "top_k_metrics": {
17
+ "ndcg@10": 0.76645658997246,
18
+ "precision@10": 0.8794117647058824,
19
+ "recall@10": 0.8794117647058824
20
+ },
21
+ "cold_start_metrics": {
22
+ "cold_user_warm_item": {
23
+ "count": 139,
24
+ "mse": 1254.147705078125,
25
+ "rmse": 35.41394805908203,
26
+ "mae": 24.895784378051758,
27
+ "r2": -0.9901391267776489,
28
+ "pred_mean": 1.0831069946289062,
29
+ "pred_std": 11.065825462341309,
30
+ "true_mean": 23.73381233215332,
31
+ "true_std": 25.103404998779297
32
+ },
33
+ "warm_user_cold_item": {
34
+ "count": 1751,
35
+ "mse": 365.7469177246094,
36
+ "rmse": 19.12451171875,
37
+ "mae": 12.106451034545898,
38
+ "r2": -0.924481987953186,
39
+ "pred_mean": -0.9319719672203064,
40
+ "pred_std": 10.093915939331055,
41
+ "true_mean": 7.401484966278076,
42
+ "true_std": 13.785845756530762
43
+ },
44
+ "cold_both": {
45
+ "count": 4107,
46
+ "mse": 169.58038330078125,
47
+ "rmse": 13.022303581237793,
48
+ "mae": 8.721110343933105,
49
+ "r2": -1.5553205013275146,
50
+ "pred_mean": -1.2563493251800537,
51
+ "pred_std": 8.511791229248047,
52
+ "true_mean": 4.080350399017334,
53
+ "true_std": 8.14638900756836
54
+ },
55
+ "warm_both": {
56
+ "count": 714,
57
+ "mse": 26994.263671875,
58
+ "rmse": 164.29931640625,
59
+ "mae": 136.50509643554688,
60
+ "r2": -2.396286725997925,
61
+ "pred_mean": -1.9450238943099976,
62
+ "pred_std": 13.863030433654785,
63
+ "true_mean": 134.4537811279297,
64
+ "true_std": 89.15250396728516
65
+ }
66
+ }
67
+ }
metrics/training_metrics_20250102_064900.json ADDED
@@ -0,0 +1,290 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 27.87820368424011,
4
+ 0.8559115440289997,
5
+ 0.5168477836848956,
6
+ 0.421229469199382,
7
+ 0.33146533420268165,
8
+ 0.31913505295583317,
9
+ 0.27628301501810504,
10
+ 0.1922393307175275,
11
+ 0.22288809188706446,
12
+ 0.2036261794325318,
13
+ 0.17079091021242918,
14
+ 0.13815377909827187,
15
+ 0.1524550925849648,
16
+ 0.1501235003079158,
17
+ 0.1421720849812809,
18
+ 0.1081244022875753,
19
+ 0.09324924281689256,
20
+ 0.1108920008247671,
21
+ 0.09771170746442961,
22
+ 0.09051197385297546,
23
+ 0.08150478607652226,
24
+ 0.0860889327385952,
25
+ 0.05988402931827203,
26
+ 0.049674075748550386,
27
+ 0.05377031577186647,
28
+ 0.04540467359397495,
29
+ 0.04073900714773785,
30
+ 0.03540054572981199,
31
+ 0.033688442806066365,
32
+ 0.025686628671688663
33
+ ],
34
+ "train_rmse": [
35
+ 3.6065338792777895,
36
+ 0.7172188698897799,
37
+ 0.5629538247819917,
38
+ 0.4971097810866635,
39
+ 0.4503646820492115,
40
+ 0.4126986173330652,
41
+ 0.3966659381984858,
42
+ 0.3457994023430261,
43
+ 0.3494550960797524,
44
+ 0.33324397309356185,
45
+ 0.3095208795818895,
46
+ 0.2862384810888418,
47
+ 0.2971145911978121,
48
+ 0.294086353497263,
49
+ 0.2809138228068532,
50
+ 0.2536127242472163,
51
+ 0.24007327436595324,
52
+ 0.2581924051221915,
53
+ 0.231609092571742,
54
+ 0.23556566189850986,
55
+ 0.21719404996320857,
56
+ 0.22204710487363657,
57
+ 0.18534403303185937,
58
+ 0.17526732037716256,
59
+ 0.16678127027175485,
60
+ 0.16144292278880193,
61
+ 0.15759382268230296,
62
+ 0.151095087343919,
63
+ 0.1478537986232017,
64
+ 0.13138720508414045
65
+ ],
66
+ "train_mae": [
67
+ 2.485820442273081,
68
+ 0.39211485435879684,
69
+ 0.2973032114626486,
70
+ 0.26411598030760697,
71
+ 0.23414922938269528,
72
+ 0.21794895377434506,
73
+ 0.20361037203405477,
74
+ 0.18592927409218082,
75
+ 0.1848273886002223,
76
+ 0.1786883569593671,
77
+ 0.1653798102177208,
78
+ 0.1611096473599348,
79
+ 0.1563368417393369,
80
+ 0.1569892016263042,
81
+ 0.15296285591217912,
82
+ 0.1440688233728273,
83
+ 0.13509617341517272,
84
+ 0.14298199075922557,
85
+ 0.1298971869982779,
86
+ 0.1322182358855594,
87
+ 0.12218869595988831,
88
+ 0.12325722614562587,
89
+ 0.10556309332752813,
90
+ 0.10367214477538497,
91
+ 0.09859485125546402,
92
+ 0.09540063718958652,
93
+ 0.091572887579545,
94
+ 0.08790545361234417,
95
+ 0.08544569545354741,
96
+ 0.0796616122427196
97
+ ],
98
+ "train_ndcg": [
99
+ 0.7553261820231697,
100
+ 0.980978106254641,
101
+ 0.9915008039414128,
102
+ 0.9941110056412371,
103
+ 0.9949865918370742,
104
+ 0.9959262692475621,
105
+ 0.996802295404899,
106
+ 0.9977287187983718,
107
+ 0.9980168807544286,
108
+ 0.9981021317122858,
109
+ 0.9982030255885064,
110
+ 0.9981919676065445,
111
+ 0.9981716039437282,
112
+ 0.9983992185207862,
113
+ 0.9986318444149404,
114
+ 0.9986614803724652,
115
+ 0.9986458724435372,
116
+ 0.9988089872500564,
117
+ 0.9986771755392039,
118
+ 0.9989267108561117,
119
+ 0.9989624058332625,
120
+ 0.9990676654667794,
121
+ 0.9993524018533623,
122
+ 0.9992948143353945,
123
+ 0.9993984651150583,
124
+ 0.9994121940830086,
125
+ 0.9994110327355469,
126
+ 0.9993546765439117,
127
+ 0.9993868231584754,
128
+ 0.9994757758288444
129
+ ],
130
+ "val_loss": [
131
+ 2.6038931080887857,
132
+ 0.42139411665184395,
133
+ 0.5583879465342197,
134
+ 0.5912148774745809,
135
+ 0.1528182963211037,
136
+ 0.0660524533038408,
137
+ 0.06361346382936331,
138
+ 0.2829914318502579,
139
+ 0.08077898435294628,
140
+ 0.1952337881510841,
141
+ 0.021767998960288897,
142
+ 0.08877882309926963,
143
+ 0.10638422484863812,
144
+ 0.09464026343497173,
145
+ 0.17117542348487277,
146
+ 0.01830679320559745,
147
+ 0.23323201920351827,
148
+ 0.019560120029138848,
149
+ 0.35590659407898784,
150
+ 0.02099220870836625,
151
+ 0.044291495658706506,
152
+ 0.07464934456404823,
153
+ 0.012729868114906244,
154
+ 0.03145649619269329,
155
+ 0.050918724355091094,
156
+ 0.03800152110109683,
157
+ 0.017424330367824772,
158
+ 0.021061579725528006,
159
+ 0.022086826497426545,
160
+ 0.09187827698728988
161
+ ],
162
+ "val_rmse": [
163
+ 1.227388935805597,
164
+ 0.5224974024123069,
165
+ 0.6048934326354144,
166
+ 0.6049047626572546,
167
+ 0.3302447454209666,
168
+ 0.23142119054455396,
169
+ 0.2183617163470732,
170
+ 0.4530892844997041,
171
+ 0.24832345713733542,
172
+ 0.3671097701498112,
173
+ 0.12747864468838,
174
+ 0.2430218135282559,
175
+ 0.30256272023257963,
176
+ 0.2506676406163341,
177
+ 0.3361681103043667,
178
+ 0.12415225520053427,
179
+ 0.40363619780248056,
180
+ 0.1291709818860191,
181
+ 0.4182344907318643,
182
+ 0.12986300297695713,
183
+ 0.1892241361203728,
184
+ 0.21875232263482927,
185
+ 0.10009871166199444,
186
+ 0.15774307681073538,
187
+ 0.18965065946268103,
188
+ 0.16470045194214208,
189
+ 0.1186338556556314,
190
+ 0.126187734792172,
191
+ 0.1361035455701023,
192
+ 0.24475607175453948
193
+ ],
194
+ "val_mae": [
195
+ 0.48379497796716825,
196
+ 0.23567856250094696,
197
+ 0.23373650455139053,
198
+ 0.23686996742453373,
199
+ 0.14755814968490263,
200
+ 0.11753897017366449,
201
+ 0.10286616764857735,
202
+ 0.19093803421292507,
203
+ 0.11378036680775629,
204
+ 0.1527806678918046,
205
+ 0.06928311026012393,
206
+ 0.0994793389412299,
207
+ 0.13523404830148522,
208
+ 0.10427081506227104,
209
+ 0.1191780242386838,
210
+ 0.0704273562091337,
211
+ 0.14606773890030217,
212
+ 0.07778757238681887,
213
+ 0.12943885727247723,
214
+ 0.06381919528816787,
215
+ 0.08109805966451974,
216
+ 0.08783078723600213,
217
+ 0.05034292317454664,
218
+ 0.07293910756182502,
219
+ 0.07728687141248038,
220
+ 0.06920250056600066,
221
+ 0.05822602801129852,
222
+ 0.054009364550592194,
223
+ 0.06341128547111867,
224
+ 0.09263877749023303
225
+ ],
226
+ "val_ndcg": [
227
+ 0.9763069874803785,
228
+ 0.9905599171007183,
229
+ 0.9956201222580923,
230
+ 0.9944330084491784,
231
+ 0.9976292898957159,
232
+ 0.9979534023244616,
233
+ 0.9982731333920654,
234
+ 0.99887366362021,
235
+ 0.9985417631310476,
236
+ 0.9982523078649816,
237
+ 0.9987894985037791,
238
+ 0.9986976905607842,
239
+ 0.9984535944293922,
240
+ 0.9988085778666215,
241
+ 0.9989596126784741,
242
+ 0.999552890448503,
243
+ 0.9992313611675316,
244
+ 0.9991534839213734,
245
+ 0.9993672387700685,
246
+ 0.9993135954292727,
247
+ 0.9997000123413515,
248
+ 0.9991327692085589,
249
+ 0.9997313878905605,
250
+ 0.9998314808791792,
251
+ 0.9997146868369948,
252
+ 0.999613323681791,
253
+ 0.9994647427343987,
254
+ 0.9998794181246153,
255
+ 0.9998371995670695,
256
+ 0.999895690192639
257
+ ],
258
+ "lr": [
259
+ 0.001,
260
+ 0.001,
261
+ 0.001,
262
+ 0.001,
263
+ 0.001,
264
+ 0.001,
265
+ 0.001,
266
+ 0.001,
267
+ 0.001,
268
+ 0.001,
269
+ 0.001,
270
+ 0.001,
271
+ 0.001,
272
+ 0.001,
273
+ 0.001,
274
+ 0.001,
275
+ 0.001,
276
+ 0.001,
277
+ 0.001,
278
+ 0.001,
279
+ 0.001,
280
+ 0.0005,
281
+ 0.0005,
282
+ 0.0005,
283
+ 0.0005,
284
+ 0.0005,
285
+ 0.0005,
286
+ 0.0005,
287
+ 0.00025,
288
+ 0.00025
289
+ ]
290
+ }
metrics/training_metrics_20250102_200715.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 16.630361146328948,
4
+ 1.0519671638413697,
5
+ 0.6806203248362422,
6
+ 0.5999031775878577,
7
+ 0.38576608685529024,
8
+ 0.37990841519712365,
9
+ 0.32125464765520034,
10
+ 0.32947756348714186,
11
+ 0.2796809829740573,
12
+ 0.26263155958606405,
13
+ 0.22337860409450375,
14
+ 0.21770194551282668,
15
+ 0.20779085973472206,
16
+ 0.19294912434887448,
17
+ 0.16268228239429927,
18
+ 0.14605150811663015,
19
+ 0.10150069270660228,
20
+ 0.09985721124044349,
21
+ 0.08507130466603462,
22
+ 0.07544498139980567
23
+ ],
24
+ "train_rmse": [
25
+ 2.863982798072898,
26
+ 0.8541538475465146,
27
+ 0.6655497856482756,
28
+ 0.581696385112508,
29
+ 0.49990246750103334,
30
+ 0.4743720037700144,
31
+ 0.4505155451364705,
32
+ 0.43122559500317537,
33
+ 0.3971644740236298,
34
+ 0.39396504545080907,
35
+ 0.3645592624501923,
36
+ 0.35849524360048596,
37
+ 0.35538791011264326,
38
+ 0.323913015413718,
39
+ 0.30786606214792145,
40
+ 0.29631268685022677,
41
+ 0.25046254811820845,
42
+ 0.23011919047341975,
43
+ 0.22660661390438122,
44
+ 0.22238455647548008
45
+ ],
46
+ "train_mae": [
47
+ 2.03278648278004,
48
+ 0.5439351351012157,
49
+ 0.40516641280979293,
50
+ 0.33099308163163405,
51
+ 0.2850040086910506,
52
+ 0.26743246170491736,
53
+ 0.25230235576959725,
54
+ 0.23815869162731532,
55
+ 0.22401378526576335,
56
+ 0.21376478848860989,
57
+ 0.19854636769741774,
58
+ 0.19313653017971902,
59
+ 0.19581266243270115,
60
+ 0.17797640798896364,
61
+ 0.17057573761720257,
62
+ 0.16374789397644846,
63
+ 0.14231451646766707,
64
+ 0.136660557045731,
65
+ 0.13092111585119479,
66
+ 0.1310928447372457
67
+ ],
68
+ "train_ndcg": [
69
+ 0.7903884568124939,
70
+ 0.9611835469362102,
71
+ 0.9845947593073302,
72
+ 0.9888029080591624,
73
+ 0.9926418597939648,
74
+ 0.9949627612965016,
75
+ 0.9956346042925799,
76
+ 0.9959749847273284,
77
+ 0.995856225396259,
78
+ 0.9971607260500328,
79
+ 0.9975389946676507,
80
+ 0.9979873643834379,
81
+ 0.9976527691830562,
82
+ 0.9976573833559133,
83
+ 0.9981214035349556,
84
+ 0.9984748543629164,
85
+ 0.9988606087391889,
86
+ 0.9986500904152665,
87
+ 0.9987482092803037,
88
+ 0.9989969030588488
89
+ ],
90
+ "val_loss": [
91
+ 0.9391880847618613,
92
+ 0.33018025593228745,
93
+ 0.29448598827904376,
94
+ 0.10832524415053113,
95
+ 0.09883832279592752,
96
+ 0.3074022309172531,
97
+ 0.04706974979490042,
98
+ 4398.830707835696,
99
+ 0.06168749292289287,
100
+ 0.04185816639719505,
101
+ 0.3049863429123562,
102
+ 0.10778629867701044,
103
+ 0.06723947737785713,
104
+ 0.15211456833066236,
105
+ 0.07834466032250981,
106
+ 0.11750198668524833,
107
+ 0.06605192532920291,
108
+ 0.037398795541507046,
109
+ 0.06266450706515199,
110
+ 0.12772463355869265
111
+ ],
112
+ "val_rmse": [
113
+ 0.8742571992372088,
114
+ 0.5188966228554525,
115
+ 0.44921875046319315,
116
+ 0.2970077133693569,
117
+ 0.27803433719802095,
118
+ 0.44352033814287356,
119
+ 0.1965003144412618,
120
+ 8.122202649888228,
121
+ 0.2323713941352663,
122
+ 0.18472808669509327,
123
+ 0.45586269918615224,
124
+ 0.2856760431654221,
125
+ 0.23925698861051023,
126
+ 0.3356445257421406,
127
+ 0.22166776637524868,
128
+ 0.28559799659439566,
129
+ 0.23039545566113326,
130
+ 0.17412639513748637,
131
+ 0.22186359509402045,
132
+ 0.31559877438923417
133
+ ],
134
+ "val_mae": [
135
+ 0.5880991115536488,
136
+ 0.2766197122318644,
137
+ 0.275182307186261,
138
+ 0.18265998478926404,
139
+ 0.15468566203621073,
140
+ 0.2013326367022286,
141
+ 0.11106940243445651,
142
+ 1.5140733947111686,
143
+ 0.13223919471804524,
144
+ 0.1058114748185789,
145
+ 0.18697005872365455,
146
+ 0.14604388649614763,
147
+ 0.1279687943383002,
148
+ 0.17097019593060855,
149
+ 0.095513791265622,
150
+ 0.1156781678363471,
151
+ 0.11046315509248787,
152
+ 0.0784462515894376,
153
+ 0.0981923619836149,
154
+ 0.12334266032131624
155
+ ],
156
+ "val_ndcg": [
157
+ 0.9549657870346392,
158
+ 0.9888905731725021,
159
+ 0.9928302638967272,
160
+ 0.9962951557737001,
161
+ 0.9976059718870781,
162
+ 0.9967397762016511,
163
+ 0.9963979788229499,
164
+ 0.9976575357813231,
165
+ 0.996619462966919,
166
+ 0.9973971952854748,
167
+ 0.9986196420562099,
168
+ 0.9986509705933047,
169
+ 0.9987828496476294,
170
+ 0.9985354710632647,
171
+ 0.9992627098526753,
172
+ 0.9986722528094977,
173
+ 0.9993009642815925,
174
+ 0.9996941467406044,
175
+ 0.9993367253894537,
176
+ 0.9993710811709015
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.0005,
195
+ 0.0005,
196
+ 0.0005,
197
+ 0.0005,
198
+ 0.0005
199
+ ]
200
+ }
metrics/training_metrics_20250102_203004.json ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1647.3079700711407,
4
+ 271.8049797589266,
5
+ 125.04480907585048,
6
+ 77.73157471493829,
7
+ 57.64490697353701,
8
+ 47.655617599245865,
9
+ 38.39268538318103,
10
+ 35.70278034481821,
11
+ 31.083040306085273,
12
+ 28.446285428880135,
13
+ 25.850659030902236,
14
+ 22.36630686928954,
15
+ 20.566794234740584,
16
+ 18.177497906020925,
17
+ 15.825210771983183,
18
+ 14.747446770154976,
19
+ 13.595882269400585,
20
+ 12.136639672744122,
21
+ 11.482755628567707
22
+ ],
23
+ "train_rmse": [
24
+ 36.2100092540611,
25
+ 15.789009180868153,
26
+ 10.837184203620641,
27
+ 8.55066505615135,
28
+ 7.395000940441376,
29
+ 6.741258009334249,
30
+ 6.064591712646066,
31
+ 5.836212617014259,
32
+ 5.463458494168958,
33
+ 5.219115193044183,
34
+ 4.991978818769204,
35
+ 4.644320877131546,
36
+ 4.456296742640931,
37
+ 4.190699669415659,
38
+ 3.9148655267239025,
39
+ 3.7699117465426917,
40
+ 3.6200522574294958,
41
+ 3.415201579531864,
42
+ 3.32776171304689
43
+ ],
44
+ "train_mae": [
45
+ 24.187040963504888,
46
+ 10.407274974297874,
47
+ 7.378058982423589,
48
+ 6.026885859196699,
49
+ 5.331949593145636,
50
+ 4.930537258145176,
51
+ 4.537671755386304,
52
+ 4.348816263524792,
53
+ 4.134116251068779,
54
+ 3.9585593863378596,
55
+ 3.805101910346671,
56
+ 3.5380139833764184,
57
+ 3.3881275284139414,
58
+ 3.198319486424893,
59
+ 2.985232395650465,
60
+ 2.8795697855044016,
61
+ 2.7671318642700773,
62
+ 2.594415445116502,
63
+ 2.544669221096401
64
+ ],
65
+ "train_ndcg": [
66
+ 0.8654950500430563,
67
+ 0.9803339956870561,
68
+ 0.9905076340029512,
69
+ 0.9933372302145898,
70
+ 0.9951020953587338,
71
+ 0.9954008313862583,
72
+ 0.9961625558288791,
73
+ 0.9965977871531173,
74
+ 0.9968882183296771,
75
+ 0.997179942794993,
76
+ 0.9975472675471366,
77
+ 0.9977047993223879,
78
+ 0.9980483460652677,
79
+ 0.9982810467481613,
80
+ 0.9984322096916693,
81
+ 0.9985130795195133,
82
+ 0.9987035832261737,
83
+ 0.9988488200344617,
84
+ 0.9990080705360521
85
+ ],
86
+ "val_loss": [
87
+ 305.71448699521346,
88
+ 160.61727652751225,
89
+ 80.21698145799233,
90
+ 98.31909397286428,
91
+ 49.420991561782195,
92
+ 59.082267438861685,
93
+ 43.67495231897059,
94
+ 72.63750117933246,
95
+ 48.056477439235636,
96
+ 41.66889061726315,
97
+ 35.77338268387486,
98
+ 35.76565934570743,
99
+ 31.368162182015432,
100
+ 33.274764087838186,
101
+ 33.155672825558085,
102
+ 35.2773457245088,
103
+ 27.710626266372035,
104
+ 31.434065845650686,
105
+ 34.327566388627176
106
+ ],
107
+ "val_rmse": [
108
+ 17.022804091540404,
109
+ 12.271968236097596,
110
+ 8.72418977659167,
111
+ 9.709547110801775,
112
+ 6.7575173606994605,
113
+ 7.409723379025435,
114
+ 6.299271141309055,
115
+ 8.006477652290222,
116
+ 6.648790959508824,
117
+ 6.184272301984485,
118
+ 5.669115998567993,
119
+ 5.690017370100179,
120
+ 5.339802895383791,
121
+ 5.477513496694701,
122
+ 5.518767848296002,
123
+ 5.65460351262253,
124
+ 5.089552422218077,
125
+ 5.38412636710746,
126
+ 5.598072784959465
127
+ ],
128
+ "val_mae": [
129
+ 10.921298624764026,
130
+ 8.098800907672292,
131
+ 5.978513751231449,
132
+ 6.6365152278416595,
133
+ 4.7836375807372615,
134
+ 5.320080206427775,
135
+ 4.492307612593745,
136
+ 5.221484758484531,
137
+ 4.820733540494677,
138
+ 4.5011892285145505,
139
+ 4.127895778333637,
140
+ 4.077923868743467,
141
+ 3.8279382947465064,
142
+ 3.8839682491732317,
143
+ 4.023950902509018,
144
+ 3.9869604480098673,
145
+ 3.7528539744900984,
146
+ 3.9172230438447335,
147
+ 4.0608437061309814
148
+ ],
149
+ "val_ndcg": [
150
+ 0.9772571300117063,
151
+ 0.9857122864521725,
152
+ 0.9920756976369401,
153
+ 0.9934450102524018,
154
+ 0.9934527152021166,
155
+ 0.9938533314516846,
156
+ 0.9945179601790199,
157
+ 0.9936678846117476,
158
+ 0.9944843129372932,
159
+ 0.9952997682799756,
160
+ 0.9957836681688336,
161
+ 0.9954666562483344,
162
+ 0.9959287416767066,
163
+ 0.9957366736841874,
164
+ 0.9958119459555183,
165
+ 0.9955161961031632,
166
+ 0.9962866423835217,
167
+ 0.9957908878863697,
168
+ 0.9961979238080306
169
+ ],
170
+ "lr": [
171
+ 0.001,
172
+ 0.001,
173
+ 0.001,
174
+ 0.001,
175
+ 0.001,
176
+ 0.001,
177
+ 0.001,
178
+ 0.001,
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001
190
+ ]
191
+ }
metrics/training_metrics_20250102_210550.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1573.4106846580023,
4
+ 241.66802635675745,
5
+ 129.58585886110234,
6
+ 81.33055539976192,
7
+ 60.043437613716605,
8
+ 49.388961017886295,
9
+ 42.711713415157945,
10
+ 37.04401670226568,
11
+ 31.510297592682175,
12
+ 28.098169061202036,
13
+ 24.962806463996067,
14
+ 22.979653856422328,
15
+ 20.624650590781926,
16
+ 18.37248856508279,
17
+ 16.41032188376294,
18
+ 15.106652148162262,
19
+ 13.923152925092962,
20
+ 12.319169042608406,
21
+ 11.82735844239404,
22
+ 11.080743769301645
23
+ ],
24
+ "train_rmse": [
25
+ 34.87875299744444,
26
+ 14.987261795962356,
27
+ 11.041098153423027,
28
+ 8.77760558087468,
29
+ 7.553408715871261,
30
+ 6.851181174457468,
31
+ 6.383387834579968,
32
+ 5.959030248017024,
33
+ 5.510335440600911,
34
+ 5.21213214792664,
35
+ 4.909669503700807,
36
+ 4.7199303371251276,
37
+ 4.454014988545468,
38
+ 4.2114133277321955,
39
+ 3.98082874088483,
40
+ 3.8168967012856276,
41
+ 3.6601786489112054,
42
+ 3.4488687216236493,
43
+ 3.381452993476122,
44
+ 3.263646540076566
45
+ ],
46
+ "train_mae": [
47
+ 23.23654489577571,
48
+ 9.965823018852669,
49
+ 7.528117040290108,
50
+ 6.2109670386284215,
51
+ 5.483522375550451,
52
+ 5.0336463987072815,
53
+ 4.707722712921191,
54
+ 4.446547166078905,
55
+ 4.185598470364945,
56
+ 3.958317776646795,
57
+ 3.72663677229157,
58
+ 3.6098021332976185,
59
+ 3.396712816968749,
60
+ 3.2209290422593493,
61
+ 3.036197697437262,
62
+ 2.9069111562227903,
63
+ 2.789865439639816,
64
+ 2.63726353588738,
65
+ 2.5662053268921525,
66
+ 2.475501270045208
67
+ ],
68
+ "train_ndcg": [
69
+ 0.8705413748474815,
70
+ 0.9820866142458553,
71
+ 0.9893646090279652,
72
+ 0.993068425055546,
73
+ 0.9943591235559198,
74
+ 0.995412773252288,
75
+ 0.9958077484293829,
76
+ 0.9964935148629961,
77
+ 0.9967850607029999,
78
+ 0.9972585009623177,
79
+ 0.9974314333705963,
80
+ 0.9975759675608405,
81
+ 0.9978548384542707,
82
+ 0.9979887845206864,
83
+ 0.9983101436231709,
84
+ 0.9985514830184888,
85
+ 0.998682281261758,
86
+ 0.9987842735799053,
87
+ 0.9989815183644053,
88
+ 0.9989825742720049
89
+ ],
90
+ "val_loss": [
91
+ 242.48699736259354,
92
+ 110.35868351896045,
93
+ 104.70559149728695,
94
+ 81.94685237508425,
95
+ 59.759863571381906,
96
+ 63.3234116460236,
97
+ 51.44393080053195,
98
+ 47.11555201570753,
99
+ 44.119545775400084,
100
+ 50.042676992819345,
101
+ 38.21174539646632,
102
+ 36.11512255332839,
103
+ 33.29190435543866,
104
+ 36.34482394473653,
105
+ 34.90276159367091,
106
+ 36.881933789857676,
107
+ 30.79913027857391,
108
+ 29.94282915222813,
109
+ 26.5078580345906,
110
+ 28.964485262481258
111
+ ],
112
+ "val_rmse": [
113
+ 15.222749438304598,
114
+ 10.259006386057093,
115
+ 9.975184629147016,
116
+ 8.64159275856882,
117
+ 7.390977598876305,
118
+ 7.406066388447391,
119
+ 6.88580765737273,
120
+ 6.4700765907057844,
121
+ 6.344710511920356,
122
+ 6.7324958332755,
123
+ 5.816017498074644,
124
+ 5.647238446646834,
125
+ 5.485007851809264,
126
+ 5.67274044556089,
127
+ 5.584264915042236,
128
+ 5.748266146448996,
129
+ 5.254208615862825,
130
+ 5.175323364620961,
131
+ 4.899611512774226,
132
+ 5.034349147356589
133
+ ],
134
+ "val_mae": [
135
+ 10.016210032181002,
136
+ 7.133039588659582,
137
+ 6.888899380052593,
138
+ 5.7716174830853095,
139
+ 5.325613498687744,
140
+ 5.063329330632384,
141
+ 4.936540596921679,
142
+ 4.571258101664799,
143
+ 4.56014216114098,
144
+ 4.771088475912389,
145
+ 4.026445123511301,
146
+ 4.005806899406541,
147
+ 3.9677629907366256,
148
+ 4.055088516692041,
149
+ 4.026658931248624,
150
+ 4.182556256442003,
151
+ 3.76256963568674,
152
+ 3.6913866660964323,
153
+ 3.554204907215817,
154
+ 3.5717549458355973
155
+ ],
156
+ "val_ndcg": [
157
+ 0.981707148988482,
158
+ 0.9877026433676062,
159
+ 0.9903137557943102,
160
+ 0.9918068135288399,
161
+ 0.9937682865371167,
162
+ 0.9937528178725444,
163
+ 0.993917101705578,
164
+ 0.9942726148685939,
165
+ 0.9948195336570202,
166
+ 0.9943590919736406,
167
+ 0.9952160749636906,
168
+ 0.9956254682070772,
169
+ 0.995776547512538,
170
+ 0.9952850341796875,
171
+ 0.9950294519813967,
172
+ 0.9960594983168052,
173
+ 0.9959340909836998,
174
+ 0.9961577998080724,
175
+ 0.9958094618689846,
176
+ 0.9958491266613275
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.001,
195
+ 0.001,
196
+ 0.001,
197
+ 0.001,
198
+ 0.001
199
+ ]
200
+ }
metrics/training_metrics_20250103_030301.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 6039.769612179527,
4
+ 5941.704713169533,
5
+ 5914.564727203756,
6
+ 5836.091276820702
7
+ ],
8
+ "train_rmse": [
9
+ 75.06372706676143,
10
+ 74.61218414418902,
11
+ 74.47395658940658,
12
+ 73.67107757410997
13
+ ],
14
+ "train_mae": [
15
+ 50.31086837792699,
16
+ 50.907999479317965,
17
+ 50.94638104076627,
18
+ 50.31608098368101
19
+ ],
20
+ "train_ndcg": [
21
+ 0.36966318728496567,
22
+ 0.3835963750894688,
23
+ 0.38830770708950635,
24
+ 0.451513979324623
25
+ ],
26
+ "val_loss": [
27
+ 5906.023872482944,
28
+ 5803.814482353103,
29
+ 5709.954079211598,
30
+ 5801.15322489134
31
+ ],
32
+ "val_rmse": [
33
+ 74.61562375812093,
34
+ 72.7763033395989,
35
+ 72.59723830805083,
36
+ 73.05621628711616
37
+ ],
38
+ "val_mae": [
39
+ 57.40647469104176,
40
+ 45.45087704188387,
41
+ 49.78841300749443,
42
+ 49.173527166876994
43
+ ],
44
+ "val_ndcg": [
45
+ 0.3630109893184313,
46
+ 0.4052694315012072,
47
+ 0.7254581948820974,
48
+ 0.3376818069479835
49
+ ],
50
+ "lr": [
51
+ 0.001,
52
+ 0.001,
53
+ 0.001,
54
+ 0.001
55
+ ]
56
+ }
metrics/training_metrics_20250103_030828.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1475.7049554993835,
4
+ 379.17743226546276,
5
+ 170.54567088960093,
6
+ 104.06700551057163,
7
+ 76.1038736602928,
8
+ 59.17003956625733,
9
+ 51.22404585005362,
10
+ 43.72882807405689,
11
+ 40.60840407806107,
12
+ 34.13230947754051,
13
+ 31.245400774328015,
14
+ 27.855964557279513,
15
+ 26.76359580589246,
16
+ 24.135131220274335,
17
+ 21.92132758415198,
18
+ 20.577230770376666,
19
+ 19.48057757072811,
20
+ 18.04268748850762,
21
+ 17.653404054007954,
22
+ 17.05115290684036
23
+ ],
24
+ "train_rmse": [
25
+ 34.1962431550628,
26
+ 18.801574966118118,
27
+ 12.689654892251957,
28
+ 9.87278275161242,
29
+ 8.449554354098428,
30
+ 7.44580231768099,
31
+ 6.920708883027974,
32
+ 6.429545916515828,
33
+ 6.19063189467571,
34
+ 5.708895129538141,
35
+ 5.46680839896866,
36
+ 5.169277343994283,
37
+ 5.062612587674039,
38
+ 4.822805409506358,
39
+ 4.588967730179266,
40
+ 4.45248032017342,
41
+ 4.333507796834372,
42
+ 4.169329592103006,
43
+ 4.1118980921011445,
44
+ 4.041849615971436
45
+ ],
46
+ "train_mae": [
47
+ 22.27033799509459,
48
+ 12.89405941812298,
49
+ 8.832277373422551,
50
+ 6.853627974473977,
51
+ 5.98043404764767,
52
+ 5.36616400299193,
53
+ 5.0564211214645,
54
+ 4.735194380902037,
55
+ 4.577013487302804,
56
+ 4.306544921820676,
57
+ 4.119050872854039,
58
+ 3.942401315969757,
59
+ 3.8522814964946313,
60
+ 3.6689407468973836,
61
+ 3.5085206480720377,
62
+ 3.4013164577227606,
63
+ 3.3126965953579433,
64
+ 3.1720640664990944,
65
+ 3.1186785250902176,
66
+ 3.043237811779674
67
+ ],
68
+ "train_ndcg": [
69
+ 0.8878439911464348,
70
+ 0.9664217960796778,
71
+ 0.9849025442064563,
72
+ 0.9909372538139548,
73
+ 0.992851044181027,
74
+ 0.9944684115014498,
75
+ 0.9955004250890092,
76
+ 0.9954500748198244,
77
+ 0.9963730471798137,
78
+ 0.9967452410278441,
79
+ 0.9970897467264647,
80
+ 0.997403313936312,
81
+ 0.9972991103990169,
82
+ 0.9975678757587566,
83
+ 0.9974553273825706,
84
+ 0.9980509397161158,
85
+ 0.9981773383443868,
86
+ 0.998248864295362,
87
+ 0.9982810442960715,
88
+ 0.9985020799161513
89
+ ],
90
+ "val_loss": [
91
+ 518.2866107779489,
92
+ 196.49689827502613,
93
+ 108.25126443782322,
94
+ 82.35544583495233,
95
+ 64.4055624142499,
96
+ 64.73163228639415,
97
+ 69.00259841327936,
98
+ 73.7572065541442,
99
+ 46.70021191449233,
100
+ 51.2034899348944,
101
+ 59.88945630570532,
102
+ 46.171227925260304,
103
+ 38.14610894968812,
104
+ 41.36720026043099,
105
+ 40.145658331857604,
106
+ 40.95807745758916,
107
+ 36.44995172258834,
108
+ 37.648309882258026,
109
+ 40.110850562512034,
110
+ 34.8642008741137
111
+ ],
112
+ "val_rmse": [
113
+ 22.175751544849163,
114
+ 13.627327422581926,
115
+ 10.084425877541213,
116
+ 8.7474406358769,
117
+ 7.698267432884312,
118
+ 7.714951849599426,
119
+ 7.970698293332266,
120
+ 8.308298844563378,
121
+ 6.3903562067549045,
122
+ 6.7515749053250795,
123
+ 7.348427681843771,
124
+ 6.375031763854914,
125
+ 5.864137658752988,
126
+ 6.080929566007648,
127
+ 5.97723259149377,
128
+ 6.083237096050345,
129
+ 5.640871318599802,
130
+ 5.7711622988360025,
131
+ 5.998258900137503,
132
+ 5.628703590478307
133
+ ],
134
+ "val_mae": [
135
+ 15.3913011416583,
136
+ 9.468683840523303,
137
+ 6.864865544816138,
138
+ 6.077065958103663,
139
+ 5.370076864538058,
140
+ 5.423657706086065,
141
+ 5.450087026810982,
142
+ 5.731729675346697,
143
+ 4.450722744767095,
144
+ 4.684651660247588,
145
+ 5.084945682068946,
146
+ 4.410807441657697,
147
+ 4.10906414246895,
148
+ 4.262183797191566,
149
+ 4.182462527718343,
150
+ 4.403699760705653,
151
+ 3.9841212252495994,
152
+ 4.099793424069042,
153
+ 4.281244986493823,
154
+ 4.025566181666415
155
+ ],
156
+ "val_ndcg": [
157
+ 0.9491317574407013,
158
+ 0.9809850437540404,
159
+ 0.9894338082259809,
160
+ 0.9927881418819159,
161
+ 0.9925727038316323,
162
+ 0.993241311798633,
163
+ 0.9938505401074047,
164
+ 0.9935763100503197,
165
+ 0.9939105409971425,
166
+ 0.9937452371691314,
167
+ 0.9939587519202434,
168
+ 0.9940523916566876,
169
+ 0.9945629667228376,
170
+ 0.9945879385504924,
171
+ 0.9951134777404893,
172
+ 0.9949196988428143,
173
+ 0.9954190170261222,
174
+ 0.9959209158386982,
175
+ 0.9951174175235588,
176
+ 0.9956686404389394
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.001,
195
+ 0.001,
196
+ 0.001,
197
+ 0.001,
198
+ 0.001
199
+ ]
200
+ }
metrics/training_metrics_20250103_033513.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1435.060329775267,
4
+ 352.2340569315077,
5
+ 164.56359785417968,
6
+ 96.81200471105454,
7
+ 67.34939731525469,
8
+ 53.12608155419555,
9
+ 44.58751765987541,
10
+ 38.42660973796362,
11
+ 34.44303543205503,
12
+ 31.319766175897815,
13
+ 28.912457778484008,
14
+ 27.199046002913125,
15
+ 25.081022571913802,
16
+ 22.87438059079496,
17
+ 20.80075543439841,
18
+ 20.669258119939247,
19
+ 18.51449005965945,
20
+ 17.437184510351738,
21
+ 15.839009639205813,
22
+ 14.724061391021632
23
+ ],
24
+ "train_rmse": [
25
+ 34.16462143750128,
26
+ 18.133741742649008,
27
+ 12.479908767197573,
28
+ 9.533131123991046,
29
+ 7.993323629576951,
30
+ 7.129096690749047,
31
+ 6.538397691999737,
32
+ 6.06964856221789,
33
+ 5.755456311497981,
34
+ 5.487252373904924,
35
+ 5.260899197134256,
36
+ 5.112084049532784,
37
+ 4.906783164787575,
38
+ 4.686919144259876,
39
+ 4.482920539985945,
40
+ 4.449389267406377,
41
+ 4.2221425125174985,
42
+ 4.077745623309648,
43
+ 3.9076029899822107,
44
+ 3.7612553914109483
45
+ ],
46
+ "train_mae": [
47
+ 22.42367218717744,
48
+ 12.666036196147338,
49
+ 8.629599928101406,
50
+ 6.682308893792237,
51
+ 5.701853976219515,
52
+ 5.185871489440339,
53
+ 4.8233660508560225,
54
+ 4.548375989440121,
55
+ 4.338121420220483,
56
+ 4.163119960057585,
57
+ 3.989376880700075,
58
+ 3.886762281761894,
59
+ 3.732258479806441,
60
+ 3.5699768172034734,
61
+ 3.437376656864263,
62
+ 3.360495426986791,
63
+ 3.2160783613784405,
64
+ 3.0981060236315185,
65
+ 2.9636218747760674,
66
+ 2.8468211540315727
67
+ ],
68
+ "train_ndcg": [
69
+ 0.8861735068686023,
70
+ 0.9673905631975283,
71
+ 0.9857557027400294,
72
+ 0.9915234359759318,
73
+ 0.9942724066255968,
74
+ 0.9951469133360477,
75
+ 0.9957965078610408,
76
+ 0.9963700529895251,
77
+ 0.9968566370161274,
78
+ 0.9970038944407354,
79
+ 0.9973822481270078,
80
+ 0.9971672230506246,
81
+ 0.9975094205782383,
82
+ 0.9977648538313334,
83
+ 0.9980179846664018,
84
+ 0.9981356275421155,
85
+ 0.998470520105543,
86
+ 0.9984775487380692,
87
+ 0.9987470709447619,
88
+ 0.9987366080661363
89
+ ],
90
+ "val_loss": [
91
+ 410.4469845194212,
92
+ 182.80695052885673,
93
+ 106.04734818364533,
94
+ 68.17160872338523,
95
+ 50.6360629444391,
96
+ 68.64627241752517,
97
+ 45.423886285701265,
98
+ 78.9354918305303,
99
+ 44.831697356533,
100
+ 41.634061155184895,
101
+ 43.157917936083294,
102
+ 40.68462800308013,
103
+ 39.753396558089996,
104
+ 44.02809227688212,
105
+ 48.21740244475888,
106
+ 35.52609372474778,
107
+ 42.4773176891703,
108
+ 39.13388240169471,
109
+ 34.04803727378308,
110
+ 56.9983289745492
111
+ ],
112
+ "val_rmse": [
113
+ 19.807712859563207,
114
+ 13.154047283218882,
115
+ 9.973827810514075,
116
+ 7.9165926582847925,
117
+ 6.7908423920085985,
118
+ 7.912192454970619,
119
+ 6.277257651484929,
120
+ 8.45227570668767,
121
+ 6.338847829619797,
122
+ 6.025232891791129,
123
+ 6.0758578337285165,
124
+ 5.943435587770236,
125
+ 5.847326947488449,
126
+ 6.090798816429889,
127
+ 6.580154817004584,
128
+ 5.534270403127238,
129
+ 6.03797093456972,
130
+ 5.794032251456846,
131
+ 5.2841298330328055,
132
+ 7.244037790588833
133
+ ],
134
+ "val_mae": [
135
+ 14.308727197244133,
136
+ 8.982651488881716,
137
+ 6.783395169486462,
138
+ 5.465634762401312,
139
+ 4.799200672498891,
140
+ 5.412561322601748,
141
+ 4.415327538906689,
142
+ 5.735453635873929,
143
+ 4.556723201778573,
144
+ 4.222258715562417,
145
+ 4.230704216889932,
146
+ 4.195163380931801,
147
+ 4.090030817918374,
148
+ 4.1431486237217,
149
+ 4.625208894971391,
150
+ 3.9091772327960377,
151
+ 4.2994451388506825,
152
+ 4.042285610252703,
153
+ 3.663872933723557,
154
+ 5.090360748935753
155
+ ],
156
+ "val_ndcg": [
157
+ 0.9563382897578495,
158
+ 0.9829646886234552,
159
+ 0.9902353975134837,
160
+ 0.9931762016994853,
161
+ 0.9938783435754373,
162
+ 0.9936022330337847,
163
+ 0.9940772854106527,
164
+ 0.9942635306170289,
165
+ 0.994526959640879,
166
+ 0.994710107084731,
167
+ 0.9943417713675701,
168
+ 0.9952644856882767,
169
+ 0.9947412333018343,
170
+ 0.9947131947732307,
171
+ 0.9957452072224147,
172
+ 0.9959601877440869,
173
+ 0.9957177504687242,
174
+ 0.9960256244095278,
175
+ 0.9959515937617127,
176
+ 0.9956882721941236
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.001,
195
+ 0.001,
196
+ 0.001,
197
+ 0.001,
198
+ 0.001
199
+ ]
200
+ }
metrics/training_metrics_20250103_043332.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1351.0113486277905,
4
+ 352.3077262866346,
5
+ 167.32429698750943,
6
+ 103.08953188944467,
7
+ 69.1875813610946,
8
+ 54.25784658631192,
9
+ 44.57601911055891,
10
+ 40.01520497285867,
11
+ 34.644554676888866,
12
+ 31.293750059001052,
13
+ 28.812668193744706,
14
+ 26.442434762097612,
15
+ 23.031041573874557,
16
+ 22.20530678350714,
17
+ 19.99327388669871,
18
+ 18.68147025908096,
19
+ 16.995510369916506,
20
+ 15.845708420005026,
21
+ 15.787844214258314,
22
+ 14.747453052031842
23
+ ],
24
+ "train_rmse": [
25
+ 33.209800136624345,
26
+ 18.2435796333922,
27
+ 12.549612336516933,
28
+ 9.841988781026261,
29
+ 8.071622587094533,
30
+ 7.137606808702729,
31
+ 6.477514088010586,
32
+ 6.162852056927469,
33
+ 5.755617270195042,
34
+ 5.477392564370788,
35
+ 5.256519986669205,
36
+ 5.046400770248145,
37
+ 4.708584689891357,
38
+ 4.619441727399584,
39
+ 4.395451810730182,
40
+ 4.227234469912232,
41
+ 4.049099866559392,
42
+ 3.9108673639536904,
43
+ 3.8833373469625383,
44
+ 3.755766218028664
45
+ ],
46
+ "train_mae": [
47
+ 22.03341102298302,
48
+ 12.686087564577031,
49
+ 8.723137673697893,
50
+ 6.865933564644825,
51
+ 5.739644124915328,
52
+ 5.1618613159354725,
53
+ 4.776871337920805,
54
+ 4.587744018699549,
55
+ 4.33242931773391,
56
+ 4.157995220981067,
57
+ 3.993489240543752,
58
+ 3.8578739743443986,
59
+ 3.6205275092698352,
60
+ 3.532670849486242,
61
+ 3.3538063560860065,
62
+ 3.2110798879514766,
63
+ 3.0780662824458713,
64
+ 2.972256003301355,
65
+ 2.912875095122977,
66
+ 2.8233952163895473
67
+ ],
68
+ "train_ndcg": [
69
+ 0.8791214263514627,
70
+ 0.9651105227538302,
71
+ 0.9844696806578697,
72
+ 0.9911428662606433,
73
+ 0.9935568665401845,
74
+ 0.9948240366729,
75
+ 0.9953797318135635,
76
+ 0.995786432223984,
77
+ 0.9964222386479378,
78
+ 0.9969813658655444,
79
+ 0.9970793777817413,
80
+ 0.9971918700427949,
81
+ 0.9978629457233827,
82
+ 0.9979353491452676,
83
+ 0.9979386804979059,
84
+ 0.9981750877031798,
85
+ 0.9985391404243964,
86
+ 0.9983644762748405,
87
+ 0.9987040338448331,
88
+ 0.99851057178612
89
+ ],
90
+ "val_loss": [
91
+ 416.53340750680843,
92
+ 190.91952998201612,
93
+ 104.1640454144545,
94
+ 72.3938918315189,
95
+ 73.03941280741087,
96
+ 49.85962137034242,
97
+ 48.56202842819859,
98
+ 48.4794106281979,
99
+ 40.51393108636561,
100
+ 43.22256162133015,
101
+ 41.64596470308975,
102
+ 37.488306649973694,
103
+ 41.163437480657876,
104
+ 40.262249718249684,
105
+ 41.858627131287484,
106
+ 33.52191503283004,
107
+ 35.463427651096396,
108
+ 34.34374282729458,
109
+ 35.07537248772635,
110
+ 35.725776531326936
111
+ ],
112
+ "val_rmse": [
113
+ 20.037238599342864,
114
+ 13.578766652473123,
115
+ 9.972929540364614,
116
+ 8.205374721377183,
117
+ 8.255005243890967,
118
+ 6.720256714664904,
119
+ 6.593885938298914,
120
+ 6.5710771451384025,
121
+ 5.956024617439825,
122
+ 6.109059175367006,
123
+ 6.1021625173050005,
124
+ 5.629496071562468,
125
+ 6.040688794055788,
126
+ 6.02400883553649,
127
+ 6.181112128194623,
128
+ 5.4490271083728095,
129
+ 5.579791722023324,
130
+ 5.5375956799899,
131
+ 5.512524228406886,
132
+ 5.587302219995305
133
+ ],
134
+ "val_mae": [
135
+ 13.448163207148163,
136
+ 9.25817228370989,
137
+ 6.8640187357513,
138
+ 5.719145002499433,
139
+ 5.654466313375553,
140
+ 4.759454754036917,
141
+ 4.746351557718197,
142
+ 4.631843724720914,
143
+ 4.244970445901576,
144
+ 4.2405674323229725,
145
+ 4.311174513588489,
146
+ 3.970265506019055,
147
+ 4.271067021598278,
148
+ 4.344380452599324,
149
+ 4.383088038001262,
150
+ 3.914992782431589,
151
+ 3.9759923236470827,
152
+ 3.9289716364632192,
153
+ 3.853868887458049,
154
+ 3.879887836080202
155
+ ],
156
+ "val_ndcg": [
157
+ 0.9552615352079902,
158
+ 0.9803778302501625,
159
+ 0.9900085867290765,
160
+ 0.9927245554789691,
161
+ 0.9929810569319927,
162
+ 0.9937699966027703,
163
+ 0.9954146490970128,
164
+ 0.9936058378555406,
165
+ 0.9941671062523211,
166
+ 0.9947078941573559,
167
+ 0.9938346449757965,
168
+ 0.9955057291917397,
169
+ 0.9949795964738013,
170
+ 0.9951892134169458,
171
+ 0.9950296677334208,
172
+ 0.9954134653991377,
173
+ 0.9948479037889293,
174
+ 0.9956618916820472,
175
+ 0.9953685369290096,
176
+ 0.9951692357869215
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.001,
195
+ 0.001,
196
+ 0.001,
197
+ 0.001,
198
+ 0.001
199
+ ]
200
+ }
metrics/training_metrics_20250103_044652.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 1568.4600394526615,
4
+ 380.66691172877444,
5
+ 186.19200922869427,
6
+ 100.4270657587655,
7
+ 63.62437669989429,
8
+ 54.30184430562997,
9
+ 44.79294805285297,
10
+ 39.49484346335447,
11
+ 34.37678491465653,
12
+ 33.189656402491316,
13
+ 28.456958789614184,
14
+ 26.819092845614954,
15
+ 24.388968602011474,
16
+ 22.539706074738806,
17
+ 21.393888397307336,
18
+ 21.72506937346881,
19
+ 18.861068978339812,
20
+ 18.040212118927435,
21
+ 16.478899402708947,
22
+ 16.40729931562762
23
+ ],
24
+ "train_rmse": [
25
+ 35.548012435356554,
26
+ 18.833375530651306,
27
+ 13.181894009336585,
28
+ 9.730285929416734,
29
+ 7.768600108746146,
30
+ 7.177732931851947,
31
+ 6.531449950219701,
32
+ 6.137238532111352,
33
+ 5.733839722016422,
34
+ 5.634765137953384,
35
+ 5.231876051724629,
36
+ 5.0846880401971495,
37
+ 4.860513306432777,
38
+ 4.66520351242637,
39
+ 4.541058985538234,
40
+ 4.54559837113959,
41
+ 4.258056244870012,
42
+ 4.154343473970143,
43
+ 3.975153880119614,
44
+ 3.9717052584565744
45
+ ],
46
+ "train_mae": [
47
+ 23.885840191116817,
48
+ 12.806354168095167,
49
+ 8.911165521869176,
50
+ 6.75464779704432,
51
+ 5.5718319597123545,
52
+ 5.191718755643579,
53
+ 4.798439809415914,
54
+ 4.567531941812249,
55
+ 4.311504548863519,
56
+ 4.217083642377129,
57
+ 3.9817271043982685,
58
+ 3.8729505618161792,
59
+ 3.722985306118108,
60
+ 3.5677872411435163,
61
+ 3.455016141450858,
62
+ 3.4211620231972466,
63
+ 3.250691982198365,
64
+ 3.1469848567171943,
65
+ 3.0175175525342364,
66
+ 2.981323989886272
67
+ ],
68
+ "train_ndcg": [
69
+ 0.8788194583398821,
70
+ 0.966001775162884,
71
+ 0.9844999542530579,
72
+ 0.9917020818477944,
73
+ 0.9941305821832223,
74
+ 0.9949844571985776,
75
+ 0.9958647024593775,
76
+ 0.99609034367,
77
+ 0.9968955215962627,
78
+ 0.9968772376828556,
79
+ 0.9968342000170599,
80
+ 0.9971945462158963,
81
+ 0.9974722178487838,
82
+ 0.9978334335963938,
83
+ 0.9980168634954887,
84
+ 0.9980882780649994,
85
+ 0.9983908321849907,
86
+ 0.9983578184737435,
87
+ 0.9985815234765222,
88
+ 0.9986211659410332
89
+ ],
90
+ "val_loss": [
91
+ 480.90674945670116,
92
+ 221.32546642464652,
93
+ 119.41638223889848,
94
+ 71.85167360977388,
95
+ 61.77250488711075,
96
+ 50.31877966330085,
97
+ 45.95686971637565,
98
+ 47.26317527932181,
99
+ 42.16901689180186,
100
+ 48.815807651466045,
101
+ 43.76307472712557,
102
+ 47.48831813436159,
103
+ 39.1390000464211,
104
+ 45.411110475029744,
105
+ 37.73349936579315,
106
+ 39.927634789910115,
107
+ 36.944171274212046,
108
+ 41.41304953669159,
109
+ 35.50801792950698,
110
+ 32.267287845342935
111
+ ],
112
+ "val_rmse": [
113
+ 21.523574966213687,
114
+ 14.500466189588247,
115
+ 10.713845038053803,
116
+ 8.220808155284956,
117
+ 7.514927146441144,
118
+ 6.752058818549558,
119
+ 6.462109366346076,
120
+ 6.511514011606931,
121
+ 6.158016624407551,
122
+ 6.581518399887021,
123
+ 6.202932100631911,
124
+ 6.500268678699365,
125
+ 5.90938766806474,
126
+ 6.40362695837909,
127
+ 5.69099401318934,
128
+ 5.916818186110754,
129
+ 5.705122979201211,
130
+ 6.073733684418374,
131
+ 5.6619658280147735,
132
+ 5.327907316202149
133
+ ],
134
+ "val_mae": [
135
+ 14.952053258116816,
136
+ 9.653207577450175,
137
+ 7.315994601854136,
138
+ 5.805767361546906,
139
+ 5.203530687681386,
140
+ 4.783049848717703,
141
+ 4.532520059128882,
142
+ 4.608333439894126,
143
+ 4.3324834057982535,
144
+ 4.6344721921732726,
145
+ 4.302189464300451,
146
+ 4.506923057663609,
147
+ 4.166391057027897,
148
+ 4.4321763280411846,
149
+ 3.919857750476246,
150
+ 4.015890766197527,
151
+ 4.011639339823119,
152
+ 4.196899498012704,
153
+ 4.0046954658669485,
154
+ 3.760457559370659
155
+ ],
156
+ "val_ndcg": [
157
+ 0.951992391700476,
158
+ 0.977657847001519,
159
+ 0.9905902751734559,
160
+ 0.9921590744609564,
161
+ 0.9932476533970362,
162
+ 0.9936211083976316,
163
+ 0.9946853535276063,
164
+ 0.9945137148172083,
165
+ 0.9951216788359092,
166
+ 0.9952481229540328,
167
+ 0.9955367848906719,
168
+ 0.9950585843811572,
169
+ 0.9953058387192202,
170
+ 0.9952809441257531,
171
+ 0.9950784814189857,
172
+ 0.99469767322003,
173
+ 0.9955671723459808,
174
+ 0.9958358297885304,
175
+ 0.9950448165477161,
176
+ 0.9960291091824921
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.001,
193
+ 0.001,
194
+ 0.001,
195
+ 0.001,
196
+ 0.001,
197
+ 0.001,
198
+ 0.001
199
+ ]
200
+ }
metrics/training_metrics_20250103_092757.json ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 35.48313679539044,
4
+ 0.3329015611376189,
5
+ 0.2187574881724306,
6
+ 0.18027265684950294,
7
+ 0.1406513607848577,
8
+ 0.1254000432385556,
9
+ 0.11406336508874039,
10
+ 0.10675579064991325,
11
+ 0.09156012369313903,
12
+ 0.07837757181090338,
13
+ 0.07272699182923836,
14
+ 0.06715140057598017,
15
+ 0.062056878547750036,
16
+ 0.05528454597276058,
17
+ 0.041029059951476564,
18
+ 0.0335420139783793,
19
+ 0.036650182961492174,
20
+ 0.029730955377159217,
21
+ 0.028419958240399727,
22
+ 0.02979619682197683
23
+ ],
24
+ "train_rmse": [
25
+ 3.566621652047163,
26
+ 0.530789752552005,
27
+ 0.42882655275830606,
28
+ 0.39050047079668965,
29
+ 0.3451002656171299,
30
+ 0.3198269751787553,
31
+ 0.3001346394637745,
32
+ 0.2921615258101418,
33
+ 0.2725297490255808,
34
+ 0.2540439729435462,
35
+ 0.246652456054755,
36
+ 0.23201455367153614,
37
+ 0.22159482499638555,
38
+ 0.2105041584167228,
39
+ 0.17940080854646312,
40
+ 0.16423403010169302,
41
+ 0.16818002084247397,
42
+ 0.156031105634702,
43
+ 0.15166975253445347,
44
+ 0.15514037664907793
45
+ ],
46
+ "train_mae": [
47
+ 2.474846361275715,
48
+ 0.35925816277725786,
49
+ 0.2973010249176546,
50
+ 0.2712645805028232,
51
+ 0.23956697093487916,
52
+ 0.22156769500550214,
53
+ 0.20947162143273068,
54
+ 0.20169177190459606,
55
+ 0.18987821878370229,
56
+ 0.17740302610717998,
57
+ 0.16870605046094594,
58
+ 0.15788957317465846,
59
+ 0.15054547920516587,
60
+ 0.14159253656369034,
61
+ 0.12221413583765868,
62
+ 0.11224046216310957,
63
+ 0.1128907774315699,
64
+ 0.10629052081133557,
65
+ 0.10315093468827537,
66
+ 0.10465153291986524
67
+ ],
68
+ "train_ndcg": [
69
+ 0.7558364655765044,
70
+ 0.9866188587267187,
71
+ 0.9924304947445665,
72
+ 0.9944303837380831,
73
+ 0.9945827830064146,
74
+ 0.9955582045301606,
75
+ 0.9960351542015619,
76
+ 0.9960824549198151,
77
+ 0.9969269312635253,
78
+ 0.9973954099077212,
79
+ 0.9975902201442779,
80
+ 0.9975214942912513,
81
+ 0.9980273539129692,
82
+ 0.9979620438210571,
83
+ 0.9985541199581532,
84
+ 0.9987976839648017,
85
+ 0.9990266956671884,
86
+ 0.9990728838911539,
87
+ 0.99896576755409,
88
+ 0.9988336536703231
89
+ ],
90
+ "val_loss": [
91
+ 0.1295502951342455,
92
+ 0.2112117204028116,
93
+ 0.06708751296178556,
94
+ 0.07748625563903594,
95
+ 0.026657289018670857,
96
+ 0.03803096673595653,
97
+ 0.11389587175520793,
98
+ 0.019189091058264315,
99
+ 9.442593926262163,
100
+ 0.06281777142389665,
101
+ 0.04309269220200958,
102
+ 0.028098553369923587,
103
+ 0.028143494626061177,
104
+ 0.029877805413389708,
105
+ 0.06912251699610915,
106
+ 0.017713357130406608,
107
+ 0.023466069523481205,
108
+ 0.040607516850594064,
109
+ 0.01309489512907892,
110
+ 0.05713046110615554
111
+ ],
112
+ "val_rmse": [
113
+ 0.3452739258859094,
114
+ 0.38631782291620353,
115
+ 0.2544532690529006,
116
+ 0.26332937789789096,
117
+ 0.15258707677027508,
118
+ 0.180040440315543,
119
+ 0.317377862802537,
120
+ 0.1345261631668834,
121
+ 0.6976586474660478,
122
+ 0.23486453598215457,
123
+ 0.19250496017195456,
124
+ 0.15698165336840292,
125
+ 0.159735350016474,
126
+ 0.16061959243152069,
127
+ 0.25054671630297654,
128
+ 0.1271297410243889,
129
+ 0.14636496537083996,
130
+ 0.18951016164216974,
131
+ 0.1060548357531114,
132
+ 0.2244844007582963
133
+ ],
134
+ "val_mae": [
135
+ 0.24210304588499204,
136
+ 0.21295641247235553,
137
+ 0.17747273296117783,
138
+ 0.16516592374569933,
139
+ 0.09974751967779348,
140
+ 0.11922594799961843,
141
+ 0.1758638471364975,
142
+ 0.09786017784770105,
143
+ 0.21067505287872235,
144
+ 0.12701583128999655,
145
+ 0.10494426013508314,
146
+ 0.09307881859196744,
147
+ 0.11108123605519953,
148
+ 0.10864213707161621,
149
+ 0.1366678663122822,
150
+ 0.0756039809907826,
151
+ 0.08223065046567313,
152
+ 0.10061165155239508,
153
+ 0.06615498132059272,
154
+ 0.1153957793935084
155
+ ],
156
+ "val_ndcg": [
157
+ 0.9898358978016276,
158
+ 0.9916317068355184,
159
+ 0.9960200240914251,
160
+ 0.9962448696015587,
161
+ 0.9982525723081239,
162
+ 0.9980665319402453,
163
+ 0.9982161471541499,
164
+ 0.9984719904375748,
165
+ 0.9983214626849537,
166
+ 0.9979129400051815,
167
+ 0.9987074657225273,
168
+ 0.9983981830973021,
169
+ 0.9983506748374079,
170
+ 0.998569496080909,
171
+ 0.9996046138481355,
172
+ 0.9992532646152336,
173
+ 0.9991910919337206,
174
+ 0.9996341869864666,
175
+ 0.9994951436217402,
176
+ 0.9995241685652397
177
+ ],
178
+ "lr": [
179
+ 0.001,
180
+ 0.001,
181
+ 0.001,
182
+ 0.001,
183
+ 0.001,
184
+ 0.001,
185
+ 0.001,
186
+ 0.001,
187
+ 0.001,
188
+ 0.001,
189
+ 0.001,
190
+ 0.001,
191
+ 0.001,
192
+ 0.0005,
193
+ 0.0005,
194
+ 0.0005,
195
+ 0.0005,
196
+ 0.0005,
197
+ 0.0005,
198
+ 0.0005
199
+ ]
200
+ }
metrics/training_metrics_20250103_165619.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 17.839974135632,
4
+ 0.3717077037531741,
5
+ 0.27244204249162274,
6
+ 0.20226187456717504,
7
+ 0.15897851241192532
8
+ ],
9
+ "train_rmse": [
10
+ 2.513843766362758,
11
+ 0.5616386250729694,
12
+ 0.4718983753994247,
13
+ 0.4053866316095696,
14
+ 0.3614962610700034
15
+ ],
16
+ "train_mae": [
17
+ 1.8133598699034015,
18
+ 0.41028543391936945,
19
+ 0.34171164455481723,
20
+ 0.2959879683448544,
21
+ 0.2629419069595729
22
+ ],
23
+ "train_ndcg": [
24
+ 0.7995104605473483,
25
+ 0.9858645969365216,
26
+ 0.9920885355412206,
27
+ 0.9945323769993419,
28
+ 0.9957412415290181
29
+ ],
30
+ "val_loss": [
31
+ 3.491730105079396,
32
+ 0.11632824206436185,
33
+ 0.0817769760606994,
34
+ 0.04945154333303512,
35
+ 0.032795523575336584
36
+ ],
37
+ "val_rmse": [
38
+ 0.6826991777101171,
39
+ 0.3341630921570146,
40
+ 0.2778393792775709,
41
+ 0.21099134118754137,
42
+ 0.16966517827770045
43
+ ],
44
+ "val_mae": [
45
+ 0.3260452077842095,
46
+ 0.2573499553640124,
47
+ 0.1916451218052649,
48
+ 0.13111490493928882,
49
+ 0.11222708917839426
50
+ ],
51
+ "val_ndcg": [
52
+ 0.9786449779926891,
53
+ 0.9901216953573092,
54
+ 0.9963186937318721,
55
+ 0.9982596190882401,
56
+ 0.9985142963033327
57
+ ],
58
+ "lr": [
59
+ 0.001,
60
+ 0.001,
61
+ 0.001,
62
+ 0.001,
63
+ 0.001
64
+ ]
65
+ }
metrics/training_metrics_20250104_000005.json ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 25.03897695070062,
4
+ 0.4459359470071106,
5
+ 0.27832151357603224,
6
+ 0.20583774432940763,
7
+ 0.18026240458240425,
8
+ 0.14846552507008745,
9
+ 0.13040077824387228
10
+ ],
11
+ "train_rmse": [
12
+ 3.0084060317310333,
13
+ 0.6273383269022131,
14
+ 0.490819894011052,
15
+ 0.4215487596927151,
16
+ 0.38429657859467986,
17
+ 0.34830508471687494,
18
+ 0.32169545626989093
19
+ ],
20
+ "train_mae": [
21
+ 2.131225818838877,
22
+ 0.4455115708133465,
23
+ 0.348309932229451,
24
+ 0.30484239554292036,
25
+ 0.27675854565599295,
26
+ 0.2519048037879829,
27
+ 0.23417054670803908
28
+ ],
29
+ "train_ndcg": [
30
+ 0.7440686262193537,
31
+ 0.9760115248493001,
32
+ 0.9892069459715976,
33
+ 0.9922320850287811,
34
+ 0.9943632159052016,
35
+ 0.9953864646863334,
36
+ 0.996499631035177
37
+ ],
38
+ "val_loss": [
39
+ 1.486161563702872,
40
+ 0.22653832601409563,
41
+ 0.13026042740372284,
42
+ 0.660742336411921,
43
+ 0.05408989013710492,
44
+ 235.78654905395504,
45
+ 230.38252206704198
46
+ ],
47
+ "val_rmse": [
48
+ 0.6370334281670409,
49
+ 0.4570268694023932,
50
+ 0.31359623377048396,
51
+ 0.3187152725970594,
52
+ 0.22422285815586,
53
+ 2.016764449154497,
54
+ 1.9790944850806804
55
+ ],
56
+ "val_mae": [
57
+ 0.35360592939484287,
58
+ 0.34342973102146473,
59
+ 0.173662431538105,
60
+ 0.16381227319509212,
61
+ 0.15005545307632903,
62
+ 0.4578449399748319,
63
+ 0.43453011346954695
64
+ ],
65
+ "val_ndcg": [
66
+ 0.9759331832469349,
67
+ 0.990474347497376,
68
+ 0.9955524055051131,
69
+ 0.9955590568797689,
70
+ 0.9953686981134011,
71
+ 0.9971668946910912,
72
+ 0.9971519842953749
73
+ ],
74
+ "lr": [
75
+ 0.001,
76
+ 0.001,
77
+ 0.001,
78
+ 0.001,
79
+ 0.001,
80
+ 0.001,
81
+ 0.001
82
+ ]
83
+ }
metrics/training_metrics_20250104_002329.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 654.9977416510918,
4
+ 133.8768731886014,
5
+ 77.50994042476334,
6
+ 57.487973242325296,
7
+ 45.93395253734918
8
+ ],
9
+ "train_rmse": [
10
+ 21.76599518576593,
11
+ 10.92139800435689,
12
+ 8.43026184290633,
13
+ 7.31956257053143,
14
+ 6.586492155885355
15
+ ],
16
+ "train_mae": [
17
+ 12.904080948823319,
18
+ 7.260352644629054,
19
+ 6.020984615146085,
20
+ 5.396023633153948,
21
+ 4.993897577364289
22
+ ],
23
+ "train_ndcg": [
24
+ 0.8222233522745223,
25
+ 0.9201224937560074,
26
+ 0.935419495184108,
27
+ 0.9456507629191733,
28
+ 0.9510964462323335
29
+ ],
30
+ "val_loss": [
31
+ 233.38946832929338,
32
+ 94.92865151450748,
33
+ 84.01622210230146,
34
+ 88.02083689825875,
35
+ 251.29637086959113
36
+ ],
37
+ "val_rmse": [
38
+ 14.416855071947188,
39
+ 9.046542380697913,
40
+ 8.66063907904624,
41
+ 8.716143566689402,
42
+ 8.070561499731667
43
+ ],
44
+ "val_mae": [
45
+ 9.039377394176665,
46
+ 6.144316837901161,
47
+ 6.062099817253294,
48
+ 5.8308244077932265,
49
+ 5.27947231843358
50
+ ],
51
+ "val_ndcg": [
52
+ 0.901470630740126,
53
+ 0.9210642547391,
54
+ 0.9303346751701265,
55
+ 0.934778360561246,
56
+ 0.9401383463382011
57
+ ],
58
+ "lr": [
59
+ 0.001,
60
+ 0.001,
61
+ 0.001,
62
+ 0.001,
63
+ 0.001
64
+ ]
65
+ }
metrics/training_metrics_20250104_003816.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 655.2924103831865,
4
+ 137.81348060136773,
5
+ 77.87851923997026,
6
+ 60.0420509011622,
7
+ 46.96173634598771,
8
+ 40.52427888644802,
9
+ 35.571622559115546,
10
+ 31.858311056299197,
11
+ 27.281973488302345
12
+ ],
13
+ "train_rmse": [
14
+ 21.63339813905697,
15
+ 11.078644741924332,
16
+ 8.481624908336705,
17
+ 7.476557546854199,
18
+ 6.660614014874347,
19
+ 6.191670639031987,
20
+ 5.810964058506354,
21
+ 5.503427484370053,
22
+ 5.096925591852883
23
+ ],
24
+ "train_mae": [
25
+ 12.795672080114702,
26
+ 7.30440814957359,
27
+ 6.002602778582934,
28
+ 5.495873220255017,
29
+ 5.041820852088422,
30
+ 4.739296629925965,
31
+ 4.417383114813492,
32
+ 4.152467428450565,
33
+ 3.7957898891304596
34
+ ],
35
+ "train_ndcg": [
36
+ 0.8197692561558241,
37
+ 0.9231711810932137,
38
+ 0.9376293856843534,
39
+ 0.9425875070204298,
40
+ 0.9503919912445276,
41
+ 0.9540359039393911,
42
+ 0.9593489245668667,
43
+ 0.9625757746151086,
44
+ 0.9665195502410056
45
+ ],
46
+ "val_loss": [
47
+ 182.59727460997445,
48
+ 115.0690230414981,
49
+ 127.87416275909969,
50
+ 70.06721037910098,
51
+ 80.27486997558957,
52
+ 59.44625475293114,
53
+ 55.08135130291893,
54
+ 55.871143658955894,
55
+ 6659.085475047429
56
+ ],
57
+ "val_rmse": [
58
+ 12.557709290761498,
59
+ 9.918567012807063,
60
+ 9.48277149453734,
61
+ 7.70885356906008,
62
+ 8.371686730469683,
63
+ 6.979592169329438,
64
+ 6.689580094676087,
65
+ 6.870983494561128,
66
+ 13.458319354048012
67
+ ],
68
+ "val_mae": [
69
+ 7.897627572218577,
70
+ 6.56597325915382,
71
+ 6.200662170137678,
72
+ 5.50618282244319,
73
+ 5.874495851142066,
74
+ 5.199094084047136,
75
+ 4.840447388944172,
76
+ 5.065636995292845,
77
+ 5.93146392986888
78
+ ],
79
+ "val_ndcg": [
80
+ 0.9034571490649667,
81
+ 0.9252599633875347,
82
+ 0.9298035546338984,
83
+ 0.9361445135658696,
84
+ 0.9352943633816072,
85
+ 0.9418964138520616,
86
+ 0.9416976965786445,
87
+ 0.9426969763423715,
88
+ 0.9398589121798674
89
+ ],
90
+ "lr": [
91
+ 0.001,
92
+ 0.001,
93
+ 0.001,
94
+ 0.001,
95
+ 0.001,
96
+ 0.001,
97
+ 0.001,
98
+ 0.001,
99
+ 0.001
100
+ ]
101
+ }
metrics/training_metrics_20250104_010732.json ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 692.2268594424168,
4
+ 155.58579151731894,
5
+ 91.02494073715381,
6
+ 62.284806612625864,
7
+ 47.696007902716595,
8
+ 38.79570380175977,
9
+ 32.10595765445017
10
+ ],
11
+ "train_rmse": [
12
+ 22.40536726075939,
13
+ 11.802893998549271,
14
+ 9.076339798846956,
15
+ 7.597033458710151,
16
+ 6.689866192745471,
17
+ 6.0580873553579595,
18
+ 5.513845330073774
19
+ ],
20
+ "train_mae": [
21
+ 13.051485515691345,
22
+ 7.651320030299294,
23
+ 6.286715831749469,
24
+ 5.468741066692657,
25
+ 4.908279659856692,
26
+ 4.434657849154426,
27
+ 3.9721677486713114
28
+ ],
29
+ "train_ndcg": [
30
+ 0.8087768409661309,
31
+ 0.9128060766827535,
32
+ 0.93383413372955,
33
+ 0.947167278855171,
34
+ 0.9551643581645003,
35
+ 0.9637041410196174,
36
+ 0.9702560895854987
37
+ ],
38
+ "val_loss": [
39
+ 651.0634523192448,
40
+ 133.79051945529767,
41
+ 106.96319920696429,
42
+ 85.06644299350567,
43
+ 64.02761468175632,
44
+ 73.5220956830836,
45
+ 78.7099423735889
46
+ ],
47
+ "val_rmse": [
48
+ 13.131415164476463,
49
+ 10.055183463157267,
50
+ 8.756330566095277,
51
+ 8.131971300432767,
52
+ 7.268484960466997,
53
+ 7.782613046313818,
54
+ 8.050298634841678
55
+ ],
56
+ "val_mae": [
57
+ 8.55465096430992,
58
+ 7.276789544233635,
59
+ 6.283327481995768,
60
+ 5.751810121536255,
61
+ 5.33152237080816,
62
+ 5.470134524445036,
63
+ 5.669236395252285
64
+ ],
65
+ "val_ndcg": [
66
+ 0.4010162910418724,
67
+ 0.4096747400155708,
68
+ 0.41334134856266763,
69
+ 0.4137950132142252,
70
+ 0.4159794373298759,
71
+ 0.41582945051477915,
72
+ 0.4164658988589671
73
+ ],
74
+ "lr": [
75
+ 0.001,
76
+ 0.001,
77
+ 0.001,
78
+ 0.001,
79
+ 0.001,
80
+ 0.001,
81
+ 0.001
82
+ ]
83
+ }
metrics/training_metrics_20250104_011443.json ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 747.3488913914265,
4
+ 145.96466789430784,
5
+ 86.39479489572196,
6
+ 64.20039664960068,
7
+ 51.28491067993187,
8
+ 43.607586832167584,
9
+ 36.55425032472504,
10
+ 31.25288286166373,
11
+ 28.14833299431719,
12
+ 23.908967951859353,
13
+ 21.428236955666915,
14
+ 18.679253836012848
15
+ ],
16
+ "train_rmse": [
17
+ 23.184188219227416,
18
+ 11.45168295735762,
19
+ 8.8864819143681,
20
+ 7.723792975325597,
21
+ 6.940280548097029,
22
+ 6.405828542767508,
23
+ 5.8662402382937495,
24
+ 5.424234613831899,
25
+ 5.121161785708606,
26
+ 4.746361522360717,
27
+ 4.497774703122681,
28
+ 4.185096451859765
29
+ ],
30
+ "train_mae": [
31
+ 13.71706475349751,
32
+ 7.50529452007684,
33
+ 6.259701011606435,
34
+ 5.580138392729756,
35
+ 5.098060473476977,
36
+ 4.688325964576545,
37
+ 4.2858362388397175,
38
+ 3.895885395327106,
39
+ 3.616349921198012,
40
+ 3.3526823201047744,
41
+ 3.12058784901161,
42
+ 2.8688033105189272
43
+ ],
44
+ "train_ndcg": [
45
+ 0.8063238421107257,
46
+ 0.9175900664511593,
47
+ 0.9312679269883151,
48
+ 0.9422594188664545,
49
+ 0.9506532769981296,
50
+ 0.9590009508558491,
51
+ 0.9641841692742881,
52
+ 0.9713488008390174,
53
+ 0.9751414411810461,
54
+ 0.9765989279195032,
55
+ 0.9805166315373598,
56
+ 0.984279945949016
57
+ ],
58
+ "val_loss": [
59
+ 184.07673564455402,
60
+ 108.30949287983908,
61
+ 90.20219907618281,
62
+ 473.1458847216706,
63
+ 72.058516757168,
64
+ 68.01195372823459,
65
+ 67.81648602841506,
66
+ 58.370672943342974,
67
+ 61.947438388795995,
68
+ 52.14976073023099,
69
+ 63.069723879401366,
70
+ 54.61616339754703
71
+ ],
72
+ "val_rmse": [
73
+ 11.634516435881071,
74
+ 9.221781411128266,
75
+ 8.318100175119454,
76
+ 9.578305728731655,
77
+ 7.4885203644097045,
78
+ 7.3712299298358985,
79
+ 7.198502113314191,
80
+ 6.9242316173129375,
81
+ 6.918810462818225,
82
+ 6.618950349174297,
83
+ 7.152791654657651,
84
+ 6.622356772554203
85
+ ],
86
+ "val_mae": [
87
+ 8.255931179559052,
88
+ 6.688144994137892,
89
+ 5.8846641960428725,
90
+ 6.175251124510124,
91
+ 5.329085095249005,
92
+ 5.345389533398756,
93
+ 5.003653562246863,
94
+ 5.040316158977907,
95
+ 4.728284999861646,
96
+ 4.580177233112392,
97
+ 4.811583769499366,
98
+ 4.467982399997426
99
+ ],
100
+ "val_ndcg": [
101
+ 0.40758441028310294,
102
+ 0.4145419465961741,
103
+ 0.41645416679667,
104
+ 0.4170703012551834,
105
+ 0.4193937687731501,
106
+ 0.41901908401233046,
107
+ 0.41975115822322334,
108
+ 0.4202720586933307,
109
+ 0.42026146952785665,
110
+ 0.4205170225741258,
111
+ 0.42038892685477414,
112
+ 0.4204279004637875
113
+ ],
114
+ "lr": [
115
+ 0.001,
116
+ 0.001,
117
+ 0.001,
118
+ 0.001,
119
+ 0.001,
120
+ 0.001,
121
+ 0.001,
122
+ 0.001,
123
+ 0.001,
124
+ 0.001,
125
+ 0.001,
126
+ 0.001
127
+ ]
128
+ }
metrics/training_metrics_20250104_012344.json ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 722.9548574494639,
4
+ 146.40175312147647,
5
+ 85.42187348865056,
6
+ 60.501964287049205,
7
+ 46.8718575875736,
8
+ 38.23729195854751,
9
+ 32.00270525638162,
10
+ 26.729942461018066,
11
+ 22.60702768967524,
12
+ 19.945530043153997,
13
+ 17.704082511092764,
14
+ 15.55396806561653,
15
+ 14.22020652518511,
16
+ 13.117395714470662,
17
+ 11.661882876147967,
18
+ 10.93010081454299,
19
+ 10.063436130786494
20
+ ],
21
+ "train_rmse": [
22
+ 22.846375160921244,
23
+ 11.488120501193247,
24
+ 8.85727562168705,
25
+ 7.5123279911361145,
26
+ 6.651862302193106,
27
+ 6.015104275769991,
28
+ 5.503403441923615,
29
+ 5.023545856386948,
30
+ 4.613676628631371,
31
+ 4.327437248494172,
32
+ 4.075261877032907,
33
+ 3.8140716091468234,
34
+ 3.6273248958625297,
35
+ 3.482522223257597,
36
+ 3.287567164428574,
37
+ 3.185012855283296,
38
+ 3.0444534353048933
39
+ ],
40
+ "train_mae": [
41
+ 13.455125815125879,
42
+ 7.575254692258543,
43
+ 6.217654748671619,
44
+ 5.466741007241498,
45
+ 4.886993498122006,
46
+ 4.304617277270738,
47
+ 3.8304975337284195,
48
+ 3.4418799343885462,
49
+ 3.1144455406895495,
50
+ 2.875781349587387,
51
+ 2.696398690086946,
52
+ 2.517050676865752,
53
+ 2.362347985756228,
54
+ 2.2487000726870052,
55
+ 2.1161791984940574,
56
+ 2.028291983956984,
57
+ 1.9097916470079657
58
+ ],
59
+ "train_ndcg": [
60
+ 0.8235555761219006,
61
+ 0.9166275169964688,
62
+ 0.9388797100663986,
63
+ 0.9502400709809965,
64
+ 0.9563324356631079,
65
+ 0.9658247269606572,
66
+ 0.9723488926175283,
67
+ 0.9765766591078493,
68
+ 0.9812312149752246,
69
+ 0.9848286770812783,
70
+ 0.985791131575843,
71
+ 0.9877286714969774,
72
+ 0.9889362170413147,
73
+ 0.9895972986556061,
74
+ 0.9907311449930506,
75
+ 0.9918896107196452,
76
+ 0.9920450084862912
77
+ ],
78
+ "val_loss": [
79
+ 167.6522611874253,
80
+ 124.15631333251498,
81
+ 88.2374712104228,
82
+ 77.93126045340922,
83
+ 96.88929993216671,
84
+ 62.72705197120781,
85
+ 81.45877939338115,
86
+ 56.441899389295436,
87
+ 55.19662875559793,
88
+ 55.066983817940326,
89
+ 51.7734276614972,
90
+ 74.40411837421246,
91
+ 51.016412199789016,
92
+ 51.02640529177082,
93
+ 48.52456700766265,
94
+ 52.53771702922992,
95
+ 49.43981172220031
96
+ ],
97
+ "val_rmse": [
98
+ 11.189840606415867,
99
+ 9.58600997111548,
100
+ 8.292045612260651,
101
+ 7.99427763195157,
102
+ 7.6412259979978945,
103
+ 7.274987733142102,
104
+ 7.713936945366049,
105
+ 6.845516443905154,
106
+ 6.897868368615047,
107
+ 6.99134984579161,
108
+ 6.809175488282247,
109
+ 7.420135492837055,
110
+ 6.766768687883562,
111
+ 6.770783006127933,
112
+ 6.4910948027873525,
113
+ 6.757588578758839,
114
+ 6.594931427040444
115
+ ],
116
+ "val_mae": [
117
+ 7.976505904411202,
118
+ 6.769147197524114,
119
+ 5.974825873303769,
120
+ 5.764017573399331,
121
+ 5.348576226874964,
122
+ 5.293500059754101,
123
+ 5.225544199303015,
124
+ 4.757777753160961,
125
+ 4.790411420366658,
126
+ 4.871365610165382,
127
+ 4.69525331347736,
128
+ 5.044188578804927,
129
+ 4.645911375444327,
130
+ 4.551653947047333,
131
+ 4.403688052163195,
132
+ 4.524548444107397,
133
+ 4.412602953412639
134
+ ],
135
+ "val_ndcg": [
136
+ 0.3854664285681141,
137
+ 0.3970626523245626,
138
+ 0.3993091859034638,
139
+ 0.40061406377536146,
140
+ 0.40129871381752524,
141
+ 0.40149890638109464,
142
+ 0.4004063760166738,
143
+ 0.40111275430935533,
144
+ 0.40202835949499216,
145
+ 0.40123411852922014,
146
+ 0.4020480241348494,
147
+ 0.4016766359112156,
148
+ 0.4013568968025606,
149
+ 0.40230912454982304,
150
+ 0.40139322908066993,
151
+ 0.4017819784915269,
152
+ 0.40200455873759827
153
+ ],
154
+ "lr": [
155
+ 0.001,
156
+ 0.001,
157
+ 0.001,
158
+ 0.001,
159
+ 0.001,
160
+ 0.001,
161
+ 0.001,
162
+ 0.001,
163
+ 0.001,
164
+ 0.001,
165
+ 0.001,
166
+ 0.001,
167
+ 0.001,
168
+ 0.001,
169
+ 0.001,
170
+ 0.001,
171
+ 0.001
172
+ ]
173
+ }
metrics/training_metrics_20250104_021315.json ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 708.2152493528861,
4
+ 146.5171740804705,
5
+ 85.76771927449666,
6
+ 63.229462375028355,
7
+ 49.763298486221004,
8
+ 42.55385646791579
9
+ ],
10
+ "train_rmse": [
11
+ 22.764913456014224,
12
+ 11.484859694358866,
13
+ 8.869339527044579,
14
+ 7.658590551511417,
15
+ 6.847131576050916,
16
+ 6.3402288735225705
17
+ ],
18
+ "train_mae": [
19
+ 13.560497156802713,
20
+ 7.479677234504363,
21
+ 6.2542528368983366,
22
+ 5.5760266296537715,
23
+ 5.116533957282672,
24
+ 4.754307395224254
25
+ ],
26
+ "train_ndcg": [
27
+ 0.8192471829406456,
28
+ 0.921438950547271,
29
+ 0.9353899640254426,
30
+ 0.9402380620196873,
31
+ 0.9492815241629371,
32
+ 0.9570066111914874
33
+ ],
34
+ "val_loss": [
35
+ 161.44745741317521,
36
+ 109.14599984581791,
37
+ 90.46889235368415,
38
+ 87.12105213136816,
39
+ 466.9354229471577,
40
+ 1302.5879631554903
41
+ ],
42
+ "val_rmse": [
43
+ 10.559003265112123,
44
+ 9.104435882279088,
45
+ 8.444436996559249,
46
+ 8.23822649753548,
47
+ 9.129098270401919,
48
+ 11.23793314526776
49
+ ],
50
+ "val_mae": [
51
+ 7.498428307718306,
52
+ 6.650554202919576,
53
+ 6.160198556131391,
54
+ 5.933253830582348,
55
+ 5.8467706381385005,
56
+ 6.12841546784586
57
+ ],
58
+ "val_ndcg": [
59
+ 0.40186114240048537,
60
+ 0.4085635163890782,
61
+ 0.41129920856276553,
62
+ 0.4130042755781715,
63
+ 0.41324490735779945,
64
+ 0.41233258656601407
65
+ ],
66
+ "lr": [
67
+ 0.001,
68
+ 0.001,
69
+ 0.001,
70
+ 0.001,
71
+ 0.001,
72
+ 0.001
73
+ ]
74
+ }
metrics/training_metrics_20250104_021913.json ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 732.8318314612847,
4
+ 141.73860721431444,
5
+ 84.18782035622515,
6
+ 63.14002042105164,
7
+ 50.55775786621344,
8
+ 44.19075770018437,
9
+ 37.73816345875792,
10
+ 34.06126776375461
11
+ ],
12
+ "train_rmse": [
13
+ 22.99165184330979,
14
+ 11.323542329528655,
15
+ 8.814999768566919,
16
+ 7.657488695076422,
17
+ 6.889741401117676,
18
+ 6.445235970464815,
19
+ 5.984314805835451,
20
+ 5.662435650372836
21
+ ],
22
+ "train_mae": [
23
+ 13.584246410372723,
24
+ 7.424672826534781,
25
+ 6.1922993643948,
26
+ 5.566740326422021,
27
+ 5.093327478475763,
28
+ 4.778021319042488,
29
+ 4.4446718904667595,
30
+ 4.133069074536723
31
+ ],
32
+ "train_ndcg": [
33
+ 0.8110227949946529,
34
+ 0.9211597838804204,
35
+ 0.937679745028765,
36
+ 0.9412411521505384,
37
+ 0.9503305667344984,
38
+ 0.9545676151792712,
39
+ 0.9600524606546241,
40
+ 0.967420418263372
41
+ ],
42
+ "val_loss": [
43
+ 160.6261031933685,
44
+ 128.34096046846304,
45
+ 85.32431740974313,
46
+ 80.64392247128842,
47
+ 67.0554843091253,
48
+ 66.06501499147558,
49
+ 1049.1388928541496,
50
+ 69.18329388205684
51
+ ],
52
+ "val_rmse": [
53
+ 10.805885756804322,
54
+ 9.089829880151473,
55
+ 8.07756226301517,
56
+ 7.707812207446884,
57
+ 6.890123732031058,
58
+ 7.136241044110198,
59
+ 9.04072006674995,
60
+ 7.161699365254218
61
+ ],
62
+ "val_mae": [
63
+ 7.704081655616191,
64
+ 6.686001412548236,
65
+ 5.980107501015734,
66
+ 5.5615818735378895,
67
+ 5.153203635429269,
68
+ 5.337269631428505,
69
+ 5.525877652951141,
70
+ 5.073120658789108
71
+ ],
72
+ "val_ndcg": [
73
+ 0.40463845373979257,
74
+ 0.41194865721375196,
75
+ 0.41457322889299536,
76
+ 0.4161684600274954,
77
+ 0.4162150126784595,
78
+ 0.4159772846236158,
79
+ 0.41703249518551044,
80
+ 0.4172478131393888
81
+ ],
82
+ "lr": [
83
+ 0.001,
84
+ 0.001,
85
+ 0.001,
86
+ 0.001,
87
+ 0.001,
88
+ 0.001,
89
+ 0.001,
90
+ 0.001
91
+ ]
92
+ }
metrics/training_metrics_20250104_024710.json ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 698.9571214965068,
4
+ 159.28611053398424,
5
+ 94.177260281347,
6
+ 68.67736714058977,
7
+ 52.19162373831238,
8
+ 43.988458228876915,
9
+ 38.1462167963508,
10
+ 33.081662080108096,
11
+ 28.3430894199283,
12
+ 24.18672723535106,
13
+ 20.909505849814042,
14
+ 18.01416439347698
15
+ ],
16
+ "train_rmse": [
17
+ 22.664169959178874,
18
+ 11.85711222954263,
19
+ 9.258804724471577,
20
+ 7.915980144950924,
21
+ 6.947577161715384,
22
+ 6.403177358387431,
23
+ 5.9451505323781495,
24
+ 5.515501669518754,
25
+ 5.114904968799297,
26
+ 4.701472378918194,
27
+ 4.367025956447108,
28
+ 4.040677529004106
29
+ ],
30
+ "train_mae": [
31
+ 13.043204946781469,
32
+ 7.643941563220946,
33
+ 6.423641862221134,
34
+ 5.645208807290714,
35
+ 5.099023518765302,
36
+ 4.734131901365683,
37
+ 4.364591504674602,
38
+ 4.010108899678465,
39
+ 3.6647100993463404,
40
+ 3.291041061983258,
41
+ 2.980214517983685,
42
+ 2.6817004160706546
43
+ ],
44
+ "train_ndcg": [
45
+ 0.8104183176939972,
46
+ 0.9130722236575433,
47
+ 0.9314459845273463,
48
+ 0.9441268801844948,
49
+ 0.9525130322791463,
50
+ 0.9570151019154243,
51
+ 0.9625859918257832,
52
+ 0.9686254831149206,
53
+ 0.974737417795838,
54
+ 0.9780842145714321,
55
+ 0.9821972065313793,
56
+ 0.9857209688073401
57
+ ],
58
+ "val_loss": [
59
+ 172.88161589494393,
60
+ 426.1052271003154,
61
+ 112.51207539714984,
62
+ 72.3706546854617,
63
+ 294.6680413772811,
64
+ 62.068981108024936,
65
+ 58.63476648473028,
66
+ 56.30721573900821,
67
+ 59.38546958467854,
68
+ 53.21272474545152,
69
+ 27868.435395572436,
70
+ 1104.9548586503784
71
+ ],
72
+ "val_rmse": [
73
+ 11.102760222063104,
74
+ 10.900741960806847,
75
+ 8.854496686646492,
76
+ 7.612281812653077,
77
+ 9.060998067683073,
78
+ 6.995194889772411,
79
+ 7.0915024895963485,
80
+ 6.86413349464537,
81
+ 7.045319108247602,
82
+ 6.5340257952496295,
83
+ 29.066774280978127,
84
+ 9.589615194488836
85
+ ],
86
+ "val_mae": [
87
+ 7.9578251155454724,
88
+ 7.149700511391483,
89
+ 6.4138230003527745,
90
+ 5.7778721852089046,
91
+ 5.830743086515968,
92
+ 5.309667143892886,
93
+ 5.423977222015608,
94
+ 5.078170818357325,
95
+ 5.1515387592031,
96
+ 4.622512403886709,
97
+ 8.53286396104898,
98
+ 5.080765780406212
99
+ ],
100
+ "val_ndcg": [
101
+ 0.3995119698012053,
102
+ 0.4074448676474059,
103
+ 0.41436846994642,
104
+ 0.41535265410124367,
105
+ 0.415723830995275,
106
+ 0.4158541956944252,
107
+ 0.4157818028286322,
108
+ 0.4167915175210184,
109
+ 0.4170165019248849,
110
+ 0.4162059310656875,
111
+ 0.4151763634895211,
112
+ 0.41661322686209606
113
+ ],
114
+ "lr": [
115
+ 0.001,
116
+ 0.001,
117
+ 0.001,
118
+ 0.001,
119
+ 0.001,
120
+ 0.001,
121
+ 0.001,
122
+ 0.001,
123
+ 0.001,
124
+ 0.001,
125
+ 0.001,
126
+ 0.001
127
+ ]
128
+ }
metrics/training_metrics_20250104_030507.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 735.3264224940579,
4
+ 151.60405352153023,
5
+ 89.78745444698775
6
+ ],
7
+ "train_rmse": [
8
+ 23.047277585501725,
9
+ 11.651142931361225,
10
+ 9.012670799733398
11
+ ],
12
+ "train_mae": [
13
+ 13.923379173734634,
14
+ 7.57802535029291,
15
+ 6.274760499474182
16
+ ],
17
+ "train_ndcg": [
18
+ 0.8126091989344285,
19
+ 0.9122520486161368,
20
+ 0.9342558337535495
21
+ ],
22
+ "val_loss": [
23
+ 11324.795474004033,
24
+ 504789.3357626616,
25
+ 60333.76644566095
26
+ ],
27
+ "val_rmse": [
28
+ 24.241182599915337,
29
+ 77.56569549417645,
30
+ 27.3166621065554
31
+ ],
32
+ "val_mae": [
33
+ 10.046802049608372,
34
+ 22.964381659920537,
35
+ 9.750387768247235
36
+ ],
37
+ "val_ndcg": [
38
+ 0.40520864476018875,
39
+ 0.41310783446724736,
40
+ 0.4158413812295714
41
+ ],
42
+ "lr": [
43
+ 0.001,
44
+ 0.001,
45
+ 0.001
46
+ ]
47
+ }
metrics/training_metrics_20250104_030726.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "train_loss": [
3
+ 707.4203591421525,
4
+ 151.07523157776427,
5
+ 84.22673951021498,
6
+ 58.70951760002176,
7
+ 48.33882554846971
8
+ ],
9
+ "train_rmse": [
10
+ 22.78345383665935,
11
+ 11.619997248790062,
12
+ 8.761896087930726,
13
+ 7.343267081961219,
14
+ 6.71071821741142
15
+ ],
16
+ "train_mae": [
17
+ 13.44424786720817,
18
+ 7.635795480551517,
19
+ 6.188227196430608,
20
+ 5.423829537705755,
21
+ 5.011434268203576
22
+ ],
23
+ "train_ndcg": [
24
+ 0.8127191672971037,
25
+ 0.9208593445206151,
26
+ 0.937281206661948,
27
+ 0.948826389427591,
28
+ 0.9551151390392625
29
+ ],
30
+ "val_loss": [
31
+ 227.13909398833317,
32
+ 91.5767605084092,
33
+ 91.0302365459613,
34
+ 103.32767609553551,
35
+ 141.4468235556759
36
+ ],
37
+ "val_rmse": [
38
+ 12.660615976782926,
39
+ 8.360802165435022,
40
+ 8.298719194047607,
41
+ 7.70032410250077,
42
+ 8.050560559871839
43
+ ],
44
+ "val_mae": [
45
+ 8.709459909752233,
46
+ 6.094283602130947,
47
+ 5.971917348121529,
48
+ 5.656715124044846,
49
+ 5.366701940991986
50
+ ],
51
+ "val_ndcg": [
52
+ 0.382423224377988,
53
+ 0.3980416394881348,
54
+ 0.3991476348976591,
55
+ 0.4011840544529815,
56
+ 0.40102315963204227
57
+ ],
58
+ "lr": [
59
+ 0.001,
60
+ 0.001,
61
+ 0.001,
62
+ 0.001,
63
+ 0.001
64
+ ]
65
+ }