Scikit-learn: LabelBinarizer dan LabelEncoder menyesuaikan dan mengubah tanda tangan yang tidak kompatibel dengan Pipeline

Dibuat pada 26 Apr 2014  ·  6Komentar  ·  Sumber: scikit-learn/scikit-learn

Saya mendapatkan kesalahan ini ketika saya mencoba menggunakan LabelBinarizer dan LabelEncoder dalam sebuah Pipeline:

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)

Sepertinya ini karena tanda tangan fit dan transform berbeda dari kebanyakan estimator lain dan hanya menerima satu argumen.

Saya pikir ini adalah perbaikan yang cukup mudah (cukup ubah tanda tangan menjadi def(self, X, y=None) ) yang dengan senang hati saya kirimkan permintaan tarik, tetapi saya ingin memeriksa apakah ada alasan lain bahwa tanda tangan adalah cara mereka yang tidak saya pikirkan.

API

Komentar yang paling membantu

Saya melihat ada banyak reaksi negatif di halaman ini. Saya pikir sudah lama ada kesalahpahaman tentang tujuan LabelBinarizer dan LabelEncoder. Ini untuk target, bukan fitur. Meskipun harus diakui mereka dirancang (dan diberi nama yang buruk) sebelum waktu saya.

Meskipun saya pikir pengguna dapat menggunakan CountVectorizer (atau DictVectorizer dengan dataframe.to_dict(orient='records') jika Anda berasal dari kerangka data) untuk tujuan ini untuk waktu yang lama, kami baru-baru ini menggabungkan CategoricalEncoder (#9151 ) ke master, meskipun ini dapat digulirkan ke OneHotEncoer, dan OrdinalEncoder baru sebelum rilis (#10521).

Saya harap ini memenuhi kebutuhan masyarakat yang jelas-jelas tidak puas.

Saya harus mengatakan bahwa sebagai seseorang yang telah menyumbangkan banyak waktu luang untuk pengembangan proyek ini selama hampir lima tahun sekarang (dan baru-baru ini telah dipekerjakan untuk mengerjakannya juga), melihat besarnya reaksi negatif, daripada kontribusi konstruktif ke perpustakaan cukup menyedihkan. Meskipun harus diakui tanggapan saya di atas bahwa Anda harus menulis hal seperti Pipa baru, daripada transformator baru untuk input kategoris adalah kesalahpahaman di pihak saya (dan seharusnya/bisa diperbaiki oleh orang lain), yang saya harap dapat dimengerti saat mengerjakan beban kerja yang sangat besar yang mempertahankan proyek ini.

Semua 6 komentar

Saya pikir Anda benar untuk memperbaikinya.

Pada 26 April 2014 19:37, hxu [email protected] menulis:

Saya mendapatkan kesalahan ini ketika saya mencoba menggunakan LabelBinarizer dan LabelEncoder di a
Saluran pipa:

sklearn/pipeline.pyc di 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 mengembalikan self.steps[-1][-1].fit_transform(Xt, y, *_fit_params)
144 lainnya:
145 mengembalikan self.steps[-1][-1].fit(Xt, y, *_fit_params).transform(Xt)
TypeError: fit_transform() membutuhkan tepat 2 argumen (3 diberikan)

Sepertinya ini karena tanda tangan fit and transform kelashttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85berbeda dari kebanyakan estimator lain dan hanya menerima satu argumen.

Saya pikir ini adalah perbaikan yang cukup mudah (cukup ubah tanda tangan menjadi def(self,
X, y=None)) yang dengan senang hati saya kirimkan permintaan tarik, tetapi saya ingin
periksa apakah ada alasan lain mengapa tanda tangan itu seperti itu
adalah bahwa saya tidak memikirkan.


Balas email ini secara langsung atau lihat di Gi tHubhttps://github.com/scikit-learn/scikit-learn/issues/3112
.

Di #3113 kami telah memutuskan ini tidak untuk diperbaiki karena penyandian label tidak benar-benar termasuk dalam Pipeline .

@jnothman , hanya untuk mengetahui: apa yang harus saya lakukan sebagai gantinya jika saya perlu membuat vektor fitur kategoris dalam pipa?

Anda mungkin sebaiknya menulis kode Pipeline-like Anda sendiri (mungkin mewarisi dari yang sudah ada) untuk menangani kasus spesifik Anda.

Alih-alih menggunakan LabelBinarizer dalam pipa, saya baru saja mengimplementasikan transformator saya sendiri:

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

Sepertinya berhasil!

edit:

ini adalah solusi yang lebih baik:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

Saya melihat ada banyak reaksi negatif di halaman ini. Saya pikir sudah lama ada kesalahpahaman tentang tujuan LabelBinarizer dan LabelEncoder. Ini untuk target, bukan fitur. Meskipun harus diakui mereka dirancang (dan diberi nama yang buruk) sebelum waktu saya.

Meskipun saya pikir pengguna dapat menggunakan CountVectorizer (atau DictVectorizer dengan dataframe.to_dict(orient='records') jika Anda berasal dari kerangka data) untuk tujuan ini untuk waktu yang lama, kami baru-baru ini menggabungkan CategoricalEncoder (#9151 ) ke master, meskipun ini dapat digulirkan ke OneHotEncoer, dan OrdinalEncoder baru sebelum rilis (#10521).

Saya harap ini memenuhi kebutuhan masyarakat yang jelas-jelas tidak puas.

Saya harus mengatakan bahwa sebagai seseorang yang telah menyumbangkan banyak waktu luang untuk pengembangan proyek ini selama hampir lima tahun sekarang (dan baru-baru ini telah dipekerjakan untuk mengerjakannya juga), melihat besarnya reaksi negatif, daripada kontribusi konstruktif ke perpustakaan cukup menyedihkan. Meskipun harus diakui tanggapan saya di atas bahwa Anda harus menulis hal seperti Pipa baru, daripada transformator baru untuk input kategoris adalah kesalahpahaman di pihak saya (dan seharusnya/bisa diperbaiki oleh orang lain), yang saya harap dapat dimengerti saat mengerjakan beban kerja yang sangat besar yang mempertahankan proyek ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat