Apa fungsi kerugian yang digunakan untuk kelas yang tidak seimbang (menggunakan PyTorch)?

17

Saya memiliki dataset dengan 3 kelas dengan item berikut:

  • Kelas 1: 900 elemen
  • Kelas 2: 15000 elemen
  • Kelas 3: 800 elemen

Saya perlu memprediksi kelas 1 dan kelas 3, yang menandakan penyimpangan penting dari norma. Kelas 2 adalah kasus "normal" default yang tidak saya pedulikan.

Fungsi kerugian apa yang akan saya gunakan di sini? Saya berpikir untuk menggunakan CrossEntropyLoss, tetapi karena ada ketidakseimbangan kelas, ini perlu ditimbang, saya kira? Bagaimana cara kerjanya dalam praktik? Suka ini (menggunakan PyTorch)?

summed = 900 + 15000 + 800
weight = torch.tensor([900, 15000, 800]) / summed
crit = nn.CrossEntropyLoss(weight=weight)

Atau haruskah beratnya dibalik? yaitu 1 / berat?

Apakah ini pendekatan yang tepat untuk memulai atau adakah metode lain / lebih baik yang bisa saya gunakan?

Terima kasih

Muppet
sumber

Jawaban:

13

Fungsi kerugian apa yang akan saya gunakan di sini?

Cross-entropy adalah fungsi kerugian untuk tugas klasifikasi, baik seimbang atau tidak seimbang. Ini adalah pilihan pertama saat belum ada preferensi yang dibangun dari pengetahuan domain.

Kurasa ini perlu ditimbang? Bagaimana cara kerjanya dalam praktik?

Iya. Bobot kelas adalah ukuran kelas terbesar dibagi dengan ukuran kelas .cc

Misalnya, jika kelas 1 memiliki 900, kelas 2 memiliki 15000, dan kelas 3 memiliki 800 sampel, maka bobotnya masing-masing adalah 16,67, 1,0, dan 18,75.

Anda juga dapat menggunakan kelas terkecil sebagai nominator, yang memberikan masing-masing 0,889, 0,053, dan 1,0. Ini hanya penskalaan ulang, bobot relatifnya sama.

Apakah ini pendekatan yang tepat untuk memulai atau adakah metode lain / lebih baik yang bisa saya gunakan?

Ya, ini pendekatan yang tepat.

EDIT :

Berkat @Muppet, kami juga dapat menggunakan pengambilan sampel kelas secara berlebihan, yang setara dengan menggunakan bobot kelas . Ini dilakukan WeightedRandomSamplerdi PyTorch, menggunakan bobot yang sama di atas.

Orang Esma
sumber
2
Saya hanya ingin menambahkan bahwa menggunakan WeightedRandomSampler dari PyTorch juga membantu, kalau-kalau ada orang lain yang melihat ini.
Muppet
0

Ketika Anda mengatakan: Anda juga dapat menggunakan kelas terkecil sebagai nominator, yang memberikan masing-masing 0,889, 0,053, dan 1,0. Ini hanya penskalaan ulang, bobot relatifnya sama.

Tetapi solusi ini bertentangan dengan yang pertama Anda berikan, bagaimana cara kerjanya?

Georges Matar
sumber