Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4f9293c

Browse files
author
Xing
committed
Revert "ENH Add verbose option to Pipeline, FeatureUnion, and ColumnTransformer (scikit-learn#11364)"
This reverts commit bed12f6.
1 parent 426cc34 commit 4f9293c

12 files changed

Lines changed: 77 additions & 429 deletions

File tree

doc/modules/compose.rst

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ is an estimator object::
6060
>>> pipe # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
6161
Pipeline(memory=None,
6262
steps=[('reduce_dim', PCA(copy=True,...)),
63-
('clf', SVC(C=1.0,...))], verbose=False)
63+
('clf', SVC(C=1.0,...))])
6464

6565
The utility function :func:`make_pipeline` is a shorthand
6666
for constructing pipelines;
@@ -75,8 +75,7 @@ filling in the names automatically::
7575
steps=[('binarizer', Binarizer(copy=True, threshold=0.0)),
7676
('multinomialnb', MultinomialNB(alpha=1.0,
7777
class_prior=None,
78-
fit_prior=True))],
79-
verbose=False)
78+
fit_prior=True))])
8079

8180
Accessing steps
8281
...............
@@ -107,9 +106,9 @@ permitted). This is convenient for performing only some of the transformations
107106
(or their inverse):
108107

109108
>>> pipe[:1] # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
110-
Pipeline(memory=None, steps=[('reduce_dim', PCA(copy=True, ...))],...)
109+
Pipeline(memory=None, steps=[('reduce_dim', PCA(copy=True, ...))])
111110
>>> pipe[-1:] # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
112-
Pipeline(memory=None, steps=[('clf', SVC(C=1.0, ...))],...)
111+
Pipeline(memory=None, steps=[('clf', SVC(C=1.0, ...))])
113112

114113
Nested parameters
115114
.................
@@ -120,8 +119,7 @@ Parameters of the estimators in the pipeline can be accessed using the
120119
>>> pipe.set_params(clf__C=10) # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
121120
Pipeline(memory=None,
122121
steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',...)),
123-
('clf', SVC(C=10, cache_size=200, class_weight=None,...))],
124-
verbose=False)
122+
('clf', SVC(C=10, cache_size=200, class_weight=None,...))])
125123

126124
This is particularly important for doing grid searches::
127125

@@ -204,7 +202,7 @@ object::
204202
>>> pipe # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
205203
Pipeline(...,
206204
steps=[('reduce_dim', PCA(copy=True,...)),
207-
('clf', SVC(C=1.0,...))], verbose=False)
205+
('clf', SVC(C=1.0,...))])
208206
>>> # Clear the cache directory when you don't need it anymore
209207
>>> rmtree(cachedir)
210208

@@ -221,8 +219,7 @@ object::
221219
>>> pipe.fit(digits.data, digits.target)
222220
... # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
223221
Pipeline(memory=None,
224-
steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))],
225-
verbose=False)
222+
steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))])
226223
>>> # The pca instance can be inspected directly
227224
>>> print(pca1.components_) # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
228225
[[-1.77484909e-19 ... 4.07058917e-18]]
@@ -244,8 +241,7 @@ object::
244241
>>> cached_pipe.fit(digits.data, digits.target)
245242
... # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
246243
Pipeline(memory=...,
247-
steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))],
248-
verbose=False)
244+
steps=[('reduce_dim', PCA(...)), ('clf', SVC(...))])
249245
>>> print(cached_pipe.named_steps['reduce_dim'].components_)
250246
... # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
251247
[[-1.77484909e-19 ... 4.07058917e-18]]
@@ -380,7 +376,7 @@ and ``value`` is an estimator object::
380376
FeatureUnion(n_jobs=None,
381377
transformer_list=[('linear_pca', PCA(copy=True,...)),
382378
('kernel_pca', KernelPCA(alpha=1.0,...))],
383-
transformer_weights=None, verbose=False)
379+
transformer_weights=None)
384380

385381

386382
Like pipelines, feature unions have a shorthand constructor called
@@ -395,7 +391,7 @@ and ignored by setting to ``'drop'``::
395391
FeatureUnion(n_jobs=None,
396392
transformer_list=[('linear_pca', PCA(copy=True,...)),
397393
('kernel_pca', 'drop')],
398-
transformer_weights=None, verbose=False)
394+
transformer_weights=None)
399395

