From 41a220c5b3832ba75fa8f730933ba17d8bfde3aa Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 29 Oct 2018 20:50:04 -0400 Subject: [PATCH 01/15] ck estimator is classifier & num_classes>=2 in score.py --- sklearn/metrics/scorer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 59ecd65386823..e14bb8ea993da 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -183,7 +183,10 @@ def __call__(self, clf, X, y, sample_weight=None): y_pred = clf.predict_proba(X) if y_type == "binary": - y_pred = y_pred[:, 1] + if y_pred.shape[1]==2: + y_pred = y_pred[:, 1] + else: + raise ValueError('The output of the prediction is a vector, which is incompatible with a classifier. Check that the estimator is a classifier and the number of classes in the dataset is 2 or more.') elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T From 73489b3c7d63b56881ec079161dd5e19165758c1 Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 29 Oct 2018 21:02:28 -0400 Subject: [PATCH 02/15] fixed formatting issues after using flake8 --- sklearn/metrics/scorer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index e14bb8ea993da..88412d0348c12 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -183,10 +183,11 @@ def __call__(self, clf, X, y, sample_weight=None): y_pred = clf.predict_proba(X) if y_type == "binary": - if y_pred.shape[1]==2: + if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('The output of the prediction is a vector, which is incompatible with a classifier. Check that the estimator is a classifier and the number of classes in the dataset is 2 or more.') + raise ValueError('prediction output is a vector.') + raise ValueError('must be classifier w/ >=2 classes') elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T From 7cfe9ead70b107dd17b1463f5aac245859982d18 Mon Sep 17 00:00:00 2001 From: reshamas Date: Mon, 29 Oct 2018 21:49:58 -0400 Subject: [PATCH 03/15] putting assert error in 1 line instead of 2 --- sklearn/metrics/scorer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 88412d0348c12..c1c7360992b30 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -186,8 +186,7 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('prediction output is a vector.') - raise ValueError('must be classifier w/ >=2 classes') + raise ValueError('must use classifier w/ >=2 classes') elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T From 9054e9714a7a0c1e228bd3ec50733c4a265e4bd0 Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 30 Oct 2018 11:45:39 -0400 Subject: [PATCH 04/15] added test for this pull request --- sklearn/metrics/tests/test_classifier.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 sklearn/metrics/tests/test_classifier.py diff --git a/sklearn/metrics/tests/test_classifier.py b/sklearn/metrics/tests/test_classifier.py new file mode 100644 index 0000000000000..d7e0e566f2522 --- /dev/null +++ b/sklearn/metrics/tests/test_classifier.py @@ -0,0 +1,23 @@ +from sklearn import datasets # already imported in the test_classification file +from sklearn.model_selection import GridSearchCV +from sklearn.mixture import GaussianMixture +from sklearn.utils.testing import assert_raises +from sklearn.tree import DecisionTreeClassifier + +def test_check_estimator_one_class(): + # test with a GMM model + X,y = datasets.make_classification(n_samples = 10000, n_features=10, n_classes=2) + gmm_model = GaussianMixture() + # grid search + param_grid = {'n_components' : [1,2,3,4], + 'covariance_type': ['tied','full','spherical']} + grid_search = GridSearchCV(gmm_model, param_grid, scoring='roc_auc') + # Fit Grid Search with this dataset + grid_search.fit(X,y) + + # Test with a DecisionTreeClassifier() with a one class dataset + X2,y2 = datasets.make_classification(n_samples = 10000, n_features=10, n_classes=1) + dtc_model = DecisionTreeClassifier() + parameters = {'max_depth':[5,10,15]} + grid_search2 = GridSearchCV(dtc_model, parameters, scoring='roc_auc') + grid_search2.fit(X2,y2) From 7336082deb726c9d99908ca030a0575458524fea Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 30 Oct 2018 11:56:47 -0400 Subject: [PATCH 05/15] adding mixture test --- sklearn/metrics/tests/test_classifier.py | 23 ----------------------- sklearn/metrics/tests/test_mixture.py | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 sklearn/metrics/tests/test_classifier.py create mode 100644 sklearn/metrics/tests/test_mixture.py diff --git a/sklearn/metrics/tests/test_classifier.py b/sklearn/metrics/tests/test_classifier.py deleted file mode 100644 index d7e0e566f2522..0000000000000 --- a/sklearn/metrics/tests/test_classifier.py +++ /dev/null @@ -1,23 +0,0 @@ -from sklearn import datasets # already imported in the test_classification file -from sklearn.model_selection import GridSearchCV -from sklearn.mixture import GaussianMixture -from sklearn.utils.testing import assert_raises -from sklearn.tree import DecisionTreeClassifier - -def test_check_estimator_one_class(): - # test with a GMM model - X,y = datasets.make_classification(n_samples = 10000, n_features=10, n_classes=2) - gmm_model = GaussianMixture() - # grid search - param_grid = {'n_components' : [1,2,3,4], - 'covariance_type': ['tied','full','spherical']} - grid_search = GridSearchCV(gmm_model, param_grid, scoring='roc_auc') - # Fit Grid Search with this dataset - grid_search.fit(X,y) - - # Test with a DecisionTreeClassifier() with a one class dataset - X2,y2 = datasets.make_classification(n_samples = 10000, n_features=10, n_classes=1) - dtc_model = DecisionTreeClassifier() - parameters = {'max_depth':[5,10,15]} - grid_search2 = GridSearchCV(dtc_model, parameters, scoring='roc_auc') - grid_search2.fit(X2,y2) diff --git a/sklearn/metrics/tests/test_mixture.py b/sklearn/metrics/tests/test_mixture.py new file mode 100644 index 0000000000000..a79cafe3bccec --- /dev/null +++ b/sklearn/metrics/tests/test_mixture.py @@ -0,0 +1,23 @@ +# Author: Guillaume Lemaitre +# License: BSD 3 clause + +import pytest +import numpy as np + +from sklearn.mixture import GaussianMixture +from sklearn.mixture import BayesianGaussianMixture + + +@pytest.mark.parametrize( + "estimator", + [GaussianMixture(), + BayesianGaussianMixture()] +) +def test_gaussian_mixture_n_iter(estimator): + # check that n_iter is the number of iteration performed. + rng = np.random.RandomState(0) + X = rng.rand(10, 5) + max_iter = 1 + estimator.set_params(max_iter=max_iter) + estimator.fit(X) + assert estimator.n_iter_ == max_iter From 15a43978cc2e7495b04691d1314eec70f4502e37 Mon Sep 17 00:00:00 2001 From: Andreas Mueller Date: Fri, 9 Nov 2018 14:08:03 -0500 Subject: [PATCH 06/15] add regression test, also add fix for proba scorers --- sklearn/metrics/scorer.py | 11 ++++++++-- sklearn/metrics/tests/test_mixture.py | 23 --------------------- sklearn/metrics/tests/test_score_objects.py | 16 +++++++++++++- 3 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 sklearn/metrics/tests/test_mixture.py diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index c1c7360992b30..e500fab82a86c 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -126,7 +126,12 @@ def __call__(self, clf, X, y, sample_weight=None): y_type = type_of_target(y) y_pred = clf.predict_proba(X) if y_type == "binary": - y_pred = y_pred[:, 1] + if y_pred.shape[1] == 2: + y_pred = y_pred[:, 1] + else: + raise ValueError('Must use classifier with two classes' + ' for {} scoring'.format( + self._score_func.__name__)) if sample_weight is not None: return self._sign * self._score_func(y, y_pred, sample_weight=sample_weight, @@ -186,7 +191,9 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('must use classifier w/ >=2 classes') + raise ValueError('Must use classifier with two classes' + ' for {} scoring'.format( + self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T diff --git a/sklearn/metrics/tests/test_mixture.py b/sklearn/metrics/tests/test_mixture.py deleted file mode 100644 index a79cafe3bccec..0000000000000 --- a/sklearn/metrics/tests/test_mixture.py +++ /dev/null @@ -1,23 +0,0 @@ -# Author: Guillaume Lemaitre -# License: BSD 3 clause - -import pytest -import numpy as np - -from sklearn.mixture import GaussianMixture -from sklearn.mixture import BayesianGaussianMixture - - -@pytest.mark.parametrize( - "estimator", - [GaussianMixture(), - BayesianGaussianMixture()] -) -def test_gaussian_mixture_n_iter(estimator): - # check that n_iter is the number of iteration performed. - rng = np.random.RandomState(0) - X = rng.rand(10, 5) - max_iter = 1 - estimator.set_params(max_iter=max_iter) - estimator.fit(X) - assert estimator.n_iter_ == max_iter diff --git a/sklearn/metrics/tests/test_score_objects.py b/sklearn/metrics/tests/test_score_objects.py index a676541743b71..ef8d953526f85 100644 --- a/sklearn/metrics/tests/test_score_objects.py +++ b/sklearn/metrics/tests/test_score_objects.py @@ -370,7 +370,21 @@ def test_thresholded_scorers(): X, y = make_blobs(random_state=0, centers=3) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) clf.fit(X_train, y_train) - assert_raises(ValueError, get_scorer('roc_auc'), clf, X_test, y_test) + with pytest.raises(ValueError, match="multiclass format is not supported"): + get_scorer('roc_auc')(clf, X_test, y_test) + + # test error is raised with a single class present in model + # (predict_proba shape is not suitable for binary auc) + X, y = make_blobs(random_state=0, centers=2) + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) + clf = DecisionTreeClassifier() + clf.fit(X_train, np.zeros_like(y_train)) + with pytest.raises(ValueError, match="use classifier with two classes"): + get_scorer('roc_auc')(clf, X_test, y_test) + + # for proba scorers + with pytest.raises(ValueError, match="use classifier with two classes"): + get_scorer('neg_log_loss')(clf, X_test, y_test) def test_thresholded_scorers_multilabel_indicator_data(): From c08cb2eedbcb0a8637aad60fe013abbeec4c8b53 Mon Sep 17 00:00:00 2001 From: reshamas Date: Sat, 10 Nov 2018 20:44:34 -0500 Subject: [PATCH 07/15] updating scorer and test per edits by amueller --- sklearn/metrics/scorer.py | 3 ++- sklearn/metrics/tests/test_score_objects.py | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index c1c7360992b30..9c4577bc2f68b 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -186,7 +186,8 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('must use classifier w/ >=2 classes') + raise ValueError('got predict_proba of shape; use 2-class classifier' + 'for {} scoring'.format(self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T diff --git a/sklearn/metrics/tests/test_score_objects.py b/sklearn/metrics/tests/test_score_objects.py index 1a222cd7da353..64f92b8a99595 100644 --- a/sklearn/metrics/tests/test_score_objects.py +++ b/sklearn/metrics/tests/test_score_objects.py @@ -370,7 +370,21 @@ def test_thresholded_scorers(): X, y = make_blobs(random_state=0, centers=3) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) clf.fit(X_train, y_train) - assert_raises(ValueError, get_scorer('roc_auc'), clf, X_test, y_test) + with pytest.raises(ValueError, match="multiclass format is not supported"): + get_scorer('roc_auc')(clf, X_test, y_test) + + # test error is raised with a single class present in model + # (predict_proba shape is not suitable for binary auc) + X, y = make_blobs(random_state=0, centers=2) + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) + clf = DecisionTreeClassifier() + clf.fit(X_train, np.zeros_like(y_train)) + with pytest.raises(ValueError, match="use classifier with two classes"): + get_scorer('roc_auc')(clf, X_test, y_test) + + # for proba scorers + with pytest.raises(ValueError, match="use classifier with two classes"): + get_scorer('neg_log_loss')(clf, X_test, y_test) def test_thresholded_scorers_multilabel_indicator_data(): From 210424a79f2f7fb69462b96524f764b03357e9e3 Mon Sep 17 00:00:00 2001 From: reshamas Date: Sat, 10 Nov 2018 21:18:32 -0500 Subject: [PATCH 08/15] updating error description --- sklearn/metrics/scorer.py | 14 +++++++++++--- sklearn/metrics/tests/test_score_objects.py | 13 +++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 9c4577bc2f68b..2b1ed7f6bdef5 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -126,7 +126,13 @@ def __call__(self, clf, X, y, sample_weight=None): y_type = type_of_target(y) y_pred = clf.predict_proba(X) if y_type == "binary": - y_pred = y_pred[:, 1] + if y_pred.shape[1] == 2: + y_pred = y_pred[:, 1] + else: + raise ValueError('got predict_proba of shape;' + ' use 2-class classifier' + ' for {} scoring'.format( + self._score_func.__name__)) if sample_weight is not None: return self._sign * self._score_func(y, y_pred, sample_weight=sample_weight, @@ -186,8 +192,10 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('got predict_proba of shape; use 2-class classifier' - 'for {} scoring'.format(self._score_func.__name__)) + raise ValueError('got predict_proba of shape; ' + 'use 2-class classifier' + ' for {} scoring'.format( + self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T diff --git a/sklearn/metrics/tests/test_score_objects.py b/sklearn/metrics/tests/test_score_objects.py index 64f92b8a99595..af057240e262d 100644 --- a/sklearn/metrics/tests/test_score_objects.py +++ b/sklearn/metrics/tests/test_score_objects.py @@ -186,10 +186,11 @@ def check_scoring_validator_for_single_metric_usecases(scoring_validator): def check_multimetric_scoring_single_metric_wrapper(*args, **kwargs): - # This wraps the _check_multimetric_scoring to take in single metric - # scoring parameter so we can run the tests that we will run for - # check_scoring, for check_multimetric_scoring too for single-metric - # usecases + # This wraps the _check_multimetric_scoring to take in + # single metric scoring parameter so we can run the tests + # that we will run for check_scoring, for check_multimetric_scoring + # too for single-metric usecases + scorers, is_multi = _check_multimetric_scoring(*args, **kwargs) # For all single metric use cases, it should register as not multimetric assert_false(is_multi) @@ -372,7 +373,7 @@ def test_thresholded_scorers(): clf.fit(X_train, y_train) with pytest.raises(ValueError, match="multiclass format is not supported"): get_scorer('roc_auc')(clf, X_test, y_test) - + # test error is raised with a single class present in model # (predict_proba shape is not suitable for binary auc) X, y = make_blobs(random_state=0, centers=2) @@ -381,7 +382,7 @@ def test_thresholded_scorers(): clf.fit(X_train, np.zeros_like(y_train)) with pytest.raises(ValueError, match="use classifier with two classes"): get_scorer('roc_auc')(clf, X_test, y_test) - + # for proba scorers with pytest.raises(ValueError, match="use classifier with two classes"): get_scorer('neg_log_loss')(clf, X_test, y_test) From a9e873e99a851b9188263dc06146e9705a739580 Mon Sep 17 00:00:00 2001 From: reshamas Date: Sun, 11 Nov 2018 08:26:12 -0500 Subject: [PATCH 09/15] uh, fixed merge conflict --- sklearn/metrics/scorer.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 061c8cdf352bb..5593a3e06e450 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -129,12 +129,8 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: -<<<<<<< HEAD raise ValueError('got predict_proba of shape;' ' use 2-class classifier' -======= - raise ValueError('Must use classifier with two classes' ->>>>>>> 15a43978cc2e7495b04691d1314eec70f4502e37 ' for {} scoring'.format( self._score_func.__name__)) if sample_weight is not None: @@ -196,12 +192,8 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: -<<<<<<< HEAD - raise ValueError('got predict_proba of shape; ' - 'use 2-class classifier' -======= - raise ValueError('Must use classifier with two classes' ->>>>>>> 15a43978cc2e7495b04691d1314eec70f4502e37 + raise ValueError('got predict_proba of shape;' + ' use 2-class classifier' ' for {} scoring'.format( self._score_func.__name__)) elif isinstance(y_pred, list): From f0216740146a0f4ddd8fab88a311787ed5eaac75 Mon Sep 17 00:00:00 2001 From: reshamas Date: Sun, 11 Nov 2018 08:44:02 -0500 Subject: [PATCH 10/15] make error message wording consistent --- sklearn/metrics/scorer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 5593a3e06e450..4a672fff1215f 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -130,8 +130,8 @@ def __call__(self, clf, X, y, sample_weight=None): y_pred = y_pred[:, 1] else: raise ValueError('got predict_proba of shape;' - ' use 2-class classifier' - ' for {} scoring'.format( + ' use classifier with two' + ' classes for {} scoring'.format( self._score_func.__name__)) if sample_weight is not None: return self._sign * self._score_func(y, y_pred, From e9e492e004503b39984925190c3c7c768afbbfbc Mon Sep 17 00:00:00 2001 From: reshamas Date: Sun, 11 Nov 2018 08:46:22 -0500 Subject: [PATCH 11/15] use consistent wording for error in both places --- sklearn/metrics/scorer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 4a672fff1215f..cffd7296dbaa3 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -193,8 +193,8 @@ def __call__(self, clf, X, y, sample_weight=None): y_pred = y_pred[:, 1] else: raise ValueError('got predict_proba of shape;' - ' use 2-class classifier' - ' for {} scoring'.format( + ' use classifier with two' + ' classes for {} scoring'.format( self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T From 389482e1f2cb4258fb8340cef92ea71883328897 Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 13 Nov 2018 15:04:32 -0500 Subject: [PATCH 12/15] added shape value to error message --- sklearn/metrics/scorer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index cffd7296dbaa3..6b6443b0c811c 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -129,9 +129,10 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('got predict_proba of shape;' - ' use classifier with two' + raise ValueError('got predict_proba of shape {},' + ' but need classifier with two' ' classes for {} scoring'.format( + y_pred.shape, self._score_func.__name__)) if sample_weight is not None: return self._sign * self._score_func(y, y_pred, From dbda7a2035b803f90d9e5fd977fa8471b31e56b8 Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 13 Nov 2018 15:07:15 -0500 Subject: [PATCH 13/15] fixed formatting error from flake8 test --- sklearn/metrics/scorer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 6b6443b0c811c..2bdb4c3b2d31b 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -132,8 +132,7 @@ def __call__(self, clf, X, y, sample_weight=None): raise ValueError('got predict_proba of shape {},' ' but need classifier with two' ' classes for {} scoring'.format( - y_pred.shape, - self._score_func.__name__)) + y_pred.shape, self._score_func.__name__)) if sample_weight is not None: return self._sign * self._score_func(y, y_pred, sample_weight=sample_weight, From 8495900ca51703fa52766178b8bfbbc00b6f0d8d Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 13 Nov 2018 15:14:38 -0500 Subject: [PATCH 14/15] made updates after running pytests --- sklearn/metrics/scorer.py | 6 +++--- sklearn/metrics/tests/test_score_objects.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index 2bdb4c3b2d31b..d0dc6d48cc944 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -192,10 +192,10 @@ def __call__(self, clf, X, y, sample_weight=None): if y_pred.shape[1] == 2: y_pred = y_pred[:, 1] else: - raise ValueError('got predict_proba of shape;' - ' use classifier with two' + raise ValueError('got predict_proba of shape {},' + ' but need classifier with two' ' classes for {} scoring'.format( - self._score_func.__name__)) + y_pred.shape, self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T diff --git a/sklearn/metrics/tests/test_score_objects.py b/sklearn/metrics/tests/test_score_objects.py index af057240e262d..06c78faf36909 100644 --- a/sklearn/metrics/tests/test_score_objects.py +++ b/sklearn/metrics/tests/test_score_objects.py @@ -380,11 +380,11 @@ def test_thresholded_scorers(): X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) clf = DecisionTreeClassifier() clf.fit(X_train, np.zeros_like(y_train)) - with pytest.raises(ValueError, match="use classifier with two classes"): + with pytest.raises(ValueError, match="need classifier with two classes"): get_scorer('roc_auc')(clf, X_test, y_test) # for proba scorers - with pytest.raises(ValueError, match="use classifier with two classes"): + with pytest.raises(ValueError, match="need classifier with two classes"): get_scorer('neg_log_loss')(clf, X_test, y_test) From 4a256f1e2bf36f63076f4c4f3b869ca76116e5fc Mon Sep 17 00:00:00 2001 From: reshamas Date: Tue, 13 Nov 2018 15:51:09 -0500 Subject: [PATCH 15/15] line 198 too long, fixed formatting --- sklearn/metrics/scorer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sklearn/metrics/scorer.py b/sklearn/metrics/scorer.py index d0dc6d48cc944..3907e2439dfeb 100644 --- a/sklearn/metrics/scorer.py +++ b/sklearn/metrics/scorer.py @@ -195,7 +195,8 @@ def __call__(self, clf, X, y, sample_weight=None): raise ValueError('got predict_proba of shape {},' ' but need classifier with two' ' classes for {} scoring'.format( - y_pred.shape, self._score_func.__name__)) + y_pred.shape, + self._score_func.__name__)) elif isinstance(y_pred, list): y_pred = np.vstack([p[:, -1] for p in y_pred]).T