Skip to content

Commit a65a9e5

Browse files
amuellerjnothman
authored andcommitted
[MRG+1] Don't modify steps in {Pipeline,FeatureUnion}.__init__ (#9716)
1 parent 21b0bb4 commit a65a9e5

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

sklearn/pipeline.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ class Pipeline(_BaseComposition):
110110
# BaseEstimator interface
111111

112112
def __init__(self, steps, memory=None):
113-
# shallow copy of steps
114-
self.steps = list(steps)
113+
self.steps = steps
115114
self._validate_steps()
116115
self.memory = memory
117116

@@ -184,6 +183,8 @@ def _final_estimator(self):
184183
# Estimator interface
185184

186185
def _fit(self, X, y=None, **fit_params):
186+
# shallow copy of steps - this should really be steps_
187+
self.steps = list(self.steps)
187188
self._validate_steps()
188189
# Setup the memory
189190
memory = check_memory(self.memory)
@@ -613,7 +614,7 @@ class FeatureUnion(_BaseComposition, TransformerMixin):
613614
614615
"""
615616
def __init__(self, transformer_list, n_jobs=1, transformer_weights=None):
616-
self.transformer_list = list(transformer_list)
617+
self.transformer_list = transformer_list
617618
self.n_jobs = n_jobs
618619
self.transformer_weights = transformer_weights
619620
self._validate_transformers()
@@ -704,6 +705,7 @@ def fit(self, X, y=None):
704705
self : FeatureUnion
705706
This estimator
706707
"""
708+
self.transformer_list = list(self.transformer_list)
707709
self._validate_transformers()
708710
transformers = Parallel(n_jobs=self.n_jobs)(
709711
delayed(_fit_one_transformer)(trans, X, y)

sklearn/tests/test_pipeline.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from sklearn.utils.testing import assert_array_equal
2020
from sklearn.utils.testing import assert_array_almost_equal
2121
from sklearn.utils.testing import assert_dict_equal
22+
from sklearn.utils.testing import assert_no_warnings
2223

2324
from sklearn.base import clone, BaseEstimator
2425
from sklearn.pipeline import Pipeline, FeatureUnion, make_pipeline, make_union
@@ -187,7 +188,7 @@ def test_pipeline_init():
187188
assert_raises(ValueError, pipe.set_params, anova__C=0.1)
188189

189190
# Test clone
190-
pipe2 = clone(pipe)
191+
pipe2 = assert_no_warnings(clone, pipe)
191192
assert_false(pipe.named_steps['svc'] is pipe2.named_steps['svc'])
192193

193194
# Check that apart from estimators, the parameters are the same
@@ -421,6 +422,10 @@ def test_feature_union():
421422
X_sp_transformed = fs.fit_transform(X_sp, y)
422423
assert_array_almost_equal(X_transformed, X_sp_transformed.toarray())
423424

425+
# Test clone
426+
fs2 = assert_no_warnings(clone, fs)
427+
assert_false(fs.transformer_list[0][1] is fs2.transformer_list[0][1])
428+
424429
# test setting parameters
425430
fs.set_params(select__k=2)
426431
assert_equal(fs.fit_transform(X, y).shape, (X.shape[0], 4))

0 commit comments

Comments
 (0)