Scikit-learn: LabelBinarizerとLabelEncoderは、パイプラインと互換性のない署名に適合して変換します

作成日 2014年04月26日  ·  6コメント  ·  ソース: scikit-learn/scikit-learn

パイプラインでLabelBinarizerLabelEncoderを使用しようとすると、次のエラーが発生します。

sklearn/pipeline.pyc in fit_transform(self, X, y, **fit_params)
    141         Xt, fit_params = self._pre_transform(X, y, **fit_params)
    142         if hasattr(self.steps[-1][-1], 'fit_transform'):
--> 143             return self.steps[-1][-1].fit_transform(Xt, y, **fit_params)
    144         else:
    145             return self.steps[-1][-1].fit(Xt, y, **fit_params).transform(Xt)

TypeError: fit_transform() takes exactly 2 arguments (3 given)

これは、クラスのfitおよびtransformシグネチャが他のほとんどの推定量とは異なり、単一の引数のみを受け入れるためと思われます。

これは非常に簡単な修正だと思います(署名をdef(self, X, y=None)変更するだけです)。プルリクエストを送信できれば幸いですが、署名が彼らは私が考えていなかった方法です。

API

最も参考になるコメント

このページには多くの否定的な反応があったようです。 LabelBinarizerとLabelEncoderの目的については長い間誤解されてきたと思います。 これらはターゲット用であり、機能ではありません。 確かに、それらは私の時代より前に設計された(そして名前が不十分でした)ものです。

ユーザーはこの目的でCountVectorizer(またはデータフレームから来ている場合はdataframe.to_dict(orient='records')のDictVectorizer)を長い間使用していた可能性があると思いますが、最近CategoricalEncoder (#9151 )マスターに、ただしこれはOneHotEncoerにロールインされる可能性があり、リリース前に新しいOrdinalEncoder(#10521)になります。

これが明らかに不満を抱いている大衆のニーズを満たすことを願っています。

私は、建設的な貢献ではなく、否定的な反応の大きさを見て、このプロジェクトの開発のために膨大な量の自由時間を5年近くボランティアしてきた(そして最近はそれに取り組むために雇われた)人として言わなければなりません図書館に行くのはとても悲しいことです。 確かに、カテゴリ入力用の新しいトランスフォーマーではなく、新しいパイプラインのようなものを書く必要があるという上記の私の応答は、私の側の誤解でした(そして他の人によって修正されるべきでした)、それは作業中に理解できることを願っていますこのプロジェクトを維持している膨大なワークロード。

全てのコメント6件

私はあなたがそれを修正するのは正しいと思います。

2014年4月26日夜07時37分には、HXU [email protected]書きました:

LabelBinarizerとLabelEncoderをで使用しようとすると、このエラーが発生します。
パイプライン:

fit_transform(self、X、y、* _fit_params)のsklearn / pipeline.pyc
141 Xt、fit_params = self._pre_transform(X、y、* _fit_params)
142 if hasattr(self.steps [-1] [-1]、 'fit_transform'):-> 143 return self.steps [-1] [-1] .fit_transform(Xt、y、* _fit_params)
144その他:
145 return self.steps [-1] [-1] .fit(Xt、y、* _fit_params).transform(Xt)
TypeError:fit_transform()は正確に2つの引数を取ります(3つ指定)

これは、クラスの適合と変換の署名https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85が他のほとんどの推定量とは異なり、受け入れるだけであるためと思われます。単一の引数。

これは非常に簡単な修正だと思います(署名をdef(self、
X、y = None))プルリクエストを送信したいのですが、
署名がその方法であるという他の理由があったかどうかを確認します
私が考えていなかったということです。


このメールに直接返信するか、 GitHubで表示して

#3113では、ラベルエンコーディングが実際にはPipeline属していないため、これを修正しないことを決定しました。

@jnothman 、知っておくべきこと:パイプラインでカテゴリ機能をベクトル化する必要がある場合は、代わりに何をすべきですか?

特定のケースを処理するには、独自のPipeline-likeコード(おそらく既存のコードから継承)を作成するのが最善の場合があります。

パイプラインでLabelBinarizerを使用する代わりに、独自のトランスフォーマーを実装しました。

class CustomBinarizer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None,**fit_params):
        return self
    def transform(self, X):
        return LabelBinarizer().fit(X).transform(X)

トリックをするようです!

編集:

これはより良い解決策です:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

このページには多くの否定的な反応があったようです。 LabelBinarizerとLabelEncoderの目的については長い間誤解されてきたと思います。 これらはターゲット用であり、機能ではありません。 確かに、それらは私の時代より前に設計された(そして名前が不十分でした)ものです。

ユーザーはこの目的でCountVectorizer(またはデータフレームから来ている場合はdataframe.to_dict(orient='records')のDictVectorizer)を長い間使用していた可能性があると思いますが、最近CategoricalEncoder (#9151 )マスターに、ただしこれはOneHotEncoerにロールインされる可能性があり、リリース前に新しいOrdinalEncoder(#10521)になります。

これが明らかに不満を抱いている大衆のニーズを満たすことを願っています。

私は、建設的な貢献ではなく、否定的な反応の大きさを見て、このプロジェクトの開発のために膨大な量の自由時間を5年近くボランティアしてきた(そして最近はそれに取り組むために雇われた)人として言わなければなりません図書館に行くのはとても悲しいことです。 確かに、カテゴリ入力用の新しいトランスフォーマーではなく、新しいパイプラインのようなものを書く必要があるという上記の私の応答は、私の側の誤解でした(そして他の人によって修正されるべきでした)、それは作業中に理解できることを願っていますこのプロジェクトを維持している膨大なワークロード。

このページは役に立ちましたか?
0 / 5 - 0 評価