From 9312a17c8b6515770ce6c58206d1d54a53db2ccc Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Wed, 16 Aug 2017 19:44:53 +0800 Subject: [PATCH 01/10] add pos_label parameter --- sklearn/metrics/tests/test_ranking.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index db80691663606..287fd1e2382ae 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -371,6 +371,28 @@ def test_roc_curve_drop_intermediate(): [1.0, 0.9, 0.7, 0.6, 0.]) + # int pos_label and binary y_true + roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) + assert_almost_equal(roc_auc_score_1, roc_auc_score_2) + roc_auc_score_3 = roc_auc_score(y_true_2, y_pred, pos_label=1) + assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + + # str pos_label and binary y_true + roc_auc_score_2 = roc_auc_score(y_true_3, y_pred, pos_label='True') + assert_almost_equal(roc_auc_score_1, roc_auc_score_2) + roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') + assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + + # int pos_label and multilabel-indicator y_true + # can't support str pos_label and multilabel-indicator y_true + y_true_1 = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) + y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) + roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) + assert_almost_equal(roc_auc_score_1, roc_auc_score_2) + roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) + assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + + def test_auc(): # Test Area Under Curve (AUC) computation x = [0, 1] From 7e2b7562bd822975af94783aac858ccca2046cb1 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Wed, 16 Aug 2017 19:52:28 +0800 Subject: [PATCH 02/10] add pos_label parameter --- sklearn/metrics/ranking.py | 16 ++++++++++++---- sklearn/metrics/tests/test_common.py | 1 + sklearn/metrics/tests/test_ranking.py | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index 2003ed8b314c8..34f9441400577 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -23,6 +23,7 @@ import numpy as np from scipy.sparse import csr_matrix from scipy.stats import rankdata +from functools import partial from ..utils import assert_all_finite from ..utils import check_consistent_length @@ -188,8 +189,8 @@ def _binary_uninterpolated_average_precision( sample_weight=sample_weight) - -def roc_auc_score(y_true, y_score, average="macro", sample_weight=None): +def roc_auc_score(y_true, y_score, average="macro", sample_weight=None, + pos_label=None): """Compute Area Under the Curve (AUC) from prediction scores Note: this implementation is restricted to the binary classification task @@ -226,6 +227,9 @@ def roc_auc_score(y_true, y_score, average="macro", sample_weight=None): sample_weight : array-like of shape = [n_samples], optional Sample weights. + pos_label : int or str, default=None + The label of the positive class + Returns ------- auc : float @@ -251,17 +255,21 @@ def roc_auc_score(y_true, y_score, average="macro", sample_weight=None): 0.75 """ - def _binary_roc_auc_score(y_true, y_score, sample_weight=None): + def _binary_roc_auc_score(y_true, y_score, sample_weight=None, + pos_label=None): if len(np.unique(y_true)) != 2: raise ValueError("Only one class present in y_true. ROC AUC score " "is not defined in that case.") fpr, tpr, tresholds = roc_curve(y_true, y_score, + pos_label=pos_label, sample_weight=sample_weight) return auc(fpr, tpr, reorder=True) + _partial_binary_roc_auc_score = partial(_binary_roc_auc_score, + pos_label=pos_label) return _average_binary_score( - _binary_roc_auc_score, y_true, y_score, average, + _partial_binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 5f775aaf9ac8f..7447e9c971df6 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -257,6 +257,7 @@ "macro_f0.5_score", "macro_f1_score", "macro_f2_score", "macro_precision_score", "macro_recall_score", + "roc_auc_score", ] # Metrics with a "labels" argument diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 287fd1e2382ae..9fb6b28125351 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -371,6 +371,20 @@ def test_roc_curve_drop_intermediate(): [1.0, 0.9, 0.7, 0.6, 0.]) +def test_roc_auc_score_pos_label(): + # ensure the correctness of pos_label parameter in roc_auc_score + y_true_1 = [0, 1, 1, 0] + y_true_2 = [1, 2, 2, 1] + y_true_3 = ['False', 'True', 'True', 'False'] + y_pred = [0.1, 0.9, 0.2, 0.8] + roc_auc_score_1 = roc_auc_score(y_true_1, y_pred) + + # int pos_label and binary y_true + roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) + assert_almost_equal(roc_auc_score_1, roc_auc_score_2) + roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) + assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + # int pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) From e8226acdbc132bc73887a8b9809e6f85750baada Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Wed, 16 Aug 2017 20:33:26 +0800 Subject: [PATCH 03/10] minor update --- sklearn/metrics/tests/test_ranking.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 9fb6b28125351..3f49779db3441 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -398,7 +398,6 @@ def test_roc_auc_score_pos_label(): assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) # int pos_label and multilabel-indicator y_true - # can't support str pos_label and multilabel-indicator y_true y_true_1 = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) From ed34f9e589b36dc8cee6ec513afb03a30bd5f4f6 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Thu, 17 Aug 2017 10:47:08 +0800 Subject: [PATCH 04/10] remove support for multilabel-indicator --- sklearn/metrics/ranking.py | 16 +++++++++++----- sklearn/metrics/tests/test_ranking.py | 8 -------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index 34f9441400577..98d038b3d035e 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -266,11 +266,17 @@ def _binary_roc_auc_score(y_true, y_score, sample_weight=None, sample_weight=sample_weight) return auc(fpr, tpr, reorder=True) - _partial_binary_roc_auc_score = partial(_binary_roc_auc_score, - pos_label=pos_label) - return _average_binary_score( - _partial_binary_roc_auc_score, y_true, y_score, average, - sample_weight=sample_weight) + y_type = type_of_target(y_true) + if y_type == "binary": + _partial_binary_roc_auc_score = partial(_binary_roc_auc_score, + pos_label=pos_label) + return _average_binary_score( + _partial_binary_roc_auc_score, y_true, y_score, average, + sample_weight=sample_weight) + else: + return _average_binary_score( + _binary_roc_auc_score, y_true, y_score, average, + sample_weight=sample_weight) def _binary_clf_curve(y_true, y_score, pos_label=None, sample_weight=None): diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 3f49779db3441..c5dd3eb10ba83 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -397,14 +397,6 @@ def test_roc_auc_score_pos_label(): roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) - # int pos_label and multilabel-indicator y_true - y_true_1 = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) - y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) - roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) - assert_almost_equal(roc_auc_score_1, roc_auc_score_2) - roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) - assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) - def test_auc(): # Test Area Under Curve (AUC) computation From d362222a261df65f6f4c3fac8ce4bc153dc61b29 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Mon, 11 Sep 2017 16:33:22 +0800 Subject: [PATCH 05/10] pep fix --- sklearn/metrics/tests/test_ranking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index c5dd3eb10ba83..9858f385674e8 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -383,19 +383,19 @@ def test_roc_auc_score_pos_label(): roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) - assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) # int pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_2, y_pred, pos_label=1) - assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) # str pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_3, y_pred, pos_label='True') assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') - assert_almost_equal(roc_auc_score_1, 1-roc_auc_score_3) + assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) def test_auc(): From 4f1b98c2e89fb9626fdaec9d949954131209e991 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Mon, 11 Sep 2017 22:54:01 +0800 Subject: [PATCH 06/10] raise error --- sklearn/metrics/ranking.py | 4 ++++ sklearn/metrics/tests/test_ranking.py | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index 98d038b3d035e..f81de75ba25da 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -274,6 +274,10 @@ def _binary_roc_auc_score(y_true, y_score, sample_weight=None, _partial_binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) else: + if pos_label is not None: + raise ValueError("Parameter pos_label doesn't make sense for " + "multilabel-indicator y_true. Do not set " + "pos_label or set pos_label to None.") return _average_binary_score( _binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 9858f385674e8..b0101ec176cba 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -397,6 +397,13 @@ def test_roc_auc_score_pos_label(): roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) + # raise an error for multilabel-indicator y_true with pos_label + y_true_1 = np.array([['True', 'False'], ['False', 'True'], + ['False', 'True'], ['True', 'False']]) + y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) + assert_raises(ValueError, roc_auc_score, y_true_1, y_pred, + pos_label='True') + def test_auc(): # Test Area Under Curve (AUC) computation From a049a8b3088ebebaf03d45583ae4d14a910b3631 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Tue, 12 Sep 2017 11:02:52 +0800 Subject: [PATCH 07/10] support pos_label = 1 --- sklearn/metrics/ranking.py | 5 +++-- sklearn/metrics/tests/test_ranking.py | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index f81de75ba25da..b07947c6a00fe 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -274,10 +274,11 @@ def _binary_roc_auc_score(y_true, y_score, sample_weight=None, _partial_binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) else: - if pos_label is not None: + if pos_label is not None and pos_label != 1: raise ValueError("Parameter pos_label doesn't make sense for " "multilabel-indicator y_true. Do not set " - "pos_label or set pos_label to None.") + "pos_label or set pos_label to either None " + "or 1.") return _average_binary_score( _binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index b0101ec176cba..45127a1d9be5e 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -372,37 +372,41 @@ def test_roc_curve_drop_intermediate(): def test_roc_auc_score_pos_label(): - # ensure the correctness of pos_label parameter in roc_auc_score + # Ensure the correctness of pos_label parameter in roc_auc_score y_true_1 = [0, 1, 1, 0] y_true_2 = [1, 2, 2, 1] y_true_3 = ['False', 'True', 'True', 'False'] y_pred = [0.1, 0.9, 0.2, 0.8] roc_auc_score_1 = roc_auc_score(y_true_1, y_pred) - # int pos_label and binary y_true + # Test int pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - # int pos_label and binary y_true + # Test int pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_2, y_pred, pos_label=1) assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - # str pos_label and binary y_true + # Test str pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_3, y_pred, pos_label='True') assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - # raise an error for multilabel-indicator y_true with pos_label - y_true_1 = np.array([['True', 'False'], ['False', 'True'], - ['False', 'True'], ['True', 'False']]) + # Raise an error for multilabel-indicator y_true with + # pos_label other than None or 1 + y_true_1 = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) + roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=None) + assert_almost_equal(roc_auc_score_1, roc_auc_score_2) + roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=1) + assert_almost_equal(roc_auc_score_1, roc_auc_score_3) assert_raises(ValueError, roc_auc_score, y_true_1, y_pred, - pos_label='True') + pos_label=0) def test_auc(): From 2e5037fcbfbe0caecb504720661e2e832b377b40 Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Tue, 12 Sep 2017 22:51:13 +0800 Subject: [PATCH 08/10] minor update --- sklearn/metrics/ranking.py | 2 +- sklearn/metrics/tests/test_ranking.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index b07947c6a00fe..3c7781669d1cb 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -228,7 +228,7 @@ def roc_auc_score(y_true, y_score, average="macro", sample_weight=None, Sample weights. pos_label : int or str, default=None - The label of the positive class + The label of the positive class. Only make sense for binary y_true. Returns ------- diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index 45127a1d9be5e..f7f18034b680e 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -385,7 +385,6 @@ def test_roc_auc_score_pos_label(): roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - # Test int pos_label and binary y_true roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) assert_almost_equal(roc_auc_score_1, roc_auc_score_2) roc_auc_score_3 = roc_auc_score(y_true_2, y_pred, pos_label=1) From 1c0e3364e1c747170ec9aa3b893bcfffa9ef346f Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Wed, 13 Sep 2017 08:49:14 +0800 Subject: [PATCH 09/10] move test to test_common --- sklearn/metrics/tests/test_common.py | 4 +-- sklearn/metrics/tests/test_ranking.py | 38 +++++---------------------- 2 files changed, 9 insertions(+), 33 deletions(-) diff --git a/sklearn/metrics/tests/test_common.py b/sklearn/metrics/tests/test_common.py index 7447e9c971df6..0eb7873be92d3 100644 --- a/sklearn/metrics/tests/test_common.py +++ b/sklearn/metrics/tests/test_common.py @@ -596,7 +596,7 @@ def test_invariance_string_vs_numbers_labels(): for name, metric in THRESHOLDED_METRICS.items(): if name in ("log_loss", "hinge_loss", "unnormalized_log_loss", - "brier_score_loss"): + "brier_score_loss", "roc_auc_score"): # Ugly, but handle case with a pos_label and label metric_str = metric if name in METRICS_WITH_POS_LABEL: @@ -608,7 +608,7 @@ def test_invariance_string_vs_numbers_labels(): err_msg="{0} failed string vs number " "invariance test".format(name)) - measure_with_strobj = metric(y1_str.astype('O'), y2) + measure_with_strobj = metric_str(y1_str.astype('O'), y2) assert_array_equal(measure_with_number, measure_with_strobj, err_msg="{0} failed string object vs number " "invariance test".format(name)) diff --git a/sklearn/metrics/tests/test_ranking.py b/sklearn/metrics/tests/test_ranking.py index f7f18034b680e..277846bac8b3f 100644 --- a/sklearn/metrics/tests/test_ranking.py +++ b/sklearn/metrics/tests/test_ranking.py @@ -371,40 +371,16 @@ def test_roc_curve_drop_intermediate(): [1.0, 0.9, 0.7, 0.6, 0.]) -def test_roc_auc_score_pos_label(): - # Ensure the correctness of pos_label parameter in roc_auc_score - y_true_1 = [0, 1, 1, 0] - y_true_2 = [1, 2, 2, 1] - y_true_3 = ['False', 'True', 'True', 'False'] - y_pred = [0.1, 0.9, 0.2, 0.8] - roc_auc_score_1 = roc_auc_score(y_true_1, y_pred) - - # Test int pos_label and binary y_true - roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=1) - assert_almost_equal(roc_auc_score_1, roc_auc_score_2) - roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=0) - assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - - roc_auc_score_2 = roc_auc_score(y_true_2, y_pred, pos_label=2) - assert_almost_equal(roc_auc_score_1, roc_auc_score_2) - roc_auc_score_3 = roc_auc_score(y_true_2, y_pred, pos_label=1) - assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - - # Test str pos_label and binary y_true - roc_auc_score_2 = roc_auc_score(y_true_3, y_pred, pos_label='True') - assert_almost_equal(roc_auc_score_1, roc_auc_score_2) - roc_auc_score_3 = roc_auc_score(y_true_3, y_pred, pos_label='False') - assert_almost_equal(roc_auc_score_1, 1 - roc_auc_score_3) - +def test_roc_auc_score_pos_label_multilabel_indicator(): # Raise an error for multilabel-indicator y_true with # pos_label other than None or 1 - y_true_1 = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) + y_true = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) y_pred = np.array([[0.9, 0.1], [0.1, 0.9], [0.8, 0.2], [0.2, 0.8]]) - roc_auc_score_2 = roc_auc_score(y_true_1, y_pred, pos_label=None) - assert_almost_equal(roc_auc_score_1, roc_auc_score_2) - roc_auc_score_3 = roc_auc_score(y_true_1, y_pred, pos_label=1) - assert_almost_equal(roc_auc_score_1, roc_auc_score_3) - assert_raises(ValueError, roc_auc_score, y_true_1, y_pred, + roc_auc_score_1 = roc_auc_score(y_true, y_pred, pos_label=None) + assert_almost_equal(roc_auc_score_1, 0.75) + roc_auc_score_2 = roc_auc_score(y_true, y_pred, pos_label=1) + assert_almost_equal(roc_auc_score_2, 0.75) + assert_raises(ValueError, roc_auc_score, y_true, y_pred, pos_label=0) From 644fb0a7c35c34568d3b0a91d0d565cc63849e0c Mon Sep 17 00:00:00 2001 From: Hanmin Qin Date: Tue, 19 Sep 2017 21:12:17 +0800 Subject: [PATCH 10/10] minor improve --- sklearn/metrics/ranking.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sklearn/metrics/ranking.py b/sklearn/metrics/ranking.py index 3c7781669d1cb..6ee34d1615b3d 100644 --- a/sklearn/metrics/ranking.py +++ b/sklearn/metrics/ranking.py @@ -227,8 +227,11 @@ def roc_auc_score(y_true, y_score, average="macro", sample_weight=None, sample_weight : array-like of shape = [n_samples], optional Sample weights. - pos_label : int or str, default=None - The label of the positive class. Only make sense for binary y_true. + pos_label : int or str, optional + Default is ``None``. If ``None``, pos_label is considered to be 1. + + The label of the positive class. For multilabel-indicator y_true, + pos_label is fixed to 1. Returns ------- @@ -275,7 +278,7 @@ def _binary_roc_auc_score(y_true, y_score, sample_weight=None, sample_weight=sample_weight) else: if pos_label is not None and pos_label != 1: - raise ValueError("Parameter pos_label doesn't make sense for " + raise ValueError("Parameter pos_label is fixed to 1 for" "multilabel-indicator y_true. Do not set " "pos_label or set pos_label to either None " "or 1.")