diff --git a/pydeepflow/metrics.py b/pydeepflow/metrics.py index d9a5f47..92aff3e 100644 --- a/pydeepflow/metrics.py +++ b/pydeepflow/metrics.py @@ -157,3 +157,25 @@ 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 rmse(y_true, y_pred): + """ + Compute Root Mean Squared Error between true and predicted values. + + 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. + """ + y_true = np.array(y_true) + y_pred = np.array(y_pred) + return np.sqrt(np.mean((y_true - y_pred) ** 2)) + diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 926b34a..1b08529 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -2,7 +2,7 @@ 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, rmse ) class TestMetrics(unittest.TestCase): @@ -54,5 +54,11 @@ 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_rmse(self): + y_true = np.array([1, 2, 3]) + y_pred = np.array([2, 2, 4]) + expected = np.sqrt(((1-2)**2 + (2-2)**2 + (3-4)**2) / 3) + self.assertAlmostEqual(rmse(y_true, y_pred), expected) + if __name__ == '__main__': unittest.main() \ No newline at end of file