Buat Garis Besar Kelas yang Lebih Kecil Dengan Fungsi Rugi Kustom – Menuju AI

Buat Garis Besar Kelas yang Lebih Kecil Dengan Fungsi Rugi Kustom – Menuju AI

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.

Panduan singkat bagi Anda untuk memanfaatkan klasifikasi secara maksimal ketika berhadapan dengan kumpulan data yang tidak seimbang



(Kiri) Foto oleh Mike Lawrence di Flickr | (Tengah) Foto oleh Jernej Furman di Flickr | (Kanan) Foto oleh Leonard J Matthews di Flickr

Mengapa menggunakan fungsi kehilangan kustom?

Mungkin ada situasi ketika metrik akurasi tidak cukup untuk mendapatkan hasil yang diharapkan. Kita mungkin ingin mengurangi tingkat false negative (FN) atau false positive (FP). Mungkin bermanfaat ketika kumpulan data tidak seimbang dan hasil yang kita cari termasuk dalam kelas yang lebih kecil.

Dimana untuk melamar?

1. Deteksi penipuan. Kami ingin mengurangi sampel negatif palsu (misalnya, model memperlakukan transaksi seperti biasa jika diragukan). Tujuannya adalah untuk meminimalkan risiko transaksi penipuan melewati tanpa diketahui (bahkan jika tingkat positif palsu akan tumbuh).

2. Identifikasi penyakit. Ini memiliki logika yang sama. Kami ingin meningkatkan kemungkinan terkena penyakit, bahkan jika kami mendapatkan lebih banyak kasus KB untuk diselesaikan di masa depan.

3. Pilih orang luar dalam pertandingan olahraga. Mari kita asumsikan permainan dengan dua hasil (menang/kalah dari favorit). Tapi kami ingin mencari tahu apakah orang luar punya kesempatan. Model yang seimbang akan melakukan “petik ceri” hampir sepanjang waktu karena ini adalah cara mudah untuk memprediksi kemenangan favorit. Jalan keluarnya adalah menghukum negatif palsu (kasus ketika seorang model memprediksi kemenangan tim yang lebih kuat, tetapi label yang akurat adalah kehilangan favorit).

Kami tidak ingin tingkat FP tinggi dalam dua kasus pertama karena akan meningkatkan penggunaan sumber daya untuk mengonfirmasi bahwa sampel bukan penipuan/penyakit. Jadi optimasi model tetap diperlukan.

Jembatan antara logloss asli dan kustom

Sebuah algoritma peningkatan gradien biasa (algoritma) membuat langkah-langkah berikut. Itu mendapat nilai prediksi (sebut saja “predt”, dalam bentuk logit atau logitraw tergantung pada perpustakaan yang kita gunakan) dan label sebenarnya masing-masing (sebut saja “y”), kemudian memperkirakan nilai fungsi logloss . Ia melakukan tindakan ini baris demi baris untuk menghitung nilai fungsi kerugian kumulatif.

Logloss memiliki rumus berikut:

di mana N— jumlah sampel, y— label sebenarnya, log — logaritma natural.

p_i — probabilitas sampel ke-i menjadi 1(fungsi sigmoid):


di mana m adalah jumlah fitur, zis regresi linier di mana bobot gudang fitur, x adalah nilai fitur.

Langkah selanjutnya adalah memperbarui bobot fitur untuk meminimalkan kerugian. Algoritma menghitung gradien dan hessian untuk memilih arah dan kekuatan untuk mengubah bobot.

Rumus untuk gradien:

Rumus untuk goni:

Kami menghitung turunan dengan menerapkan aturan rantai ke fungsi logloss l sehubungan dengan perubahan argumen z.

Kita bisa membayangkan prosesnya sebagai permainan golf. Seorang pegolf (algoritma) mencoba memasukkan bola ke dalam lubang (prediksi yang benar yang meminimalkan kerugian); untuk melakukan ini, dia dapat memilih arah dan kekuatan tembakan (gradien) dan mengambil berbagai klub untuk mendapatkan kendali atas serangan (the goni).

Foto oleh David Joyce di Flickr

Tujuan utama dari algoritma ini adalah untuk membuat logloss kumulatif seminimal mungkin (seorang pegolf aneh yang mengejar jumlah bola holing alih-alih membuat hasil dengan pukulan minimum). Jika kita memiliki dataset yang tidak seimbang dan fitur tidak memberikan kategorisasi yang jelas, ini cenderung memprediksi bahwa sampel termasuk dalam kelompok yang lebih besar (semacam pemetik ceri).

Mari kita bayangkan permainan golf dengan aturan yang berubah; kebanyakan lubang memiliki nilai standar, tetapi ada tambahan dengan nilai lebih signifikan dari lubang biasa. Seorang pegolf tidak memahami harga sebuah target sebelumnya. Jika seorang pemain membuat lubang ekstra, ia menerima hadiah yang lebih tinggi. Jika dia salah mengidentifikasi lubang sebagai lubang standar dan menolak untuk mendekatinya, dia kehilangan waktu dan menerima lebih sedikit kompensasi.

