在#1989 的工作中, @freddyaboulton建议我们将TargetImputer
设为SimpleImputer
的子类。 不幸的是,当在_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 :
选项:
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你认为我们可以关闭它吗? 我想我们同意我们不需要对_get_subclasses
进行更改以支持 TargetImputer/其他组件的开发。