1. ホーム
  2. python

Scikit-Learnのエラーメッセージ: fit_transform()は2つの位置引数を取りますが、3つ与えられました。

2022-02-16 03:25:31
<パス

コード

num_attribs = list(housing_num)
cat_attribs = ["ocean_proximity"]

num_pipeline = Pipeline([
        ('selector', DataFrameSelector(num_attribs)),
        ('imputer', Imputer(strategy="median")),
        ('attribs_adder', CombinedAttributesAdder()),
        ('std_scaler', StandardScaler()),
    ])

cat_pipeline = Pipeline([
        ('selector', DataFrameSelector(cat_attribs)),
        ('label_binarizer', MyLabelBinarizer()),
    ])
from sklearn.pipeline import FeatureUnion

full_pipeline = FeatureUnion(transformer_list=[
        ("num_pipeline", num_pipeline),
        ("cat_pipeline", cat_pipeline),
    ])
housing_prepared = full_pipeline.fit_transform(housing)
housing_prepared

エラーを報告する
sklearnを使用するパイプラインがエラーを報告する。

Error message: fit_transform() takes 2 positional arguments but 3 were given

エラーチェック
エラーの原因は、pipelineがLabelBinarizerのfit_transformメソッドを呼び出して、次の3つのパラメータを見つけていることです。

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

そして、実はLabelBinarizerのfit_transform()メソッドでは、2つのパラメータしか定義していません。

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

解決方法

3つのパラメータを渡すことができる独自のカスタムLabelBinarizerクラスをラップします。

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)
Keep your code the same only instead of using LabelBinarizer(), use the class we created : MyLabelBinarizer().

コード中のLabelBinarizerクラスを、カスタムのMyLabelBinarizerクラスに置き換えます。