Algoritme dasar tidak dapat menyadari perubahan dalam aturan, jadi ia melanjutkan ke yang lebih sederhana dan gagal mengidentifikasi dan mencetak ekstra. Mari kita perkenalkan “beta” (angka positif tanpa batas atas) untuk membalikkan keadaan. Targetnya adalah meningkatkan kerugian kumulatif secara dramatis jika algoritme membuat prediksi pemetikan ceri yang salah. Algoritma dasar juga memiliki “beta”, yang sama dengan 1.

Beta-logloss memiliki rumus berikut:

Rumus untuk gradien dan hessian:


Kerugian kustom diimplementasikan dengan mengubah algoritme “beta” menjadi kurang dari 1 untuk menghukum FN atau lebih dari 1 untuk membuat FP lebih mahal. Kita harus menghitung ulang gradien dan hessian dengan “beta” baru, memaksa algo untuk mengubah kebijakan perhitungan kerugian.

Mari kode kerugian kustom

Saya menerapkan kode dalam scikit-learn API untuk XGboost dengan Python (versi 1.0.2). Kita dapat menggunakan fungsi kerugian kustom dalam paket peningkatan gradien (XGBoost, LightGBM, Catboost) atau paket pembelajaran mendalam seperti TensorFlow.

Ada empat fungsi yang ditentukan pengguna untuk membuat fungsi kehilangan kustom berfungsi. Yang pertama adalah menghitung turunan pertama dari fungsi logloss yang diubah (gradien), yang kedua adalah menghitung turunan kedua, yang ketiga untuk mendapatkan fungsi tujuan, dan yang keempat adalah menghitung metrik evaluasi yang diubah.

Selanjutnya yparameter berisi nilai kelas aktual, memprediksi nilai prediksi untuk dievaluasi.

https://medium.com/media/91946c198386fb956b86c97d6b54254d/href

Fungsi logreg_err_beta_sklearn menghitung logloss berdasarkan kumpulan data untuk penilaian. Ini memeriksa kinerja terhadap data yang tidak terlihat. Bahkan jika kita menerapkan sklearn API, fungsi yang ditentukan pengguna ini menerima argumen dmat, yang merupakan tipe data DMatrix (struktur data internal XGBoost).

Contoh berdasarkan kumpulan data Titanic

Kumpulan data titanic adalah kasus kumpulan data yang tidak seimbang di mana tingkat kelangsungan hidup hampir 38%.

Mari kita lewati langkah-langkah prapemrosesan yang dibuat sebelum pemodelan dan langsung ke tugas klasifikasi. Anda dapat menemukan keseluruhannya di repositori GitHub saya yang dirujuk di akhir artikel.

https://medium.com/media/f0181b5a1701b90febf353e177b2d9fa/href

Hasil dari algoritma dasar adalah matriks kebingungan berikut:

Gambar oleh penulis

Algoritma dasar memberikan 38 kasus FN. Mari kita asumsikan bahwa tujuan kita adalah mengurangi jumlah FN. Mari ubah fungsi objektif menjadi fungsi kustom, ubah metrik evaluasi yang sesuai, dan setel “beta” ke 0,4.

https://medium.com/media/b4113105435fe7bd5693f5af86666cce/href

Perubahan dari algoritme dasar adalah penonaktifan metrik evaluasi default, pengenalan eksplisit fungsi logloss kustom, dan metrik evaluasi masing-masing.

Matriks kebingungan untuk algoritma beta-logloss:

Gambar oleh penulis

Algoritma beta menurunkan kasus FN menjadi 25 (-34%), true positive (TP) meningkat menjadi 112 (+13%), FP bertambah menjadi 53 (+103%), true negative (TN) menurun menjadi 167 (-14% ). Penurunan FN mengarah pada peningkatan TP dan FP. Akurasi keseluruhan turun.

Kita dapat dengan mudah menerapkan logika yang sama untuk menghukum FP dengan memilih “beta” lebih tinggi dari 1.

Kesimpulan

Beta-logloss memiliki beberapa kelebihan dan kekurangan yang khas. Saya telah membuat daftar yang paling jelas.

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.

Jalan pintas

Kita harus menyetel “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 kami menghukum FN, itu sering menyebabkan pertumbuhan FP yang sangat besar dan sebaliknya. Anda mungkin memerlukan sumber daya tambahan untuk mengimbangi pertumbuhan itu.

Referensi

Ikhtisar biner lintas-entropi (logloss): https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181 Ikhtisar fungsi kerugian kustom untuk tugas regresi: https:// /towardsdatascience.com/custom-loss-functions-for-gradient-boosting-f79c1b40466d XGBoost dokumentasi terkait dengan fungsi kehilangan kustom: https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html Sumber fungsi Plot_confusion_matrix: https ://www.kaggle.com/grfiv4/plot-a-confusion-matrix Tautan ke repositori GitHub saya: https://github.com/kpluzhnikov/binary_classification_custom_loss

Outline a Smaller Class With the Custom Loss Function awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jeffrey Hayes