Evalml: クラス階層で「リーフ」の子ではないコンポーネントを許可する

作成日 2021年03月23日  ·  4コメント  ·  ソース: alteryx/evalml

#1989の作業で、 @ freddyaboultonは、 TargetImputerSimpleImputerサブクラスにすることを提案しました。 残念ながら、 _get_subclassesで実行可能なコンポーネントを探す場合、 _get_subclassesは階層の最下部にあるクラスのみを収集します。 例えば:

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

問題は、SimpleImputerをサブクラス化すると、TargetImputerにアクセスできるようになりますが、 SimpleImputerが使用可能なコンポーネントとしてEvalMLによって検出されなくなることです。

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

本来の目的は、役に立たないクラス(例:Transformer)を取得しないことだと思いますが、これは、有用なコンポーネントに基づいて新しいコンポーネントを作成する場合に問題になります。

ここに元のコメント: https

bug

全てのコメント4件

オプション:
1.)TargetImputerにSimpleImputerを使用させます。
2.)TargetImputerコンポーネントを定義せず、代わりにSimpleImputerをターゲットに適用します。
3.)コンポーネントの静的リストを優先して_get_subclasses()を削除します。 (推奨)
4。)_ get_subclasses()をよりスマートにします。

次のステップ:これを行う方法を決定するためのディスカッションをスケジュールします。

私の意見では、非基本クラスの継承をコードベースでより一般的なパターンにしたい場合を除いて、何も変更しないでください。 現在はそうしていませんので、それを可能にするシステムを構築することは私には優先度が低いようです。

この問題は、ターゲットの代入や、私たちの前にある短期間の作業、およびサブクラスを識別するための現在のシステム「作業」をブロックしていません。 もし私たちが本当に3が欲しいのなら、それは別の話です。私はそれについての議論を聞くことになりますが、それをする必要はないと思います。

また、将来、TargetImputerでSimpleImputerを活用したい場合は、継承よりもコンポジションを使用できます。これは、オプション1が参照しているものだと思います。

ここで@freddyaboultonに同意し_get_subclasses()を定義したことにも注意してください。 3を選択する場合は、 _get_subclasses()保持するだけでなく、SimpleImputer / TargetImputerの場合などの「例外」のリストも保持して、それらが含まれるようにする方が理にかなっていますが、 Transformerなどの他のコンポーネントも含まれます。

それが仕事を成し遂げるならば、いくつかの作曲風のテクニックのアイデアでも大丈夫です。

@ angela97linこれを閉じることができると思いますか? TargetImputer /その他のコンポーネントの開発を可能にするために、 _get_subclassesを変更する必要がないことに同意すると思います。

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