2016-11-01 1 views
1

Я пытаюсь построить трубопровод с переменным преобразованием И я, как показано ниже_transform() принимает 2 позиционных аргументы, но 3 были даны

import numpy as np 
import pandas as pd 
import sklearn 
from sklearn import linear_model 
from sklearn.base import BaseEstimator, TransformerMixin 
from sklearn.pipeline import Pipeline 

Dataframe

df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]}) 

Я стараюсь, чтобы получить новый переменная для прогноза

class Complex(): 
    def __init__(self, X1, X2): 
     self.a = X1 
     self.b = X2 
    def transform(self, X1, X2): 
     age = pd.DataFrame(self.a - self.b) 
     return age 
    def fit_transform(self, X1, X2): 
     self.fit(X1, X2) 
     return self.transform(X1, X2) 

    def fit(self, X1, X2): 
     return self 

Затем я делаю трубопровод

X = df[['a', 'b']] 
y = df['y'] 
regressor = linear_model.SGDRegressor() 
pipeline = Pipeline([ 
     ('transform', Complex(X['a'], X['b'])) , 
     ('model_fitting', regressor) 
    ]) 
pipeline.fit(X, y) 

и я получаю ошибку

pred = pipeline.predict(X) 
pred 
TypeError         Traceback (most recent call last) 
<ipython-input-555-7a07ccb0c38a> in <module>() 
----> 1 pred = pipeline.predict(X) 
     2 pred 

C:\Program Files\Anaconda3\lib\site-packages\sklearn\utils\metaestimators.py in <lambda>(*args, **kwargs) 
    52 
    53   # lambda, but not partial, allows help() to work with update_wrapper 
---> 54   out = lambda *args, **kwargs: self.fn(obj, *args, **kwargs) 
    55   # update the docstring of the returned function 
    56   update_wrapper(out, self.fn) 

C:\Program Files\Anaconda3\lib\site-packages\sklearn\pipeline.py in predict(self, X) 
    324   for name, transform in self.steps[:-1]: 
    325    if transform is not None: 
--> 326     Xt = transform.transform(Xt) 
    327   return self.steps[-1][-1].predict(Xt) 
    328 

TypeError: transform() missing 1 required positional argument: 'X2' 

, что я сделал не так? Я вижу ошибку в классе Complex(). Как это исправить?

ответ

2

Таким образом, проблема в том, что transform ожидает аргумент массива формы [n_samples, n_features]

ВИДЕТЬ Примеры раздел в documentation of sklearn.pipeline.Pipeline, он использует sklearn.feature_selection.SelectKBest как преобразование, и вы можете увидеть его source, что он ожидает X быть массивом вместо отдельных переменных, таких как X1 и X2.

Короче говоря, ваш код может быть исправлено, как это:


import pandas as pd 
import sklearn 
from sklearn import linear_model 
from sklearn.pipeline import Pipeline 

df = pd.DataFrame({'y': [4,5,6], 'a':[3,2,3], 'b' : [2,3,4]}) 

class Complex(): 
    def transform(self, Xt): 
     return pd.DataFrame(Xt['a'] - Xt['b']) 

    def fit_transform(self, X1, X2): 
     return self.transform(X1) 

X = df[['a', 'b']] 
y = df['y'] 
regressor = linear_model.SGDRegressor() 
pipeline = Pipeline([ 
     ('transform', Complex()) , 
     ('model_fitting', regressor) 
    ]) 
pipeline.fit(X, y) 

pred = pipeline.predict(X) 
print(pred) 
Смежные вопросы