Dengan kelas yang tidak seimbang, apakah saya harus menggunakan pengambilan sampel pada validasi / pengujian dataset saya?


13

Saya seorang pemula dalam pembelajaran mesin dan saya menghadapi situasi. Saya sedang mengerjakan masalah Penawaran Waktu Nyata, dengan dataset IPinYou dan saya mencoba melakukan prediksi klik.

Masalahnya adalah, seperti yang Anda ketahui, dataset sangat tidak seimbang: Sekitar 1.300 contoh negatif (non klik) untuk 1 contoh positif (klik).

Inilah yang saya lakukan:

  1. Muat data
  2. Membagi dataset menjadi 3 dataset: A = Pelatihan (60%) B = Memvalidasi (20%) C = Pengujian (20%)
  3. Untuk setiap dataset (A, B, C), lakukan kurang pengambilan sampel pada setiap kelas negatif untuk memiliki rasio 5 (5 contoh negatif untuk 1 contoh positif). Ini memberi saya 3 set data baru yang lebih seimbang: A 'B' C '

Kemudian saya melatih model saya dengan dataset A 'dan regresi logistik.

Pertanyaan saya adalah:

  1. Dataset mana yang harus saya gunakan untuk validasi? B atau B '?

  2. Dataset mana yang harus saya gunakan untuk pengujian? C atau C '

  3. Metrik mana yang paling relevan untuk mengevaluasi model saya? F1Score tampaknya merupakan metrik yang digunakan dengan baik. Tapi di sini karena kelas yang tidak seimbang (jika saya menggunakan dataset B dan C), presisi rendah (di bawah 0,20) dan F1Score sangat dipengaruhi oleh recall / presisi rendah. Apakah itu lebih akurat untuk menggunakan aucPR atau aucROC?

  4. Jika saya ingin memetakan kurva belajar, metrik mana yang harus saya gunakan? (mengetahui bahwa% error tidak relevan jika saya menggunakan dataset B 'untuk memvalidasi)

Terima kasih sebelumnya atas waktu Anda!

Salam.

Jawaban:


9

Pertanyaan bagus ... Berikut adalah beberapa jawaban spesifik untuk pertanyaan bernomor Anda:

1)Anda harus memvalidasi silang pada B bukan B`. Kalau tidak, Anda tidak akan tahu seberapa baik keseimbangan kelas Anda bekerja. Tidak ada salahnya untuk memvalidasi lintas pada B dan B` dan akan berguna berdasarkan jawaban ke 4 di bawah ini.

2) Anda harus menguji C dan C` berdasarkan 4 di bawah ini.

3)Saya akan tetap menggunakan F1 dan bisa berguna untuk menggunakan ROC-AUC dan ini memberikan pemeriksaan kewarasan yang baik. Keduanya cenderung bermanfaat dengan kelas yang tidak seimbang.

4)Ini menjadi sangat sulit. Masalah dengan ini adalah bahwa metode terbaik mengharuskan Anda menafsirkan kembali seperti apa kurva pembelajaran seharusnya atau menggunakan kedua set sampel ulang dan data asli.

Interpretasi klasik dari kurva belajar adalah:

  • Overfit - Garis tidak cukup menyatu;
  • Pakaian dalam - Garis menyatu tetapi dengan skor F1 terlalu rendah;
  • Just Right - Lines datang bersama dengan skor F1 yang masuk akal.

Sekarang, jika Anda berlatih pada A` dan menguji pada C, garis tidak akan pernah sepenuhnya datang bersama-sama. Jika Anda berlatih A` dan menguji C`, hasilnya tidak akan bermakna dalam konteks masalah asli. Jadi apa yang kamu lakukan?

Jawabannya adalah untuk berlatih pada A` dan menguji pada B`, tetapi juga menguji pada B. Dapatkan skor F1 untuk B` di mana Anda inginkan, lalu periksa skor F1 untuk B. Kemudian lakukan pengujian dan hasilkan kurva belajar untuk C. Kurva tidak akan pernah bersatu, tetapi Anda akan memiliki rasa bias yang dapat diterima ... itu perbedaan antara F1 (B) dan F1 (B`).

