From 33de7d6f5468a4c36f1393b2c5e954c00d332d9e Mon Sep 17 00:00:00 2001 From: Amax Date: Tue, 18 Apr 2023 21:41:10 -0400 Subject: [PATCH 1/2] fixes --- imblearn/metrics/_classification.py | 2 +- imblearn/metrics/tests/test_classification.py | 42 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/imblearn/metrics/_classification.py b/imblearn/metrics/_classification.py index b377db592..e9d1700d7 100644 --- a/imblearn/metrics/_classification.py +++ b/imblearn/metrics/_classification.py @@ -1030,7 +1030,7 @@ class 2 1.00 0.67 1.00 0.80 0.82 0.64\ report_dict_label[headers[-1]] = support[i] report += fmt % tuple(values) - report_dict[label] = report_dict_label + report_dict[target_names[i]] = report_dict_label report += "\n" diff --git a/imblearn/metrics/tests/test_classification.py b/imblearn/metrics/tests/test_classification.py index cb9d25309..8169cee81 100644 --- a/imblearn/metrics/tests/test_classification.py +++ b/imblearn/metrics/tests/test_classification.py @@ -459,7 +459,7 @@ def test_iba_error_y_score_prob_error(score_loss): aps(y_true, y_pred) -def test_classification_report_imbalanced_dict(): +def test_classification_report_imbalanced_dict_with_target_names(): iris = datasets.load_iris() y_true, y_pred, _ = make_prediction(dataset=iris, binary=False) @@ -471,12 +471,44 @@ def test_classification_report_imbalanced_dict(): output_dict=True, ) outer_keys = set(report.keys()) - inner_keys = set(report[0].keys()) + inner_keys = set(report["setosa"].keys()) expected_outer_keys = { - 0, - 1, - 2, + "setosa", + "versicolor", + "virginica", + "avg_pre", + "avg_rec", + "avg_spe", + "avg_f1", + "avg_geo", + "avg_iba", + "total_support", + } + expected_inner_keys = {"spe", "f1", "sup", "rec", "geo", "iba", "pre"} + + assert outer_keys == expected_outer_keys + assert inner_keys == expected_inner_keys + + +def test_classification_report_imbalanced_dict_without_target_names(): + iris = datasets.load_iris() + y_true, y_pred, _ = make_prediction(dataset=iris, binary=False) + print(iris.target_names) + report = classification_report_imbalanced( + y_true, + y_pred, + labels=np.arange(len(iris.target_names)), + output_dict=True, + ) + print(report.keys()) + outer_keys = set(report.keys()) + inner_keys = set(report["0"].keys()) + + expected_outer_keys = { + "0", + "1", + "2", "avg_pre", "avg_rec", "avg_spe", From 271fe7dde5617fb25e6c7e517f9c393de2024065 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Sat, 8 Jul 2023 21:10:31 +0200 Subject: [PATCH 2/2] add changelog --- doc/whats_new/v0.11.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/whats_new/v0.11.rst b/doc/whats_new/v0.11.rst index 9c7feefea..7588c71a1 100644 --- a/doc/whats_new/v0.11.rst +++ b/doc/whats_new/v0.11.rst @@ -9,6 +9,10 @@ Changelog Bug fixes ......... +- Fix a bug in :func:`~imblearn.metrics.classification_report_imbalanced` where the + parameter `target_names` was not taken into account when `output_dict=True`. + :pr:`989` by :user:`AYY7 `. + - :class:`~imblearn.over_sampling.SMOTENC` now handles mix types of data type such as `bool` and `pd.category` by delegating the conversion to scikit-learn encoder. :pr:`1002` by :user:`Guillaume Lemaitre `.