From ca3d623f9a89defe4f0a0f7aa464351039f8e3df Mon Sep 17 00:00:00 2001 From: Darsh Baxi Date: Thu, 16 Oct 2025 12:10:52 +0530 Subject: [PATCH 1/2] rmse added --- pydeepflow/metrics.py | 20 ++++++++++++++++++++ pydeepflow/model.py | 9 +++++++-- tests/test_metrics.py | 21 ++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/pydeepflow/metrics.py b/pydeepflow/metrics.py index d9a5f47..47ae5c6 100644 --- a/pydeepflow/metrics.py +++ b/pydeepflow/metrics.py @@ -157,3 +157,23 @@ def r2_score(y_true, y_pred): ss_tot = np.sum((y_true - np.mean(y_true)) ** 2) return 1 - (ss_res / ss_tot) +def root_mean_squared_error(y_true, y_pred): + """ + Calculates the Root Mean Squared Error (RMSE). + + RMSE = sqrt((1/n) * Σ(y_true - y_pred)^2) + + Parameters + ---------- + y_true : array-like + Ground truth (correct) target values. + y_pred : array-like + Estimated target values. + + Returns + ------- + float + The RMSE score. + """ + return ((np.array(y_true) - np.array(y_pred)) ** 2).mean() ** 0.5 + \ No newline at end of file diff --git a/pydeepflow/model.py b/pydeepflow/model.py index 0b4d9c8..d19c73c 100644 --- a/pydeepflow/model.py +++ b/pydeepflow/model.py @@ -4,7 +4,7 @@ import matplotlib.pyplot as plt from pydeepflow.activations import activation, activation_derivative from pydeepflow.losses import get_loss_function, get_loss_derivative -from pydeepflow.metrics import precision_score, recall_score, f1_score, confusion_matrix,mean_absolute_error, mean_squared_error, r2_score +from pydeepflow.metrics import precision_score, recall_score, f1_score, confusion_matrix,mean_absolute_error, mean_squared_error, r2_score, root_mean_squared_error from pydeepflow.device import Device from pydeepflow.regularization import Regularization from pydeepflow.checkpoints import ModelCheckpoint @@ -763,7 +763,7 @@ def evaluate(self, X, y, metrics=['loss', 'accuracy']): y (np.ndarray): The true labels for evaluation. metrics (list, optional): A list of metrics to calculate. Defaults to ['loss', 'accuracy']. - Available metrics: 'loss', 'accuracy', 'precision', 'recall', 'f1_score', 'confusion_matrix'. + Available metrics: 'loss', 'accuracy', 'precision', 'recall', 'f1_score', 'confusion_matrix', 'root_mean_squared_error'. Returns: dict: A dictionary where keys are the metric names and values are the computed scores. @@ -802,6 +802,9 @@ def evaluate(self, X, y, metrics=['loss', 'accuracy']): if 'r2_score' in metrics: results['r2_score'] = r2_score(y, predictions) + if 'root_mean_squared_error' in metrics: + results['root_mean_squared_error'] = root_mean_squared_error(y, predictions) + return results @@ -1638,6 +1641,8 @@ def evaluate(self, X, y, metrics=['loss', 'accuracy']): if 'r2_score' in metrics: results['r2_score'] = r2_score(y, predictions) + + if 'root_mean_squared_error' in metrics:results['root_mean_squared_error'] = root_mean_squared_error(y, predictions) return results # Removed confusion_matrix for simplification/dependency reasons diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 926b34a..962efb8 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -2,7 +2,8 @@ import numpy as np from pydeepflow.metrics import ( precision_score, recall_score, f1_score, confusion_matrix, - mean_absolute_error, mean_squared_error, r2_score + mean_absolute_error, mean_squared_error, r2_score,root_mean_squared_error + ) class TestMetrics(unittest.TestCase): @@ -54,5 +55,23 @@ def test_r2_score(self): # R^2 = 1 - (1.5 / 29.1875) = 1 - 0.051389... approx 0.9486 self.assertAlmostEqual(r2_score(self.y_true_reg, self.y_pred_reg), 0.94861051, places=5) + + def test_root_mean_squared_error(self): + # Step 1: Differences + # (3 - 2.5) = 0.5 + # (-0.5 - 0.0) = -0.5 + # (2 - 2) = 0 + # (7 - 8) = -1 + # + # Step 2: Squared differences + # [0.5², (-0.5)², 0², (-1)²] = [0.25, 0.25, 0, 1] + # + # Step 3: Mean Squared Error (MSE) + # (0.25 + 0.25 + 0 + 1) / 4 = 0.375 + # + # Step 4: Root Mean Squared Error (RMSE) + # sqrt(0.375) = 0.6123724356957945 + self.assertAlmostEqual(root_mean_squared_error(self.y_true_reg, self.y_pred_reg), 0.6123724356957945, places=6) + if __name__ == '__main__': unittest.main() \ No newline at end of file From a3047f76ba423da2af74a2cc4eaa402dcd56170e Mon Sep 17 00:00:00 2001 From: Darsh Baxi Date: Thu, 16 Oct 2025 12:25:12 +0530 Subject: [PATCH 2/2] minor changes --- pydeepflow/model.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pydeepflow/model.py b/pydeepflow/model.py index d19c73c..1acdf1b 100644 --- a/pydeepflow/model.py +++ b/pydeepflow/model.py @@ -1642,7 +1642,8 @@ def evaluate(self, X, y, metrics=['loss', 'accuracy']): if 'r2_score' in metrics: results['r2_score'] = r2_score(y, predictions) - if 'root_mean_squared_error' in metrics:results['root_mean_squared_error'] = root_mean_squared_error(y, predictions) + if 'root_mean_squared_error' in metrics: + results['root_mean_squared_error'] = root_mean_squared_error(y, predictions) return results # Removed confusion_matrix for simplification/dependency reasons