Sekarang, interpretasi baru dari kurva belajar Anda adalah:

  • Overfit - Garis tidak bersatu dan terpisah lebih jauh dari F1 (B`) -F1 (B);
  • Pakaian dalam - Garis tidak bersatu tetapi perbedaannya kurang dari F1 (B`) -F1 (B) dan skor F1 (C) berada di bawah F1 (B);
  • Tepat - Garis tidak bersatu tetapi perbedaannya kurang dari F1 (B`) -F1 (B) dengan skor F1 (C) mirip dengan F1 (B).

Umum : Saya dengan tegas menyarankan bahwa untuk kelas yang tidak seimbang, Anda pertama-tama mencoba menyesuaikan bobot kelas Anda dalam algoritme pembelajaran Anda alih-alih mengambil sampel terlalu rendah karena menghindari semua moral keras yang telah kami uraikan di atas. Sangat mudah di perpustakaan seperti scikit-belajar dan kode tangan cukup mudah dalam apa pun yang menggunakan fungsi sigmoid atau suara mayoritas.

Semoga ini membantu!


Terima kasih banyak @ AN605. Kamu baik sekali! Saya punya beberapa pertanyaan: Untuk 4) - Ketika Anda mengatakan "melatih pada A 'dan menguji pada B'", maksud Anda memvalidasi? - "menghasilkan kurva belajar untuk skor C" & "F1 (C) di bawah / mirip dengan F1 (B)". Saya pikir itu, untuk kurva pembelajaran, kami harus merencanakan metrik kesalahan untuk set pelatihan (A atau A 'di sini) dan metrik kesalahan hanya untuk set validasi (B atau B') saja. Bukankah Anda "memvalidasi" pada C di sini?
jmvllt

Tentang menggunakan "bobot kelas", koreksi saya jika saya salah (saya baru saja memeriksanya) tetapi, trik ini melibatkan "memodifikasi" fungsi biaya dengan menambahkan koefisien / bobot "k" di depan kelas tidak seimbang, kan? : 􏲏 Biaya (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) Seperti itu, algoritma harus mempertimbangkan kesalahan klasifikasi dari kelas positif sebagai yang lebih penting. Tetapi masalahnya adalah bahwa saya "harus" menggunakan Apache Spark & ​​MLlib untuk membangun semua model saya. Dan saya tidak yakin bahwa saya dapat dengan mudah memodifikasi fungsi biaya saya dengan percikan. waktu!
jmvllt

5

Untuk 1)dan 2), Anda mau

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Jadi untuk dataset tersebut, Anda tidak perlu menyeimbangkan kelas.

Anda juga dapat mencoba menggunakan bobot kelas alih-alih under / oversampling, karena ini akan menangani keputusan ini untuk Anda.

Untuk 3)Anda yang ingin mengoptimalkan menggunakan metrik apa pun yang akan Anda beri skor (jika ini adalah kompetisi). Tetapi jika itu bukan pertimbangan, semua model itu adalah pilihan yang bagus. F1 mungkin dipengaruhi oleh presisi rendah, tetapi Anda ingin itu ditangkap. Justru ketika model naif (seperti menebak kelas mayoritas) dapat skor baik oleh beberapa metrik yang skor seperti F1 relevan.

Adapun 4)tidak ada yang salah dengan menunjukkan metrik mana yang Anda optimalkan.


Hai @jamesmf, terima kasih atas jawaban kerennya. Untuk F1Score, masalah yang saya miliki adalah bahwa saya mungkin ingin lebih fokus pada menghilangkan False Positive lebih dari False Negative. Apakah benar untuk menambahkan "bobot" berbeda untuk FP dan FN dalam komputasi presisi dan recall?
jmvllt

Itu masuk akal bagi saya. Juga deskripsi Anda tentang pembobotan kelas sudah benar, dan saya tidak melihatnya diimplementasikan dalam MLib, tetapi mungkin layak untuk permintaan fitur
jamesmf

Oke terima kasih james! Saat ini saya mencoba melakukannya sendiri dengan memperluas kelas LogisticGradient dan menimpa metode komputasi. Saya akan memberi tahu Anda jika ini memberi saya hasil yang baik. Semoga harimu menyenangkan.
jmvllt

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.