2016-11-01 3 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]}) 

私は新しいを取得しよう変数の予測

​​

次にパイプラインを作成します

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は、X1X2のような別々の変数の代わりに配列にする必要があります。要するに

は、あなたのコードは次のように固定することができます。


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) 
関連する問題