Saya tahu bahwa ada kemungkinan Keras dengan class_weights
kamus parameter yang pas, tapi saya tidak bisa menemukan contoh. Akankah seseorang dengan baik hati menyediakannya?
Ngomong-ngomong, dalam hal ini praksis yang tepat hanya untuk membebani kelas minoritas secara proporsional dengan perwakilannya yang kurang?
classification
keras
weighted-data
Hendrik
sumber
sumber
Jawaban:
Jika Anda berbicara tentang kasus biasa, di mana jaringan Anda hanya menghasilkan satu output, maka asumsi Anda sudah benar. Untuk memaksa algoritme Anda memperlakukan setiap instance dari kelas 1 sebagai 50 instance dari kelas 0, Anda harus:
Tetapkan kamus dengan label Anda dan bobotnya yang terkait
Beri makan kamus sebagai parameter:
EDIT: "memperlakukan setiap instance dari kelas 1 sebagai 50 instance dari kelas 0 " berarti bahwa dalam fungsi kerugian Anda, Anda memberikan nilai yang lebih tinggi untuk instance ini. Oleh karena itu, kerugian menjadi rata-rata tertimbang, di mana berat masing-masing sampel ditentukan oleh class_weight dan kelas yang sesuai.
Dari Keras docs: class_weight : Indeks kelas pemetaan kamus opsional (integer) ke nilai weight (float), digunakan untuk memberi bobot pada fungsi kerugian (hanya selama pelatihan).
sumber
Anda cukup menerapkan
class_weight
darisklearn
:Mari kita impor modulnya terlebih dahulu
Untuk menghitung bobot kelas, lakukan hal berikut
Ketiga dan terakhir menambahkannya ke model pas
Perhatian : Saya mengedit posting ini dan mengubah nama variabel dari class_weight menjadi class_weight s agar tidak menimpa modul yang diimpor. Sesuaikan sesuai saat menyalin kode dari komentar.
sumber
class_weight.compute_class_weight
menghasilkan array, saya perlu mengubahnya menjadi dict agar dapat bekerja dengan Keras. Lebih khusus lagi, setelah langkah 2, gunakanclass_weight_dict = dict(enumerate(class_weight))
y_train
adalah(300096, 3)
array numpy. Jadiclass_weight=
barisnya memberi saya TypeError: tipe yang tidak dapat ditembus: 'numpy.ndarray'y_ints = [y.argmax() for y in y_train]
.Saya menggunakan aturan semacam ini untuk
class_weight
:math.log
menghaluskan beban untuk kelas yang sangat tidak seimbang! Ini mengembalikan:sumber
n_total_samples / n_class_samples
untuk setiap kelas.CATATAN: Lihat komentar, jawaban ini sudah usang.
Untuk menimbang semua kelas secara merata, Anda sekarang dapat mengatur class_weight menjadi "otomatis" seperti:
sumber
class_weight='auto'
dalam dokumentasi Keras maupun dalam kode sumber. Bisakah Anda tunjukkan di mana Anda menemukan ini?class_weight
dan tidak akan berpengaruh apa pun. Karena itu jawaban ini tidak benar.class_weight baik-baik saja tetapi seperti yang dikatakan @Aokok ini tidak akan berhasil jika Anda adalah kelas multilabel enkode satu-panas. Dalam hal ini, gunakan sample_weight :
sample_weights digunakan untuk memberikan bobot untuk setiap sampel pelatihan . Itu berarti bahwa Anda harus lulus array 1D dengan jumlah elemen yang sama dengan sampel pelatihan Anda (menunjukkan bobot untuk masing-masing sampel).
class_weights digunakan untuk memberikan bobot atau bias untuk setiap kelas output . Ini berarti Anda harus memberikan bobot untuk setiap kelas yang Anda coba klasifikasikan.
sample_weight harus diberi array numpy, karena bentuknya akan dievaluasi.
Lihat juga jawaban ini: https://stackoverflow.com/questions/48315094/using-sample-weight-in-keras-for-afterence-labelling
sumber
Menambahkan ke solusi di https://github.com/keras-team/keras/issues/2115 . Jika Anda membutuhkan lebih dari pembobotan kelas di mana Anda ingin biaya yang berbeda untuk positif palsu dan negatif palsu. Dengan versi keras baru sekarang Anda hanya dapat mengesampingkan fungsi kerugian masing-masing seperti yang diberikan di bawah ini. Perhatikan bahwa itu
weights
adalah matriks persegi.sumber
Saya menemukan contoh pengkodean bobot kelas dalam fungsi kerugian menggunakan dataset minist. Lihat tautan di sini: https://github.com/keras-team/keras/issues/2115
sumber
Ini bekerja dengan generator atau standar. Kelas terbesar Anda akan memiliki bobot 1 sedangkan yang lain akan memiliki nilai lebih besar dari 1 relatif terhadap kelas terbesar.
bobot kelas menerima input jenis kamus
sumber