Scikit-learn: LabelBinarizer und LabelEncoder passen und transformieren Signaturen, die nicht mit Pipeline kompatibel sind

Erstellt am 26. Apr. 2014  ·  6Kommentare  ·  Quelle: scikit-learn/scikit-learn

Ich erhalte diese Fehlermeldung, wenn ich versuche, LabelBinarizer und LabelEncoder in einer Pipeline zu verwenden:

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)

Es scheint, dass dies daran liegt, dass sich die Signaturen der Klassen

Ich denke, dies ist eine ziemlich einfache Lösung (ändern Sie einfach die Signatur in def(self, X, y=None) ), für die ich gerne einen Pull-Request senden würde, aber ich wollte überprüfen, ob es andere Gründe dafür gibt, dass die Signaturen die sind wie sie sind, an die ich nicht gedacht habe.

API

Hilfreichster Kommentar

Ich sehe, dass es viele negative Reaktionen auf dieser Seite gegeben hat. Ich glaube, der Zweck von LabelBinarizer und LabelEncoder wurde lange missverstanden. Diese sind für Ziele, nicht für Funktionen. Obwohl sie zugegebenermaßen vor meiner Zeit entworfen (und schlecht benannt) wurden.

Obwohl ich Mitglieder halten konnten mit CountVectorizer gewesen (oder DictVectorizer mit dataframe.to_dict(orient='records') , wenn Sie von einem Datenrahmen kommen) zu diesem Zweck für eine lange Zeit haben wir kürzlich fusionierten ein CategoricalEncoder 9151 (# ) in master, obwohl dies in OneHotEncoer und einem neuen OrdinalEncoder vor der Veröffentlichung (#10521) gerollt werden kann.

Ich hoffe, dass dies den Bedürfnissen einer deutlich verärgerten Bevölkerung entspricht.

Ich muss sagen, dass ich als jemand, der seit fast fünf Jahren enorm viel Freizeit für die Entwicklung dieses Projekts bereitstellt (und seit kurzem auch dafür angestellt ist), das Ausmaß der negativen Reaktionen und nicht der konstruktiven Beiträge sieht in die Bibliothek ist ziemlich traurig. Obwohl meine Antwort oben, dass Sie eine neue Pipeline-ähnliche Sache schreiben sollten, und nicht einen neuen Transformer für kategoriale Eingaben, zugegebenermaßen ein Missverständnis meinerseits war (und von anderen hätte korrigiert werden sollen/können), das beim Durcharbeiten hoffentlich verständlich ist die enorme Arbeitsbelastung, die dieses Projekt aufrechterhält.

Alle 6 Kommentare

Ich denke, Sie haben Recht, das zu beheben.

Am 26. April 2014, 19:37 Uhr, schrieb hxu [email protected] :

Ich erhalte diese Fehlermeldung, wenn ich versuche, LabelBinarizer und LabelEncoder in einem zu verwenden
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 sonst:
145 return self.steps[-1][-1].fit(Xt, y, *_fit_params).transform(Xt)
TypeError: fit_transform() benötigt genau 2 Argumente (3 gegeben)

Es scheint, dass dies daran liegt, dass sich die Anpassungs- und Transformationssignaturen der Klassenhttps://github.com/scikit-learn/scikit-learn/blob/master/sklearn/preprocessing/label.py#L85 von den meisten anderen Schätzern unterscheiden und nur akzeptieren ein einziges Argument.

Ich denke, dies ist eine ziemlich einfache Lösung (ändern Sie einfach die Signatur in def(self,
X, y=None)), für die ich gerne einen Pull-Request senden würde, aber ich wollte
Überprüfen Sie, ob es andere Gründe dafür gibt, dass die Signaturen so sind, wie sie sind
sind, an die ich nicht gedacht habe.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub an
.

In #3113 haben wir entschieden, dass dies nicht behoben werden soll, da die Label-Codierung nicht wirklich in ein Pipeline .

@jnothman , nur um zu wissen: Was soll ich stattdessen tun, wenn ich zufällig ein kategoriales Feature in einer Pipeline vektorisieren muss?

Am besten schreiben Sie Ihren eigenen Pipeline-like Code (vielleicht erben Sie von dem vorhandenen), um Ihren speziellen Fall zu behandeln.

Anstatt LabelBinarizer in einer Pipeline zu verwenden, habe ich einfach meinen eigenen Transformer implementiert:

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

Scheint den Trick zu machen!

bearbeiten:

das ist eine bessere lösung:
https://github.com/scikit-learn/scikit-learn/pull/7375/files#diff -1e175ddb0d84aad0a578d34553f6f9c6

Ich sehe, dass es viele negative Reaktionen auf dieser Seite gegeben hat. Ich glaube, der Zweck von LabelBinarizer und LabelEncoder wurde lange missverstanden. Diese sind für Ziele, nicht für Funktionen. Obwohl sie zugegebenermaßen vor meiner Zeit entworfen (und schlecht benannt) wurden.

Obwohl ich Mitglieder halten konnten mit CountVectorizer gewesen (oder DictVectorizer mit dataframe.to_dict(orient='records') , wenn Sie von einem Datenrahmen kommen) zu diesem Zweck für eine lange Zeit haben wir kürzlich fusionierten ein CategoricalEncoder 9151 (# ) in master, obwohl dies in OneHotEncoer und einem neuen OrdinalEncoder vor der Veröffentlichung (#10521) gerollt werden kann.

Ich hoffe, dass dies den Bedürfnissen einer deutlich verärgerten Bevölkerung entspricht.

Ich muss sagen, dass ich als jemand, der seit fast fünf Jahren enorm viel Freizeit für die Entwicklung dieses Projekts bereitstellt (und seit kurzem auch dafür angestellt ist), das Ausmaß der negativen Reaktionen und nicht der konstruktiven Beiträge sieht in die Bibliothek ist ziemlich traurig. Obwohl meine Antwort oben, dass Sie eine neue Pipeline-ähnliche Sache schreiben sollten, und nicht einen neuen Transformer für kategoriale Eingaben, zugegebenermaßen ein Missverständnis meinerseits war (und von anderen hätte korrigiert werden sollen/können), das beim Durcharbeiten hoffentlich verständlich ist die enorme Arbeitsbelastung, die dieses Projekt aufrechterhält.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen