Scikit-learn: تلائم LabelBinarizer و LabelEncoder وتحويل التواقيع غير المتوافقة مع خط الأنابيب

تم إنشاؤها على ٢٦ أبريل ٢٠١٤  ·  6تعليقات  ·  مصدر: scikit-learn/scikit-learn

أتلقى هذا الخطأ عندما أحاول استخدام LabelBinarizer و LabelEncoder في خط أنابيب:

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)

يبدو أن هذا يرجع إلى أن توقيعات الفئات

أعتقد أن هذا حل سهل جدًا (فقط قم بتغيير التوقيع إلى def(self, X, y=None) ) ويسعدني إرسال طلب سحب من أجله ، لكنني أردت التحقق مما إذا كانت هناك أي أسباب أخرى تجعل التوقيعات هي بالطريقة التي لم أفكر بها.

API

التعليق الأكثر فائدة

أرى أنه كان هناك الكثير من ردود الفعل السلبية على هذه الصفحة. أعتقد أنه كان هناك سوء فهم منذ فترة طويلة لغرض LabelBinarizer و LabelEncoder. هذه للأهداف وليس الميزات. على الرغم من الاعتراف بأنها مصممة (وسُميت بشكل سيئ) قبل وقتي.

على الرغم من أنني أعتقد أنه كان من الممكن أن يستخدم المستخدمون CountVectorizer (أو DictVectorizer مع dataframe.to_dict(orient='records') إذا كنت قادمًا من إطار بيانات) لهذا الغرض لفترة طويلة ، فقد قمنا مؤخرًا بدمج CategoricalEncoder (# 9151 ) إلى Master ، على الرغم من أنه قد يتم تحويل هذا إلى OneHotEncoer ، و OrdinalEncoder جديد قبل الإصدار (# 10521).

آمل أن يلبي هذا احتياجات السكان الساخطين بشكل واضح.

يجب أن أقول أنه بصفتي شخصًا تطوع بكميات هائلة من وقت الفراغ لتطوير هذا المشروع لما يقرب من خمس سنوات حتى الآن (وتم توظيفه مؤخرًا للعمل عليه أيضًا) ، أرى حجم ردود الفعل السلبية ، بدلاً من المساهمات البناءة إلى المكتبة أمر محزن للغاية. على الرغم من أن إجابتي أعلاه يجب أن تكتب شيئًا جديدًا يشبه خط الأنابيب ، بدلاً من محول جديد للمدخلات الفئوية كان سوء فهم من جانبي (وكان ينبغي / كان من الممكن تصحيحه من قبل الآخرين) ، والذي آمل أن يكون مفهومًا أثناء العمل من خلاله عبء العمل الهائل الذي يحافظ على هذا المشروع.

ال 6 كومينتر

أعتقد أنك محق في إصلاح ذلك.

في 26 أبريل 2014 الساعة 19:37 ، كتب hxu [email protected] :

أحصل على هذا الخطأ عندما أحاول استخدام LabelBinarizer و LabelEncoder في ملف
خط انابيب:

sklearn / pipeline.pyc في 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 إرجاع self.steps [-1] [- 1] .fit_transform (Xt، y، * _fit_params)
144 آخر:
145 إرجاع self.steps [-1] [- 1] .fit (Xt، y، * _fit_params) .transform (Xt)
TypeError: تأخذ fit_transform () وسيطتين بالضبط (3 معطاة)

ويبدو أن هذا هو لصالح والطبقات "تحويل signat ureshttps: //github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85are تختلف عن معظم المقدرات الأخرى ويقبل فقط حجة واحدة.

أعتقد أن هذا حل سهل جدًا (فقط قم بتغيير التوقيع لتعريف (ذاتي ،
X ، y = لا شيء)) سأكون سعيدًا لإرسال طلب سحب ، لكنني أردت ذلك
تحقق مما إذا كانت هناك أي أسباب أخرى تشير إلى أن التوقيعات هي على هذا النحو
هي التي لم أفكر بها.

-
قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/scikit-learn/scikit-learn/issues/3112
.

في # 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 (أو DictVectorizer مع dataframe.to_dict(orient='records') إذا كنت قادمًا من إطار بيانات) لهذا الغرض لفترة طويلة ، فقد قمنا مؤخرًا بدمج CategoricalEncoder (# 9151 ) إلى Master ، على الرغم من أنه قد يتم تحويل هذا إلى OneHotEncoer ، و OrdinalEncoder جديد قبل الإصدار (# 10521).

آمل أن يلبي هذا احتياجات السكان الساخطين بشكل واضح.

يجب أن أقول أنه بصفتي شخصًا تطوع بكميات هائلة من وقت الفراغ لتطوير هذا المشروع لما يقرب من خمس سنوات حتى الآن (وتم توظيفه مؤخرًا للعمل عليه أيضًا) ، أرى حجم ردود الفعل السلبية ، بدلاً من المساهمات البناءة إلى المكتبة أمر محزن للغاية. على الرغم من أن إجابتي أعلاه يجب أن تكتب شيئًا جديدًا يشبه خط الأنابيب ، بدلاً من محول جديد للمدخلات الفئوية كان سوء فهم من جانبي (وكان ينبغي / كان من الممكن تصحيحه من قبل الآخرين) ، والذي آمل أن يكون مفهومًا أثناء العمل من خلاله عبء العمل الهائل الذي يحافظ على هذا المشروع.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات