Evalml: Izinkan komponen yang bukan anak "daun" dalam hierarki kelas

Dibuat pada 23 Mar 2021  ·  4Komentar  ·  Sumber: alteryx/evalml

Dalam mengerjakan #1989, @freddyaboulton menyarankan agar kita membuat TargetImputer subclass dari SimpleImputer . Sayangnya, ketika mencari komponen yang layak di _get_subclasses , _get_subclasses hanya akan mengumpulkan kelas yang berada di paling bawah hierarki. Sebagai contoh:

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

Masalahnya adalah, jika kita mensubclass SimpleImputer, kita akan memiliki akses ke TargetImputer, tetapi SimpleImputer tidak akan lagi ditemukan oleh EvalML sebagai komponen yang dapat digunakan:

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

Saya percaya maksud aslinya adalah untuk tidak mengambil kelas yang tidak berguna (mis: Transformer), tetapi ini adalah masalah jika kita ingin membangun komponen yang berguna untuk membuat yang baru.

Komentar asli di sini: https://github.com/alteryx/evalml/pull/1989#discussion_r599894996

bug

Semua 4 komentar

Pilihan:
1.) Minta TargetImputer menggunakan SimpleImputer.
2.) Jangan mendefinisikan komponen TargetImputer, tetapi terapkan SimpleImputer ke target.
3.) Hapus _get_subclasses() untuk mendukung daftar komponen statis. (lebih disukai)
4.) Jadikan _get_subclasses() lebih pintar.

Langkah selanjutnya: jadwalkan diskusi untuk memutuskan bagaimana melakukan ini.

Pendapat saya adalah bahwa kita tidak boleh mengubah apa pun kecuali kita ingin menjadikan pewarisan kelas non-dasar sebagai pola yang lebih umum dalam basis kode kita. Kami saat ini tidak melakukan itu, jadi membangun sistem untuk memungkinkan itu tampaknya menjadi prioritas rendah bagi saya.

Masalah ini tidak menghalangi imputer target atau pekerjaan jangka pendek apa pun yang kami miliki di depan kami dan sistem saat ini untuk mengidentifikasi subkelas "berhasil". Jika kita benar-benar ingin 3 maka itu cerita lain hehe dan saya akan turun untuk mendengar argumen untuk itu tetapi saya rasa tidak perlu melakukannya.

Dan jika kita ingin memanfaatkan SimpleImputer di TargetImputer di masa mendatang, kita dapat menggunakan komposisi daripada pewarisan, yang menurut saya adalah pilihan 1 yang dimaksud.

Setuju dengan @freddyaboulton di sini, juga perlu dicatat bahwa kami mendefinisikan _get_subclasses() di tempat pertama karena melacak daftar komponen statis agak membosankan / membuat frustrasi karena kami menambahkan lebih banyak komponen. Jika kita memilih 3, mungkin lebih masuk akal untuk menyimpan _get_subclasses() tetapi juga menyimpan daftar "pengecualian" seperti kasus SimpleImputer / TargetImputer, sehingga mereka disertakan, tetapi komponen lain seperti Transformer masih dikecualikan.

Juga oke dengan ide beberapa teknik komposisi-esque jika itu menyelesaikan pekerjaan.

@ angela97lin Apakah Anda pikir kita bisa menutup ini? Saya rasa kami setuju bahwa kami tidak perlu melakukan perubahan pada _get_subclasses untuk mengaktifkan pengembangan TargetImputer/komponen lainnya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat