Issue 1:
Hello,

the object sklear.model_selection.GridSearchCV is not picklable:

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
import pickle

np.random.seed(1)
X = np.random.rand(10, 2)
y = np.random.rand(10)
reg = GridSearchCV(Ridge(), param_grid={"alpha": [1.0, 2.0]}).fit(X, y)

pickle.loads(pickle.dumps(reg))

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-8bf454eb8188> in <module>()
8 reg = GridSearchCV(Ridge(), param_grid={"alpha": [1.0, 2.0]}).fit(X, y)
9
---> 10 pickle.loads(pickle.dumps(reg))

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in loads(str)
1380 def loads(str):
1381 file = StringIO(str)
-> 1382 return Unpickler(file).load()
1383
1384 # Doctest

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in load_build(self)
1215 setstate = getattr(inst, "__setstate__", None)
1216 if setstate:
-> 1217 setstate(state)
1218 return
1219 slotstate = None

/home/amignon/mypython27/lib/python2.7/site-packages/numpy/ma/core.pyc in __setstate__(self, state)
5867 """
5868 (_, shp, typ, isf, raw, msk, flv) = state
-> 5869 super(MaskedArray, self).__setstate__((shp, typ, isf, raw))
5870 self._mask.__setstate__((shp, make_mask_descr(typ), isf, msk))
5871 self.fill_value = flv

TypeError: object pickle not returning list

From what I understand, it is caused to a bug in numpy.ma.MaskedArray that I have just reported in numpy/numpy#8191. It is due to the use of masked arrays in the cv_results_ member to store grid parameters:

p = reg.cv_results_["param_alpha"]
print repr(p)
pickle.loads(pickle.dumps(reg))

masked_array(data = [1.0 2.0],
mask = [False False],
fill_value = ?)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-45-a128a9cc4ff0> in <module>()
1 p = reg.cv_results_["param_alpha"]
2 print repr(p)
----> 3 pickle.loads(pickle.dumps(reg))

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in loads(str)
1380 def loads(str):
1381 file = StringIO(str)
-> 1382 return Unpickler(file).load()
1383
1384 # Doctest

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value

/opt/rh/python27/root/usr/lib64/python2.7/pickle.pyc in load_build(self)
1215 setstate = getattr(inst, "__setstate__", None)
1216 if setstate:
-> 1217 setstate(state)
1218 return
1219 slotstate = None

/home/amignon/mypython27/lib/python2.7/site-packages/numpy/ma/core.pyc in __setstate__(self, state)
5867 """
5868 (_, shp, typ, isf, raw, msk, flv) = state
-> 5869 super(MaskedArray, self).__setstate__((shp, typ, isf, raw))
5870 self._mask.__setstate__((shp, make_mask_descr(typ), isf, msk))
5871 self.fill_value = flv

TypeError: object pickle not returning list

So basically it is a cross project bug.

Issue 2:
Currently, ColumnTransformer will return AttributeError if one of the transformers is a Pipeline object because it only checks if the transformer has get_feature_names attribute.

Describe the workflow you want to enable

It should be able to pass the initialized column for the Pipeline transformer inside ColumnTransformer.

Describe your proposed solution

It should check if the transformer is a Pipeline object before checking the attribute, and simply pass the initialized column for the Pipeline transformer.

Describe alternatives you've considered, if relevant

Alternatively, it can be done by adding get_feature_names attribute to Pipeline object, which will check if the first step has get_feature_names attribute.