1. ホーム
  2. python

[Python Learning] [scikit-learn] Pipeline reports error fit_transform() takes 2 positional arguments but were 3 given.

2022-02-16 07:42:53

最近読んでいた本  Scikit-Learn & TensorFlowでハンズオン機械学習  の本でパイプラインのことを知り、イミテーターでこのコードを書きました。

[パイソン] 表示プレーン コピー

  1. num_attribs=list(housing_numerical)  
  2. cat_attribs=[]です。 <スパン 海への近さ"海への近さ" ]  
  3. <スパン
  4. num_pipeline=パイプライン([)  
  5.     ( "セレクタ" ,DataFrameSelector(num_attribs))。  
  6.     ( <スパン インピュータ。 ,インピュータ(strategy=) "中央値" )),  
  7.     ( "attribs_adder"。 ,CombinedAttributesAdder()),  
  8.     ( "std_scaler" ,StandardScaler())です。  
  9. ])  
  10. <スパン
  11. cat_pipeline=パイプライン([ ])  
  12.     ( "セレクタ" ,DataFrameSelector(cat_attribs)),  
  13.     <span style= <スパン "color:#ff0000;"。 >( "label_binarizer"。 , LabelBinarizer())</span>。  
  14. ])  
  15. <スパン
  16. full_pipeline=FeatureUnion(transformer_list=[]の場合。  
  17.     ( "num_pipeline" ,num_pipeline)。  
  18.     ( "cat_pipeline" ,cat_pipeline)。  
  19. ])  

しかし、次のようなエラーが報告されます。

[プレーン]です。 プレーンを見る コピー

  1. TypeError: fit_transform() は位置引数を2つ取りますが、3つ与えられました。  

これはバージョンアップによる問題だろうと思い、案の定、新しいバージョンを ここで という質問で、答えが見つかりました。以下はその引用です。

パイプラインは、LabelBinarizerの想定している  fit_transform  メソッドは、3つの位置引数を取るように定義されています。

def fit_transform(self, x, y)
    ... ...rest of the code


と定義されているのに対して、2つしか取れません。

def fit_transform(self, x):
    ... ...rest of the code

そこで、解決策としては、LabelBinarizerをベースに、3つのパラメータself,X,y=Noneを持つことができるMyLabelBinarizerを自作することです。

from sklearn.base import TransformerMixin #gives fit_transform method for free
class MyLabelBinarizer(TransformerMixin):
    def __init__(self, *args, **kwargs):
        self.encoder = LabelBinarizer(*args, **kwargs)
    def fit(self, x, y=0):
        self.encoder.fit(x)
        return self
    def transform(self, x, y=0):
        return self.encoder.transform(x)