## 2 Materials and Methods
The number of neurons in the current layer is set with 'units', and instead of being a fixed number, it is a value from a list of values ranging from 16 to 128, 4 by 4 (16, 20, 24...124, 128). The final value is decided by a tuning algorithm. Activation functions are a fundamental component of neural networks, as they enable the learning of complex patterns in data. They transform the output of the output layer to construct the input of the next layer, and the most common activation function used in this neural network is the Relu rectifier function, defined as \(\text{relu(z)}=\text{max(0, z)}\). A regularisation technique (Elastic Net), which combines the L1 and L2 regularisations, was applied to the intermediate layer. The regularisation techniques are important in that they add a penalty to the loss function that the model seeks to minimise. The loss function is a measure that calculates the difference between the actual and predicted target attribute (measured as the mean squared error or MSE, which is common in linear regression models such as this one). Lasso or L1 regularisation uses the sum of the coefficients, driving some attributes to 0, essentially selecting only the relevant attributes and discarding others. L2, on the other hand, uses the sum of the squares of the coefficients, which drives some attributes towards 0 without reaching it. The L1 regularisation had previously been used by [PERSON] et al., but not Elastic Net [26]. During training, the coefficients update inversely exponentially with each iteration. As the algorithm minimises the loss function while considering penalties, it gradually learns which features contribute to the model and which can be reduced. These methods have been shown to improve the accuracy of models where features appear to be correlated, as is the case here. After creating the intermediate layer, it was necessary to normalise the data again (using BatchNormalization) and some of the data were removed with Dropout, to avoid always training with the same data and thus overfitting the model. The amount of dropped data is also decided by the tuning algorithm (between 10% and 50% of the data). An optimiser is a function that attempts to find which combinations of weights (relevance of variables) minimise the loss function, when applied to attributes. The Adam optimiser is probably the most popular. With each iteration, it calculates the derivative or gradient of the loss function with respect to the weights, i.e., how much the loss function varies with respect to the weights. It then updates a 'first moment estimate' and a'second moment estimate' (representing the average of gradients) and moves to the opposite side in the function relating loss to weights. This means that in the next iteration, the weights will have changed so that this loss function will be smaller (Figure S7). Once optimised, an instance of the model and tuner was created. The tuner is the algorithm that will search for the best hyperparameters of the model over 20 trials. The method it uses is probabilistic and is called Bayesian Optimisation (Figure S8). It balances exploration (trying new hyperparameters) and exploitation (using the values it already knows) to progressively obtain the best ones. The way it works is by using a surrogate function to approximate the loss function, and an acquisition function to select the next set of hyperparameters on which to evaluate the loss function. Finally, it evaluates the new value of the loss function and updates the surrogate function. Finally, the model was built using the best stored hyperparameters (Figure S9), and then the model was trained using 500 epochs, using a batch size of 32 and a validation split of 20%, saving the model in the file model.keras. In terms of computational characteristics, the application follows a standard web architecture, so it is divided into a frontend (which is the interface through which the user interacts with it) and a backend that receives and processes the data entered, returning the result.