From 6092840ac306e0dd2c080d4f088eabd5704960d2 Mon Sep 17 00:00:00 2001 From: kausthub-kannan Date: Mon, 9 Oct 2023 01:32:28 +0530 Subject: [PATCH 1/3] Added Huber Loss Function --- machine_learning/loss_functions/huber_loss.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 machine_learning/loss_functions/huber_loss.py diff --git a/machine_learning/loss_functions/huber_loss.py b/machine_learning/loss_functions/huber_loss.py new file mode 100644 index 000000000000..b3b7c0195d90 --- /dev/null +++ b/machine_learning/loss_functions/huber_loss.py @@ -0,0 +1,52 @@ +""" +Huber Loss Function + +Description: +Huber loss function describes the penalty incurred by an estimation procedure. +It serves as a measure of the model's accuracy in regression tasks. + +Formula: +Huber Loss = if |y_true - y_pred| <= delta then 0.5 * (y_true - y_pred)^2 + else delta * |y_true - y_pred| - 0.5 * delta^2 + +Source: +[Wikipedia - Huber Loss](https://en.wikipedia.org/wiki/Huber_loss) +""" + +import numpy as np + + +def huber_loss(y_true: np.ndarray, y_pred: np.ndarray, delta: float) -> float: + """ + Calculate the Huber Loss. + + Parameters: + - y_true: The true values (ground truth). + - y_pred: The predicted values. + + Returns: + - mse: The mean of Huber Loss between y_true and y_pred. + + Example usage: + >>> true_values = np.array([0.9, 10.0, 2.0, 1.0, 5.2]) + >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) + >>> huber_loss(true_values, predicted_values, 1.0) + 2.1020000000000003 + >>> true_labels = np.array([11.0, 21.0, 3.32, 4.0, 5.0]) + >>> predicted_probs = np.array([8.3, 20.8, 2.9, 11.2, 5.0]) + >>> huber_loss(true_labels, predicted_probs, 1.0) + 1.8016399999999997 + """ + + if len(y_true) != len(y_pred): + raise ValueError("Input arrays must have the same length.") + + huber_mse = 0.5 * (y_true - y_pred) ** 2 + huber_mae = delta * (np.abs(y_true - y_pred) - 0.5 * delta) + return np.where(np.abs(y_true - y_pred) <= delta, huber_mse, huber_mae).mean() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From fd67a73a5caaea6ba778efde03dbbb439c24cc4e Mon Sep 17 00:00:00 2001 From: kausthub-kannan Date: Mon, 9 Oct 2023 01:34:44 +0530 Subject: [PATCH 2/3] Fixed Typos --- machine_learning/loss_functions/huber_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine_learning/loss_functions/huber_loss.py b/machine_learning/loss_functions/huber_loss.py index b3b7c0195d90..4958e0190b9e 100644 --- a/machine_learning/loss_functions/huber_loss.py +++ b/machine_learning/loss_functions/huber_loss.py @@ -25,7 +25,7 @@ def huber_loss(y_true: np.ndarray, y_pred: np.ndarray, delta: float) -> float: - y_pred: The predicted values. Returns: - - mse: The mean of Huber Loss between y_true and y_pred. + - huber_loss: The mean of Huber Loss between y_true and y_pred. Example usage: >>> true_values = np.array([0.9, 10.0, 2.0, 1.0, 5.2]) From 6d64e5de294fe6d245ac78a98a2b2203e341f735 Mon Sep 17 00:00:00 2001 From: kausthub-kannan Date: Mon, 9 Oct 2023 12:35:17 +0530 Subject: [PATCH 3/3] Added np.isclose() to doctests --- machine_learning/loss_functions/huber_loss.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/machine_learning/loss_functions/huber_loss.py b/machine_learning/loss_functions/huber_loss.py index 4958e0190b9e..202e013f2928 100644 --- a/machine_learning/loss_functions/huber_loss.py +++ b/machine_learning/loss_functions/huber_loss.py @@ -18,7 +18,7 @@ def huber_loss(y_true: np.ndarray, y_pred: np.ndarray, delta: float) -> float: """ - Calculate the Huber Loss. + Calculate the mean of Huber Loss. Parameters: - y_true: The true values (ground truth). @@ -30,12 +30,12 @@ def huber_loss(y_true: np.ndarray, y_pred: np.ndarray, delta: float) -> float: Example usage: >>> true_values = np.array([0.9, 10.0, 2.0, 1.0, 5.2]) >>> predicted_values = np.array([0.8, 2.1, 2.9, 4.2, 5.2]) - >>> huber_loss(true_values, predicted_values, 1.0) - 2.1020000000000003 + >>> np.isclose(huber_loss(true_values, predicted_values, 1.0), 2.102) + True >>> true_labels = np.array([11.0, 21.0, 3.32, 4.0, 5.0]) >>> predicted_probs = np.array([8.3, 20.8, 2.9, 11.2, 5.0]) - >>> huber_loss(true_labels, predicted_probs, 1.0) - 1.8016399999999997 + >>> np.isclose(huber_loss(true_labels, predicted_probs, 1.0), 1.80164) + True """ if len(y_true) != len(y_pred):