3.11. Loss Functions

Loss Functions are metrics that evaluate the residuals vector between reference and predicted properties \((\boldsymbol{w}/\boldsymbol{\sigma})(\boldsymbol{y} - \boldsymbol{\hat{y}})\), which is generated every time DataSet.evaluate() is called (note that although DataSet.evaluate() returns the non-weighted residuals, the Loss Function always receives a residuals vector that is weighted by \(w/\sigma\)).

By default, the following string keywords are recognized as loss functions
  • lad, lae : Least Absolute Error
  • rmsd, rmse : Root-Mean-Square Deviation
  • mad, mae : Mean Absolute Deviation
  • sse, rss : Sum of Squared Errors (this is the default optimization loss)

and can be passed to an Optimization in one of the following ways:

my_optimization = Optimization(*args, loss='mae') # As the string keyword

from scm.params.core.lossfunctions import MAE # Loss functions are not imported automatically
my_optimization = Optimization(*args, loss=MAE()) # Or directly

After calling my_optimization.optimize(), generated properties will consequently be compared with the MAE. A loss function can also be passed to DataSet.evaluate() in the same manner.

3.11.1. Least Absolute Error

class LAE

Least absolute error (LAE), least absolute deviations (LAD) loss.

(3.5)\[L_\mathrm{LAE} = \sum_{i=1}^N | y_i - \hat{y}_i |\]

Accessible with the strings 'lae', 'lad'.

3.11.2. Mean Absolute Error

class MAE

Mean Absolute Error (MAE, MAD) loss.

(3.6)\[L_\mathrm{MAE} = \frac{1}{N} \sum_{i=1}^N | y_i - \hat{y}_i |\]

Accessible with the strings 'mae', 'mad'.

3.11.3. Root-Mean-Square Error

class RMSE

Root-Mean-Square Error (RMSE, RMSD) loss.

(3.7)\[L_\mathrm{RMSE} = \sqrt{ \frac{1}{N} \sum_{i=1}^N \big( (y_i - \hat{y}_i) \big)^2 }\]

Accessible with the strings 'rmse', 'rmsd'.

3.11.4. Sum of Squares Error

class SSE

Residual Sum of Squares or Sum of Squared Error loss. This loss function is commonly used for ReaxFF parameter fitting.

(3.8)\[L_\mathrm{SSE} = \sum_{i=1}^N (y_i - \hat{y}_i)^2\]

Accessible with the strings 'sse', 'rss'.

3.11.5. Loss Function API

User-specific loss functions can be defined by inheriting from the base class below. Please make sure that your loss defines the attributes fx and contribution. The latter should contain a percentual per-element contribution of residuals to the overall loss function value.

Note that although the residuals are depicted as a single vector throughout the documentation, the data structure that a Loss receives is a List[1d array], where every element in the list stores the (weighted) residuals vector of the respective Data Set entry.

class Loss

Base class for the mathematical definition of a loss function.

__call__(residuals: List[numpy.ndarray]) → float

When DataSet.evaluate() is called, reference and predicted values are extracted for each entry and combined into a weighted list of residuals where every entry represents \((w_i/\sigma_i)(y_i-\hat{y}_i)\). The loss computes a metric given this residuals vector.
This method should return two values: the numerical loss, and a 1d array of per-entry contributions to the former.

residuals : List of 1d arrays
List of \((w_i/\sigma_i)(y_i-\hat{y}_i)\) elements.
loss: float
Total calculated loss
contributions: ndarray
1d array of per-entry contributions to the overall loss

Allow string representations of built-in losses.