Evalml: Komponenten zulassen, die keine "Blatt"-Kinder in der Klassenhierarchie sind

Erstellt am 23. März 2021  ·  4Kommentare  ·  Quelle: alteryx/evalml

Bei der Arbeit an #1989 schlug @freddyaboulton vor, TargetImputer einer Unterklasse von SimpleImputer . Leider sammelt _get_subclasses bei der Suche nach brauchbaren Komponenten in _get_subclasses nur Klassen, die ganz unten in der Hierarchie stehen. Beispielsweise:

ComponentBase --> Transformer --> SimpleImputer # will only grab SimpleImputer

Das Problem ist, wenn wir SimpleImputer untergeordnet haben, haben wir Zugriff auf TargetImputer, aber SimpleImputer wird von EvalML nicht mehr als verwendbare Komponente gefunden:

ComponentBase --> Transformer --> SimpleImputer --> TargetImputer 
# will only grab TargetImputer, SimpleImputer is no longer a leaf

Ich glaube, die ursprüngliche Absicht besteht darin, keine Klassen zu greifen, die nicht nützlich sind (zB: Transformer), aber dies ist ein Problem, wenn wir auf nützlichen Komponenten aufbauen möchten, um neue zu erstellen.

Originalkommentar hier: https://github.com/alteryx/evalml/pull/1989#discussion_r599894996

bug

Alle 4 Kommentare

Optionen:
1.) Lassen Sie den TargetImputer den SimpleImputer verwenden.
2.) Definieren Sie keine TargetImputer-Komponente, sondern wenden Sie stattdessen den SimpleImputer auf das Ziel an.
3.) Löschen Sie _get_subclasses() zugunsten einer statischen Liste von Komponenten. (bevorzugt)
4.) Machen Sie _get_subclasses() intelligenter.

Nächster Schritt: Planen Sie eine Diskussion, um zu entscheiden, wie dies zu tun ist.

Meiner Meinung nach sollten wir nichts ändern, es sei denn, wir möchten die Vererbung von Nicht-Basisklassen zu einem häufigeren Muster in unserer Codebasis machen. Das tun wir derzeit nicht, daher scheint mir der Aufbau eines Systems, das dies ermöglicht, nachrangig zu sein.

Dieses Problem blockiert nicht den Ziel-Imputer oder irgendeine kurzfristige Arbeit, die wir vor uns haben, und das aktuelle System zum Identifizieren von Unterklassen "arbeitet". Wenn wir wirklich 3 wollen, dann ist das eine andere Geschichte, hehe, und ich würde gerne Argumente dafür hören, aber ich denke nicht, dass es notwendig ist, es zu tun.

Und wenn wir in Zukunft den SimpleImputer im TargetImputer nutzen möchten, können wir die Komposition über die Vererbung verwenden, was meiner Meinung nach Option 1 betrifft.

Ich stimme @freddyaboulton hier zu, auch erwähnenswert, dass wir zuerst _get_subclasses() definiert haben, weil es etwas mühsam / frustrierend war, den Überblick über eine statische Liste von Komponenten zu behalten, da wir immer mehr Komponenten hinzugefügt haben. Wenn wir uns für 3 entscheiden, ist es möglicherweise sinnvoller, _get_subclasses() beizubehalten, aber auch eine Liste von "Ausnahmen" wie den SimpleImputer / TargetImputer-Fall zu führen, damit sie enthalten sind, aber andere Komponenten wie die Transformer sind noch ausgeschlossen.

Auch mit der Idee einer kompositorischen Technik einverstanden, wenn dies der Fall ist.

@angela97lin Glaubst du, wir können das schließen? Ich denke, wir sind uns einig, dass wir keine Änderungen an _get_subclasses vornehmen müssen, um die Entwicklung von TargetImputer/anderen Komponenten zu ermöglichen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen