## 4 Experiments
### Model Configuration  
The configuration of the models used in this article are in Table 1. These models were selected to evaluate different levels of complexity, ranging from relatively simple approaches to more advanced hybrid architectures that simultaneously capture spatial and temporal patterns. The specific structure of each model and its hyperparameters were determined through an exploratory process based on trial and error, empirically optimizing performance on the validation set. Figure 6: Representation of the spatial graph constructed from the acoustic measurement stations in Madrid. Each node corresponds to a station, and the edges connect the 15 nearest neighbors according to geodetic distance (Haversine), capturing the urban spatial structure relevant for GCN modeling. Huber Loss is used as the loss function due to its robustness to outliers and predictions that deviate significantly from actual values. The Huber loss combines the advantages of Mean Squared Error (MSE), which heavily penalizes large deviations, with those of Mean Absolute Error (MAE), which is less sensitive to extreme values. The mathematical expression of the Huber loss is:  
\[L_{\delta}(y,\hat{y})= \begin{cases}\frac{1}{2}(y-\hat{y})^{2}&\text{if }|y-\hat{y}|\leq\delta,\\ \delta|y-\hat{y}|-\frac{1}{2}\delta^{2}&\text{otherwise},\end{cases} \]  
where \(y\) is the true value, \(\hat{y}\) is the model prediction, and \(\delta\) is a hyperparameter that sets the threshold between quadratic (for small errors) and linear behavior (for large errors). In our case, \(\delta\) is determined empirically through trial and error to maximize predictive performance on the validation set. The Huber loss is integrated into the training process using the standard gradient-based optimization procedure. In each training epoch, predictions are made on the training set, and the loss is computed using the Huber function. The error is then backpropagated, and the model's weights are adjusted based on the gradients. This process is repeated iteratively until a convergence criterion is met, based on the model's performance on the validation set, ensuring greater stability and robustness in the presence of outliers or anomalies in the data. To optimize training, a learning rate scheduler is used, which dynamically adjusts the rate according to the following expression: \begin{table}
\begin{tabular}{l l} \hline
**Model** & **Structure** \\ \hline LSTM & LSTM: 12 inputs, 14 units, 10\% dropout \\ \hline \multirow{3}{*}{GAT} & GATConv: 12 to 128, 8 attention heads \\  & GATConv: 1024 to 128, 1 attention head \\  & Linear layer: 128 to 14 \\ \hline \multirow{3}{*}{CNN3D+LSTM} & Conv3D: 1 to 32 channels, \(3\times 3\times 3\) kernel, padding 1 \\  & LSTM: 32 to 64 units \\  & Dropout: 10\% \\  & Linear layer: 64 to 14 \\ \hline \multirow{3}{*}{GraphSAGE+LSTM} & GraphSAGE: 12 to 12, mean aggregation \\  & LSTM: 12 to 32 units \\  & Dropout: 10\% \\  & Linear layer: 32 to 14 \\ \hline \multirow{3}{*}{TransformerConv} & TransformerConv: 12 to 128, 1 attention head \\  & Linear layer: 128 to 14 \\ \hline \multirow{3}{*}{GraphSAGE} & GraphSAGE: 12 to 128, mean aggregation \\  & Linear layer: 128 to 14 \\ \hline \multirow{3}{*}{CNN1D+LSTM+TransformerConv} & Conv1D: 12 to 16, kernel 3, padding 1 \\  & Conv1D: 16 to 32, kernel 3, padding 1 \\ \cline{1-1}  & LSTM: 32 to 64 units \\ \cline{1-1}  & TransformerConv: 64 to 64, 2 attention heads, no concatenation \\ \cline{1-1}  & Dropout: 40\% \\ \cline{1-1}  & Linear layer: 64 to 14 \\ \hline \multirow{3}{*}{Transformer} & Transformer encoder: dimension 12, 2 attention heads \\ \cline{1-1}  & Dropout: 40\% \\ \cline{1-1}  & Linear layer: 12 to 14 \\ \hline \end{tabular}
\end{table} 
Table 1: Model structure and main parameters. \[\text{lr}=\text{lr}\times\gamma^{\text{epoch}},\]  
where lr is the current learning rate, \(\gamma\) is the reduction factor, epoch is the current epoch, and step_size is the epoch interval at which the rate is adjusted.