400396
.. topic:: Examples:
401397

doc/whats_new/v0.21.rst

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -565,13 +565,6 @@ Support for Python 3.4 and below has been officially dropped.
565565
therefore ``len(pipeline)`` returns the number of steps in the pipeline.
566566
:issue:`13439` by :user:`Lakshya KD <LakshKD>`.
567567

568-
- |Feature| Added optional parameter ``verbose`` in :class:`pipeline.Pipeline`,
569-
:class:`compose.ColumnTransformer` and :class:`pipeline.FeatureUnion`
570-
and corresponding ``make_`` helpers for showing progress and timing of
571-
each step. :issue:`11364` by :user:`Baze Petrushev <petrushev>`,
572-
:user:`Karan Desai <karandesai-96>`, `Joel Nothman`_, and
573-
:user:`Thomas Fan <thomasjpfan>`.
574-
575568
:mod:`sklearn.preprocessing`
576569
............................
577570

examples/compose/plot_column_transformer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def transform(self, posts):
117117

118118
# Use a SVC classifier on the combined features
119119
('svc', LinearSVC()),
120-
], verbose=True)
120+
])
121121

122122
# limit the list of categories to make running this example faster.
123123
categories = ['alt.atheism', 'talk.religion.misc']

sklearn/compose/_column_transformer.py

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,6 @@ class ColumnTransformer(_BaseComposition, TransformerMixin):
101101
transformer is multiplied by these weights. Keys are transformer names,
102102
values the weights.
103103
104-
verbose : boolean, optional(default=False)
105-
If True, the time elapsed while fitting each transformer will be
106-
printed as it is completed.
107-
108104
Attributes
109105
----------
110106
transformers_ : list
@@ -164,19 +160,13 @@ class ColumnTransformer(_BaseComposition, TransformerMixin):
164160
"""
165161
_required_parameters = ['transformers']
166162

167-
def __init__(self,
168-
transformers,
169-
remainder='drop',
170-
sparse_threshold=0.3,
171-
n_jobs=None,
172-
transformer_weights=None,
173-
verbose=False):
163+
def __init__(self, transformers, remainder='drop', sparse_threshold=0.3,
164+
n_jobs=None, transformer_weights=None):
174165
self.transformers = transformers
175166
self.remainder = remainder
176167
self.sparse_threshold = sparse_threshold
177168
self.n_jobs = n_jobs
178169
self.transformer_weights = transformer_weights
179-
self.verbose = verbose
180170

181171
@property
182172
def _transformers(self):
@@ -387,11 +377,6 @@ def _validate_output(self, result):
387377
"The output of the '{0}' transformer should be 2D (scipy "
388378
"matrix, array, or pandas DataFrame).".format(name))
389379

390-
def _log_message(self, name, idx, total):
391-
if not self.verbose:
392-
return None
393-
return '(%d of %d) Processing %s' % (idx, total, name)
394-
395380
def _fit_transform(self, X, y, func, fitted=False):
396381
"""
397382
Private function to fit and/or transform on demand.
@@ -400,19 +385,12 @@ def _fit_transform(self, X, y, func, fitted=False):
400385
on the passed function.
401386
``fitted=True`` ensures the fitted transformers are used.
402387
"""
403-
transformers = list(
404-
self._iter(fitted=fitted, replace_strings=True))
405388
try:
406389
return Parallel(n_jobs=self.n_jobs)(
407-
delayed(func)(
408-
transformer=clone(trans) if not fitted else trans,
409-
X=_get_column(X, column),
410-
y=y,
411-
weight=weight,
412-
message_clsname='ColumnTransformer',
413-
message=self._log_message(name, idx, len(transformers)))
414-
for idx, (name, trans, column, weight) in enumerate(
415-
self._iter(fitted=fitted, replace_strings=True), 1))
390+
delayed(func)(clone(trans) if not fitted else trans,
391+
_get_column(X, column), y, weight)
392+
for _, trans, column, weight in self._iter(
393+
fitted=fitted, replace_strings=True))
416394
except ValueError as e:
417395
if "Expected 2D array, got 1D array instead" in str(e):
418396
raise ValueError(_ERR_MSG_1DCOLUMN)
@@ -797,10 +775,6 @@ def make_column_transformer(*transformers, **kwargs):
797775
``-1`` means using all processors. See :term:`Glossary <n_jobs>`
798776
for more details.
799777
800-
verbose : boolean, optional(default=False)
801-
If True, the time elapsed while fitting each transformer will be
802-
printed as it is completed.
803-
804778
Returns
805779
-------
806780
ct : ColumnTransformer
@@ -826,20 +800,18 @@ def make_column_transformer(*transformers, **kwargs):
826800
['numerical_column']),
827801
('onehotencoder',
828802
OneHotEncoder(...),
829-
['categorical_column'])], verbose=False)
803+
['categorical_column'])])
830804
831805
"""
832806
# transformer_weights keyword is not passed through because the user
833807
# would need to know the automatically generated names of the transformers
834808
n_jobs = kwargs.pop('n_jobs', None)
835809
remainder = kwargs.pop('remainder', 'drop')
836810
sparse_threshold = kwargs.pop('sparse_threshold', 0.3)
837-
verbose = kwargs.pop('verbose', False)
838811
if kwargs:
839812
raise TypeError('Unknown keyword arguments: "{}"'
840813
.format(list(kwargs.keys())[0]))
841814
transformer_list = _get_transformer_list(transformers)
842815
return ColumnTransformer(transformer_list, n_jobs=n_jobs,
843816
remainder=remainder,
844-
sparse_threshold=sparse_threshold,
845-
verbose=verbose)
817+
sparse_threshold=sparse_threshold)

