Evalml: Permitir componentes que não sejam filhos "folha" na hierarquia de classes

Criado em 23 mar. 2021  ·  4Comentários  ·  Fonte: alteryx/evalml

Ao trabalhar em # 1989, @freddyaboulton sugeriu que TargetImputer uma subclasse de SimpleImputer . Infelizmente, ao procurar por componentes viáveis ​​em _get_subclasses , _get_subclasses coletará apenas classes que estão na parte inferior da hierarquia. Por exemplo:

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

O problema é que, se criarmos a subclasse SimpleImputer, teremos acesso a TargetImputer, mas SimpleImputer não será mais encontrado pelo EvalML como um componente utilizável:

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

Eu acredito que a intenção original é não pegar classes que não são úteis (ex: Transformer), mas isso é um problema se queremos construir sobre componentes úteis para criar novos.

Comentário original aqui: https://github.com/alteryx/evalml/pull/1989#discussion_r599894996

bug

Todos 4 comentários

Opções:
1.) Faça com que o TargetImputer use o SimpleImputer.
2.) Não defina o componente TargetImputer, mas, em vez disso, aplique o SimpleImputer ao destino.
3.) Exclua _get_subclasses () em favor da lista estática de componentes. (preferido)
4.) Tornar _get_subclasses () mais inteligente.

Próxima etapa: agende uma discussão para decidir como fazer isso.

Minha opinião é que não devemos mudar nada, a menos que queiramos tornar a herança de classes não básicas um padrão mais comum em nossa base de código. Atualmente não fazemos isso, então construir um sistema que permita isso parece pouca prioridade para mim.

Este problema não está bloqueando o imputador de destino ou qualquer trabalho de curto prazo que temos pela frente e o sistema atual para identificar subclasses "funciona". Se realmente queremos 3, então essa é outra história hehe e eu estaria aqui para ouvir os argumentos a favor, mas não acho que haja necessidade de fazê-lo.

E se quisermos alavancar o SimpleImputer no TargetImputer no futuro, podemos usar composição sobre herança, que eu acho que é a que a opção 1 está se referindo.

Concordo com @freddyaboulton aqui, também vale a pena notar que definimos _get_subclasses() em primeiro lugar porque manter o controle de uma lista estática de componentes era um pouco entediante / frustrante, pois estávamos adicionando mais e mais componentes. Se escolhermos 3, pode fazer mais sentido manter _get_subclasses() mas também manter uma lista de "exceções", como o caso SimpleImputer / TargetImputer, para que sejam incluídos, mas outros componentes como Transformer ainda estão excluídos.

Também tudo bem com a ideia de alguma técnica de composição, se isso dá conta do recado.

@ angela97lin Você acha que podemos fechar isso? Acho que concordamos que não precisamos fazer alterações em _get_subclasses para permitir o desenvolvimento do TargetImputer / outros componentes.

Esta página foi útil?
0 / 5 - 0 avaliações