From 7ef3323788fe793418ff09c5d2ee75e3c94775d0 Mon Sep 17 00:00:00 2001 From: aashil Date: Wed, 7 Dec 2016 20:45:41 -0500 Subject: [PATCH 1/2] [MRG] Fix the element-wise comparison error thrown by numpy. * Refactored the if clause and add proper check for valid strings. * Fix PEP8 errors. --- sklearn/metrics/regression.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sklearn/metrics/regression.py b/sklearn/metrics/regression.py index e4af5b292183f..e4e81a4ea5228 100644 --- a/sklearn/metrics/regression.py +++ b/sklearn/metrics/regression.py @@ -90,7 +90,11 @@ def _check_reg_targets(y_true, y_pred, multioutput): n_outputs = y_true.shape[1] multioutput_options = (None, 'raw_values', 'uniform_average', 'variance_weighted') - if multioutput not in multioutput_options: + if isinstance(multioutput, string_types) and \ + multioutput not in multioutput_options: + raise ValueError("Invalid multioutput option") + + elif multioutput is not None and not isinstance(multioutput, string_types): multioutput = check_array(multioutput, ensure_2d=False) if n_outputs == 1: raise ValueError("Custom weights are useful only in " @@ -505,7 +509,8 @@ def r2_score(y_true, y_pred, 0.948... >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] - >>> r2_score(y_true, y_pred, multioutput='variance_weighted') # doctest: +ELLIPSIS + >>> r2_score(y_true, y_pred, multioutput='variance_weighted') + ... # doctest: +ELLIPSIS 0.938... >>> y_true = [1,2,3] >>> y_pred = [1,2,3] From a6efd1905c01aff3a81c754811849ba52cea28ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Fri, 9 Dec 2016 11:28:22 +0100 Subject: [PATCH 2/2] Cosmetic changes and added test for exception message --- sklearn/metrics/regression.py | 16 +++++++++------- sklearn/metrics/tests/test_regression.py | 12 ++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/sklearn/metrics/regression.py b/sklearn/metrics/regression.py index e4e81a4ea5228..de8c9fcaac10d 100644 --- a/sklearn/metrics/regression.py +++ b/sklearn/metrics/regression.py @@ -88,13 +88,15 @@ def _check_reg_targets(y_true, y_pred, multioutput): "({0}!={1})".format(y_true.shape[1], y_pred.shape[1])) n_outputs = y_true.shape[1] - multioutput_options = (None, 'raw_values', 'uniform_average', - 'variance_weighted') - if isinstance(multioutput, string_types) and \ - multioutput not in multioutput_options: - raise ValueError("Invalid multioutput option") - - elif multioutput is not None and not isinstance(multioutput, string_types): + allowed_multioutput_str = ('raw_values', 'uniform_average', + 'variance_weighted') + if isinstance(multioutput, string_types): + if multioutput not in allowed_multioutput_str: + raise ValueError("Allowed 'multioutput' string values are {}. " + "You provided multioutput={!r}".format( + allowed_multioutput_str, + multioutput)) + elif multioutput is not None: multioutput = check_array(multioutput, ensure_2d=False) if n_outputs == 1: raise ValueError("Custom weights are useful only in " diff --git a/sklearn/metrics/tests/test_regression.py b/sklearn/metrics/tests/test_regression.py index bb842caca47df..d2a01a6d5ae1e 100644 --- a/sklearn/metrics/tests/test_regression.py +++ b/sklearn/metrics/tests/test_regression.py @@ -93,6 +93,18 @@ def test__check_reg_targets(): assert_raises(ValueError, _check_reg_targets, y1, y2, None) +def test__check_reg_targets_exception(): + invalid_multioutput = 'this_value_is_not_valid' + expected_message = ("Allowed 'multioutput' string values are.+" + "You provided multioutput={!r}".format( + invalid_multioutput)) + assert_raises_regex(ValueError, expected_message, + _check_reg_targets, + [1, 2, 3], + [[1], [2], [3]], + invalid_multioutput) + + def test_regression_multioutput_array(): y_true = [[1, 2], [2.5, -1], [4.5, 3], [5, 7]] y_pred = [[1, 1], [2, -1], [5, 4], [5, 6.5]]