sklearn/compose/tests/test_column_transformer.py

Lines changed: 4 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""
22
Test the ColumnTransformer.
33
"""
4-
import re
54

65
import numpy as np
76
from scipy import sparse
@@ -597,8 +596,7 @@ def test_column_transformer_get_set_params():
597596
'trans2__with_mean': True,
598597
'trans2__with_std': True,
599598
'transformers': ct.transformers,
600-
'transformer_weights': None,
601-
'verbose': False}
599+
'transformer_weights': None}
602600

603601
assert_dict_equal(ct.get_params(), exp)
604602

@@ -615,8 +613,7 @@ def test_column_transformer_get_set_params():
615613
'trans2__with_mean': True,
616614
'trans2__with_std': True,
617615
'transformers': ct.transformers,
618-
'transformer_weights': None,
619-
'verbose': False}
616+
'transformer_weights': None}
620617

621618
assert_dict_equal(ct.get_params(), exp)
622619

@@ -947,8 +944,7 @@ def test_column_transformer_get_set_params_with_remainder():
947944
'trans1__with_mean': True,
948945
'trans1__with_std': True,
949946
'transformers': ct.transformers,
950-
'transformer_weights': None,
951-
'verbose': False}
947+
'transformer_weights': None}
952948

953949
assert ct.get_params() == exp
954950

@@ -964,8 +960,7 @@ def test_column_transformer_get_set_params_with_remainder():
964960
'sparse_threshold': 0.3,
965961
'trans1': 'passthrough',
966962
'transformers': ct.transformers,
967-
'transformer_weights': None,
968-
'verbose': False}
963+
'transformer_weights': None}
969964

970965
assert ct.get_params() == exp
971966

@@ -986,56 +981,6 @@ def test_column_transformer_no_estimators():
986981
assert ct.transformers_[-1][2] == [0, 1, 2]
987982

988983

989-
@pytest.mark.parametrize(
990-
['est', 'pattern'],
991-
[(ColumnTransformer([('trans1', Trans(), [0]), ('trans2', Trans(), [1])],
992-
remainder=DoubleTrans()),
993-
(r'\[ColumnTransformer\].*\(1 of 3\) Processing trans1.* total=.*\n'
994-
r'\[ColumnTransformer\].*\(2 of 3\) Processing trans2.* total=.*\n'
995-
r'\[ColumnTransformer\].*\(3 of 3\) Processing remainder.* total=.*\n$'
996-
)),
997-
(ColumnTransformer([('trans1', Trans(), [0]), ('trans2', Trans(), [1])],
998-
remainder='passthrough'),
999-
(r'\[ColumnTransformer\].*\(1 of 3\) Processing trans1.* total=.*\n'
1000-
r'\[ColumnTransformer\].*\(2 of 3\) Processing trans2.* total=.*\n'
1001-
r'\[ColumnTransformer\].*\(3 of 3\) Processing remainder.* total=.*\n$'
1002-
)),
1003-
(ColumnTransformer([('trans1', Trans(), [0]), ('trans2', 'drop', [1])],
1004-
remainder='passthrough'),
1005-
(r'\[ColumnTransformer\].*\(1 of 2\) Processing trans1.* total=.*\n'
1006-
r'\[ColumnTransformer\].*\(2 of 2\) Processing remainder.* total=.*\n$'
1007-
)),
1008-
(ColumnTransformer([('trans1', Trans(), [0]),
1009-
('trans2', 'passthrough', [1])],
1010-
remainder='passthrough'),
1011-
(r'\[ColumnTransformer\].*\(1 of 3\) Processing trans1.* total=.*\n'
1012-
r'\[ColumnTransformer\].*\(2 of 3\) Processing trans2.* total=.*\n'
1013-
r'\[ColumnTransformer\].*\(3 of 3\) Processing remainder.* total=.*\n$'
1014-
)),
1015-
(ColumnTransformer([('trans1', Trans(), [0])], remainder='passthrough'),
1016-
(r'\[ColumnTransformer\].*\(1 of 2\) Processing trans1.* total=.*\n'
1017-
r'\[ColumnTransformer\].*\(2 of 2\) Processing remainder.* total=.*\n$'
1018-
)),
1019-
(ColumnTransformer([('trans1', Trans(), [0]), ('trans2', Trans(), [1])],
1020-
remainder='drop'),
1021-
(r'\[ColumnTransformer\].*\(1 of 2\) Processing trans1.* total=.*\n'
1022-
r'\[ColumnTransformer\].*\(2 of 2\) Processing trans2.* total=.*\n$')),
1023-
(ColumnTransformer([('trans1', Trans(), [0])], remainder='drop'),
1024-
(r'\[ColumnTransformer\].*\(1 of 1\) Processing trans1.* total=.*\n$'))])
1025-
@pytest.mark.parametrize('method', ['fit', 'fit_transform'])
1026-
def test_column_transformer_verbose(est, pattern, method, capsys):
1027-
X_array = np.array([[0, 1, 2], [2, 4, 6], [8, 6, 4]]).T
1028-
1029-
func = getattr(est, method)
1030-
est.set_params(verbose=False)
1031-
func(X_array)
1032-
assert not capsys.readouterr().out, 'Got output for verbose=False'
1033-
1034-
est.set_params(verbose=True)
1035-
func(X_array)
1036-
assert re.match(pattern, capsys.readouterr()[0])
1037-
1038-
1039984
def test_column_transformer_no_estimators_set_params():
1040985
ct = ColumnTransformer([]).set_params(n_jobs=2)
1041986
assert ct.n_jobs == 2

sklearn/model_selection/_validation.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import scipy.sparse as sp
2020

2121
from ..base import is_classifier, clone
22-
from ..utils import (indexable, check_random_state, safe_indexing,
23-
_message_with_time)
22+
from ..utils import indexable, check_random_state, safe_indexing
2423
from ..utils.validation import _is_arraylike, _num_samples
2524
from ..utils.metaestimators import _safe_split
2625
from ..utils._joblib import Parallel, delayed
26+
from ..utils._joblib import logger
2727
from ..metrics.scorer import check_scoring, _check_multimetric_scoring
2828
from ..exceptions import FitFailedWarning
2929
from ._split import check_cv
@@ -572,7 +572,8 @@ def _fit_and_score(estimator, X, y, scorer, train, test, verbose,
572572

573573
if verbose > 1:
574574
total_time = score_time + fit_time
575-
print(_message_with_time('CV', msg, total_time))
575+
end_msg = "%s, total=%s" % (msg, logger.short_format_time(total_time))
576+
print("[CV] %s %s" % ((64 - len(end_msg)) * '.', end_msg))
576577

577578
ret = [train_scores, test_scores] if return_train_score else [test_scores]
578579

sklearn/model_selection/tests/test_validation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def fit(self, X, Y=None, sample_weight=None, class_prior=None,
189189
raise ValueError('X cannot be d')
190190
if sample_weight is not None:
191191
assert sample_weight.shape[0] == X.shape[0], (
192-
'MockClassifier extra fit_param '
192+
'MockClassifier extra fit_param '
193193
'sample_weight.shape[0] is {0}, should be {1}'
194194
.format(sample_weight.shape[0], X.shape[0]))
195195
if class_prior is not None:

0 commit comments

Comments
 (0)