
Pengarang: Konstantin Pluzhnikov
Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.
Tambahkan instrumen baru ke kotak peralatan Anda saat menyesuaikan model Anda
Sumber: Foto oleh Brett Jordan di flickr.com
Anda memiliki kumpulan data yang tidak seimbang; Anda ingin mengurangi jumlah negatif palsu (FN) atau bahkan positif palsu (FP). Mungkin Anda menyukai hal-hal khusus dan ingin berlatih menambahkan perubahan pada model standar. Jika demikian, artikel ini untuk Anda.
Salah satu caranya adalah dengan menyesuaikan fungsi kerugian model Anda dengan koefisien tertentu. Artikel ini bertujuan untuk menunjukkan pendekatan penyesuaian di TensorFlow, LightGBM, dan Catboost. Jika Anda ingin merasakan keseluruhan ide dengan matematika terkait dan melihat konsep yang sama untuk XGBoost, lihat artikel saya di Medium.
Juga, saya bertujuan untuk menyediakan cara untuk menyematkan hyperparameter khusus ke fungsi khusus, yang membuka pintu untuk penyetelan lanjutan parameter baru seperti yang biasa.
Saya menggunakan dataset Titanic untuk demonstrasi karena mudah didekati dan tidak seimbang. Model dasar, serta model yang disesuaikan, ada di repositori GitHub saya.
CahayaGBM
Ini adalah salah satu algoritma peningkatan gradien paling efektif yang dikembangkan oleh Microsoft. Ini mengungguli XGBoost dalam kecepatan dan sebanding dalam akurasi. Untuk detail lebih lanjut, periksa artikel ini oleh BexBoost. LightGBM adalah adik dari XGBoost, jadi ia memiliki semua pencapaiannya.
https://medium.com/media/2316f962481510b88b0327b3907a27cf/href
Saya telah menggunakan fungsi yang ditentukan pengguna yang disematkan untuk memperkenalkan beta sebagai bagian inti dari fungsi logloss (ini bukan lagi hyperparameter eksternal).
Anda dapat melihat bahwa fungsi luar menyajikan beta ke internal, yang menghitung turunan. Hal yang sama berlaku untuk metrik khusus. Sekarang Anda dapat menyetelnya dengan hyperparameter lain dengan paket khusus seperti perpustakaan Optuna.
beta harus <1.0 untuk menghukum FN. Untuk menghukum FP, itu harus lebih dari 1,0. Untuk detailnya, silakan lihat artikel saya di Medium.
Ada beberapa perbedaan dibandingkan dengan fungsi kehilangan kustom XGBoost. Pertama, LightGBM menempatkan format y_predin logit_raw, dan transformasi logit diperlukan. Kedua, metrik khusus LightGBM menghasilkan tiga hasil (nama metrik khusus (misalnya, “loggreg_error”), nilai metrik, dan parameter boolean yang harus disetel Salah karena tujuan kami adalah mengurangi nilai metrik khusus).
Ada satu lagi detail yang menarik dalam transformasi logit dari predt ; Saya telah menggunakan fungsi np.where untuk memastikan stabilitas dan menghindari overflow ketika berhadapan dengan logit_raw negatif. Ini disebutkan sebagai praktik terbaik dalam berbagai contoh di Stackoverflow dan dokumentasi model.
Mari kita plot matriks kebingungan dari hasil model LightGBM standar dan yang kehilangan kustom:
(Kiri) Model GBM Ringan Dasar | (Kanan) Model LightGBM yang Disesuaikan dengan beta = 0.4, Sumber: Gambar oleh penulis
Kehilangan kustom dengan beta<1 menyebabkan pertumbuhan FP dan TP; untuk penipisan FN dan TN.
CatBoost
Nama lengkapnya adalah Peningkatan kategoris, yang dikembangkan oleh Yandex. Ini memiliki keuntungan besar dibandingkan algoritme lain karena Anda tidak perlu mengkodekan fitur kategoris dari kumpulan data Anda; Anda daftar mereka dalam model, dan berurusan dengan mereka sendiri. Dmytro Iakubovskyi menggunakannya secara luas dalam analisisnya tentang kumpulan data yang berbeda (IMDB, anggur, bir, dan banyak lagi tabel dengan statistik). CatBoost mewarisi sebagian besar manfaat XGBoost dan LightGBM.
https://medium.com/media/bfc5f9029a5bc8d53b94d52855484f29/href
Anda dapat melihat perbedaan antara realisasi Catboost (menggunakan pemrograman berorientasi objek) dan LightGBM (fungsi standar yang ditentukan pengguna). Saya mengambil kode untuk kelas CatBoost dari dokumentasi resmi. Saya hanya menambahkan beta ke inisialisasi kelas. Anda dapat menulis kode untuk fungsi-fungsi ini dalam bentuk apa pun yang Anda suka (OOP atau UDF). Pilihan ada padamu!
Merencanakan hasil:
(Kiri) Model CatBoost Dasar | (Kanan) Model CatBoost yang disesuaikan dengan beta = 0,4, Sumber: Gambar oleh penulis
Logika hasilnya sama dengan model LightGBM.
TensorFlow
Ini adalah keluarga algoritma yang terkenal dan sangat kuat oleh Google. Menyiapkan kerugian kustom di sini adalah jenis cerita yang berbeda. Anda tidak perlu menuliskan turunan dan metrik khusus secara eksplisit; tidak ada `beta` lagi ( betais mati, panjang umur untuk pos_weight!). TF memiliki fungsi yang sesuai, tf.nn.weighted_cross_entropy_with_logitsyang membuat segalanya lebih mudah diatur.
https://medium.com/media/65e71e527f0b1945eebf7952c58dcaeb/href
pos_weight harus > 1,0 untuk menghukum FN, dan < 1,0 untuk menghukum FP. Ini adalah situasi yang berlawanan dibandingkan dengan beta. pos_weight adalah koefisien yang mengalikan bagian FN dari logloss sedangkan beta adalah faktor bagian FP.
Merencanakan hasil:
(Kiri) Model TensorFlow Dasar | (Kanan) Model TensorFlow yang disesuaikan dengan pos_weight = 3,5, Sumber: Gambar oleh penulis
Model kustom saya menunjukkan kinerja yang agak buruk sementara model standar TF bekerja dengan sangat baik; Saya harap Anda memaafkan saya untuk hasil yang buruk karena tujuan utama di sini adalah demonstrasi.
Kesimpulan
Hasil keseluruhan sebanding untuk semua model. Trade-off antara FN dan FP juga ada. Tetapi jika mengurangi FN adalah tujuan Anda, kerugian khusus ini siap membantu Anda.
Keuntungan
Mudah dan cepat untuk diterapkan (gunakan empat fungsi dan beta yang ditentukan pengguna, dan hanya itu). Tidak perlu melakukan manipulasi dengan data yang mendasari sebelum pemodelan (jika dataset tidak sangat tidak seimbang) Ini dapat diterapkan sebagai bagian dari eksplorasi data atau sebagai bagian dari model stacking. Kami dapat menambahkannya ke paket pembelajaran mesin paling populer. Dengan beta atau pos_weight yang disematkan, kami dapat menyetelnya seperti hyperparameter biasa.
Jalan pintas
Kita harus menyesuaikan beta untuk mendapatkan trade-off FN ke FP yang optimal. Ini mungkin tidak memberikan hasil yang berarti ketika dataset sangat tidak seimbang (dataset di mana kelas minor kurang dari 10% dari semua sampel). Analisis data eksplorasi sangat penting untuk membuat model bekerja. Jika kita menghukum FN, itu sering menyebabkan pertumbuhan FP yang cukup besar dan sebaliknya. Anda mungkin memerlukan sumber daya tambahan untuk mengimbangi pertumbuhan itu.
Saya harap artikel ini memberikan beberapa panduan untuk menulis kerugian kustom dengan UDF dan OOP atau bahkan mengadaptasi realisasi resmi Tensorflow. Juga, Anda dapat menggunakan contoh-contoh ini sebagai titik awal untuk pengembangan fungsi Anda.
Tetap aman dan sehat. Jangan biarkan perang.
Referensi
Diskusi tentang cara mengimplementasikan LightGBM di Stackoverflow -> https://stackoverflow.com/questions/58572495/how-to-implement-custom-logloss-with-identical-behavior-to-binary-objective-in-l/58573112# 58573112 Dokumentasi resmi CatBoost tentang kehilangan kustom -> https://catboost.ai/en/docs/concepts/python-usages-examples#user-defined-loss-function Dokumentasi resmi CatBoost dari metrik kustom -> https: //catboost.ai/en/docs/concepts/python-usages-examples#custom-loss-function-eval-metric Dokumentasi resmi TensorFlow tentang entropi silang berbobot dengan logit -> https://www.tensorflow.org/api_docs /python/tf/nn/weighted_cross_entropy_with_logits Artikel luar biasa tentang cara merakit fungsi kehilangan kustom di TensorFlow -> https://medium.com/swlh/custom-loss-and-custom-metrics-using-keras-sequential-model- api-d5bcd3a4ff28 Repositori GitHub saya dengan semua kerugian khusus yang disebutkan -> https://github.com/kpluzhnikov/binary_classification_custom_loss
Menangani Dataset yang Tidak Seimbang Dengan TensorFlow, LightGBM, dan CatBoost awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.
Diterbitkan melalui Menuju AI