title: Sklearn - FeatureUnion - Transformer: TypeError: fit_transform() takes 2 positional arguments but 3 were given
body: <p>My apologies in advance for this large code block. It is the most concise way I can provide a repeatable working example.</p>
  
  <p>In the code, I'm trying to use <code>FeatureUnion</code> to transform two columns from a dataframe where one column is text data so <code>TfidfVectorizer</code> and the other is a column of lists of tags so I want to use <code>MultiLabelBinarizer</code>.</p>
  
  <p><code>ItemSelector</code> transformer is for selecting the right column from the dataframe.</p>
  
  <p><strong>Why am I getting <code>TypeError: fit_transform() takes 2 positional arguments but 3 were given</code></strong> ?</p>
  
  <p><strong>What do I need to change in the code to get this example to run properly?</strong></p>
  
  <pre><code>from sklearn.preprocessing import MultiLabelBinarizer
  from sklearn.base import TransformerMixin, BaseEstimator
  from sklearn.pipeline import Pipeline, FeatureUnion
  from sklearn.feature_extraction.text import TfidfVectorizer
  from sklearn.multiclass import OneVsRestClassifier
  from sklearn.model_selection import GridSearchCV
  from sklearn.multiclass import OneVsRestClassifier
  from sklearn.linear_model import SGDClassifier
  
  import pandas as pd
  import numpy as np
  
  d = {'label': ['Help', 'Help', 'Other', 'Sale/Coupon', 'Other', 'Help', 'Help',
             'Other', 'Sale/Coupon', 'Other', 'Help', 'Help', 'Other',
             'Sale/Coupon', 'Other', 'Help', 'Help', 'Other', 'Sale/Coupon',
             'Other', 'Help', 'Help', 'Other', 'Sale/Coupon', 'Other'],
       'multilabels': ["['Samples']", "['Deck']", "['Deck', 'Deck Over', 'Stain']",
                       "['Coupons']", "['Bathroom']", "['Samples']", "['Deck']",
                       "['Deck', 'Deck Over', 'Stain']", "['Coupons']",
                       "['Bathroom']", "['Samples']", "['Deck']",
                       "['Deck', 'Deck Over', 'Stain']", "['Coupons']",
                       "['Bathroom']", "['Samples']", "['Deck']",
                       "['Deck', 'Deck Over', 'Stain']", "['Coupons']",
                       "['Bathroom']", "['Samples']", "['Deck']",
                       "['Deck', 'Deck Over', 'Stain']", "['Coupons']",
                       "['Bathroom']"],
       'response': ['this is some text', 'this is some more text',
                    'and here is some more', 'and some more',
                    'and here we go some more yay done', 'this is some text',
                    'this is some more text', 'and here is some more',
                    'and some more', 'and here we go some more yay done',
                    'this is some text', 'this is some more text',
                    'and here is some more', 'and some more',
                    'and here we go some more yay done', 'this is some text',
                    'this is some more text', 'and here is some more',
                    'and some more', 'and here we go some more yay done',
                    'this is some text', 'this is some more text',
                    'and here is some more', 'and some more',
                    'and here we go some more yay done']}
  
  class ItemSelector(BaseEstimator, TransformerMixin):
    def __init__(self, key):
      self.key = key
  
    def fit(self, X, y=None):
      return self
  
    def transform(self, df):
      return df[self.key]
  
  feature_union = FeatureUnion(
    transformer_list=[
      ('step1', Pipeline([
        ('selector', ItemSelector(key='response')),
        ('tfidf', TfidfVectorizer()),
        ])),
      ('step2', Pipeline([
        ('selector', ItemSelector(key='multilabels')),
        ('multilabel', MultiLabelBinarizer())
        ]))
      ])
  
  pipeline = OneVsRestClassifier(
    Pipeline([('union', feature_union),('sgd', SGDClassifier())])
    )
  
  grid = GridSearchCV(pipeline, {}, verbose=5)
  
  df = pd.DataFrame(d, columns=['response', 'multilabels', 'label'])
  X = df[['response', 'multilabels']]
  y = df['label']
  grid.fit(X, y)
  </code></pre>
  
  <p>This is the full error:</p>
  
  <pre><code>Traceback (most recent call last):
    File "C:/Users/owner/Documents/my files/Account Tracking/Client/Foresee Analysis/SOQuestion.py", line 72, in &lt;module&gt;
      grid.fit(X, y)
    File "C:\Python34\lib\site-packages\sklearn\model_selection\_search.py", line 945, in fit
      return self._fit(X, y, groups, ParameterGrid(self.param_grid))
    File "C:\Python34\lib\site-packages\sklearn\model_selection\_search.py", line 564, in _fit
      for parameters in parameter_iterable
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 758, in __call__
      while self.dispatch_one_batch(iterator):
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 608, in dispatch_one_batch
      self._dispatch(tasks)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 571, in _dispatch
      job = self._backend.apply_async(batch, callback=cb)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 109, in apply_async
      result = ImmediateResult(func)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 326, in __init__
      self.results = batch()
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in __call__
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in &lt;listcomp&gt;
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\model_selection\_validation.py", line 238, in _fit_and_score
      estimator.fit(X_train, y_train, **fit_params)
    File "C:\Python34\lib\site-packages\sklearn\multiclass.py", line 216, in fit
      for i, column in enumerate(columns))
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 758, in __call__
      while self.dispatch_one_batch(iterator):
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 608, in dispatch_one_batch
      self._dispatch(tasks)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 571, in _dispatch
      job = self._backend.apply_async(batch, callback=cb)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 109, in apply_async
      result = ImmediateResult(func)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 326, in __init__
      self.results = batch()
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in __call__
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in &lt;listcomp&gt;
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\multiclass.py", line 80, in _fit_binary
      estimator.fit(X, y)
    File "C:\Python34\lib\site-packages\sklearn\pipeline.py", line 268, in fit
      Xt, fit_params = self._fit(X, y, **fit_params)
    File "C:\Python34\lib\site-packages\sklearn\pipeline.py", line 234, in _fit
      Xt = transform.fit_transform(Xt, y, **fit_params_steps[name])
    File "C:\Python34\lib\site-packages\sklearn\pipeline.py", line 734, in fit_transform
      for name, trans, weight in self._iter())
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 758, in __call__
      while self.dispatch_one_batch(iterator):
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 608, in dispatch_one_batch
      self._dispatch(tasks)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 571, in _dispatch
      job = self._backend.apply_async(batch, callback=cb)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 109, in apply_async
      result = ImmediateResult(func)
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 326, in __init__
      self.results = batch()
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in __call__
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\externals\joblib\parallel.py", line 131, in &lt;listcomp&gt;
      return [func(*args, **kwargs) for func, args, kwargs in self.items]
    File "C:\Python34\lib\site-packages\sklearn\pipeline.py", line 577, in _fit_transform_one
      res = transformer.fit_transform(X, y, **fit_params)
    File "C:\Python34\lib\site-packages\sklearn\pipeline.py", line 303, in fit_transform
      return last_step.fit_transform(Xt, y, **fit_params)
  TypeError: fit_transform() takes 2 positional arguments but 3 were given
  </code></pre>
  
  <p>Note: I have looked at <a href="https://stackoverflow.com/questions/40363650/transform-takes-2-positional-arguments-but-3-were-given">_transform() takes 2 positional arguments but 3 were given</a> but it still doesn't make sense to me.</p>