Scikit-learn: Dukungan untuk skor roc_auc multi-kelas

Dibuat pada 19 Jun 2014  ·  47Komentar  ·  Sumber: scikit-learn/scikit-learn

Permintaan fitur berprioritas rendah: dukungan untuk penghitungan skor roc_auc multi-kelas di sklearn.metrics menggunakan metodologi satu lawan semua akan sangat berguna.

New Feature

Komentar yang paling membantu

Dalam rata-rata mikro, true positive rate (TPR) Anda dihitung dengan mengambil jumlah semua TP dari semua kelas, dan membaginya dengan jumlah semua TP dan FN dari semua kelas, yaitu untuk masalah 3-kelas:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

Contoh matriks kebingungan:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
Lakukan hal yang sama untuk tingkat positif palsu dan Anda dapat menghitung AUC.

Rata-rata makro hanya menghitung TPR untuk setiap kelas secara terpisah dan meratakannya (ditimbang dengan jumlah contoh di kelas itu atau tidak):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

Dengan contoh yang sama:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

Mungkin ini membantu (ini menggunakan presisi, tetapi idenya sama):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Saya pribadi tidak akan pernah menggunakan rata-rata makro tidak berbobot, tetapi saya akan melihat apakah saya dapat menemukan makalah yang mempelajari ini.

Semua 47 komentar

Saya tidak yakin apa artinya itu. Apakah Anda memiliki referensi untuk itu?

Pada 19 Juni 2014 09:51, Madison May [email protected] menulis:

Permintaan fitur prioritas rendah: dukungan untuk skor roc_auc multi-kelas
perhitungan di sklearn.metrics menggunakan satu terhadap semua metodologi
akan sangat berguna.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298.

Berikut penjelasan yang cukup bagus, beserta referensi: https://www.cs.bris.ac.uk/~flach/ICML04tutorial/ROCtutorialPartIII.pdf

hmm, apa yang dimaksud dengan pencetak gol yang direkomendasikan sementara auc multi-kelas tidak diterapkan?

dukungan untuk perhitungan skor roc_auc multi-kelas di sklearn.metrics menggunakan satu terhadap semua metodologi akan sangat berguna

Apakah Anda berbicara tentang apa yang dianggap slide tersebut sebagai perkiraan volume di bawah permukaan di mana rata-rata tertimbang frekuensi AUC untuk setiap kelas diambil? Ini tampaknya identik dengan menggunakan roc_auc_score dengan representasi biner dan average='weighted' . ( @arjoly , mengapa skor berbasis kurva ini melarang multiclass?)

Jika tidak, slide tersebut, dan sebagian besar referensi yang dapat saya temukan untuk "ROC multi-kelas", fokus pada kalibrasi multi-kelas OvR, bukan pada metrik evaluasi. Apakah ini yang Anda minati? Saya tidak tahu seberapa luas teknik ini, apakah layak tersedia di scikit-learn, dan apakah optimasi serakah harus ditingkatkan.

( @arjoly , mengapa skor berbasis kurva ini melarang multiclass?)

Setiap kali satu kelas hilang dari y_true, skor tidak dapat dihitung. Saya tidak ingin menambahkan keajaiban untuk inferensi kelas dan membuat pengguna mendapat masalah.

Mungkin saja kita tidak menangani dengan tepat dalam kasus y_pred
memiliki label yang y_true tidak. Label itu mungkin tidak seharusnya
berpartisipasi dalam apa pun seperti rata-rata makro (sesuai dengan Weka,
juga), atau skor ROC.

Pada 1 Agustus 2014 17:08, Arnaud Joly [email protected] menulis:

( @arjoly https://github.com/arjoly, mengapa skor berbasis kurva ini
larang multikelas?)

Setiap kali satu kelas hilang dari y_true, tidak mungkin untuk menghitung
nilai. Saya tidak ingin menambahkan keajaiban untuk inferensi kelas dan mendapatkan
pengguna ke dalam masalah.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -50855460
.

@jnothman @arjoly ada banyak kemajuan di bidang rata-rata. Seberapa sulit untuk menerapkan ini sekarang?

itu mungkin mirip dengan fungsi R dari paket pROC
http://www.inside-r.org/packages/cran/pROC/docs/multiclass.roc

Hai, Saya menerapkan draf skor ROC/AUC rata-rata makro, tetapi saya tidak yakin apakah itu cocok untuk sklearn.

Berikut kodenya:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Mungkinkah sesederhana ini?

@fbrundu jika ini adalah arti standar. Ini tentu salah satu interpretasi yang mungkin.

Ada ringkasan yang bagus di sini:
http://people.inf.elte.hu/kiss/13dwhdm/roc.pdf

Paket pROC mengimplementasikan Hand and Till:
http://download.springer.com/static/pdf/398/art%253A10.1023%252FA%253A1010920819831.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1023%2FA% 3A1010920819831&token2=exp=1469743016 ~acl=%2Fstatic%2Fpdf%2F398%2Fart%25253A10.1023%25252FA%25253A1010920819831.pdf%3ForiginUrl%3Dhttp%253A%252F%252Flink%25210Farticle%A109325210F%A109325210Fartikel. *~hmac=bc68686d3782ac6af3c3cda13c1b36aad6de5d01d16a25870cace5fe9699fb8a

Versi Hand and Till tampaknya diterima secara umum dan saya memilih kami menerapkannya.
Ada juga versi Provost dan Domingos yang mungkin harus saya root karena Provost saat ini adalah direktur saya, tetapi itu belum berhasil.
Provost-Domingos adalah apa yang @fbrundu katakan hanya dengan average='weighted' .

TLDR: PR untuk Hand and Till welcome. Opsional Provost dan Domingos dengan opsi untuk mengubah rata-rata.

Hai, apakah sudah ada kemajuan dalam penerapan ini?
Apa yang saya lihat di sebagian besar perpustakaan lain (misalnya WEKA) adalah bahwa mereka menggunakan rata-rata tertimbang. Saya pikir inilah yang diusulkan oleh @fbrundu menggunakan average='micro' ?

@joaquinvanschoren R menggunakan Tangan dan Till. Saya lebih suka yang itu juga. Saya memiliki seorang siswa yang akan mengerjakan ini segera.

@amueller saya bisa mengerjakan ini :)

@kchen17 terima kasih!

Kami membahas ini di OpenML cukup banyak. Untuk AUC multikelas tidak ada jaminan bahwa satu pendekatan (rata-rata makro, rata-rata mikro, rata-rata tertimbang, ...) lebih baik dari yang lain. Di R Anda dapat menemukan setidaknya 5 pendekatan berbeda (semua juga tersedia di MLR sekarang).
Saat menerapkan ini di scikit-learn, akan sangat bagus jika setidaknya ada kemungkinan untuk memilih salah satu yang paling masuk akal untuk aplikasi Anda, bahkan jika Anda menggunakan Hand-Till sebagai default. Hand-Till adalah pendekatan non-tertimbang, tidak memperhitungkan ketidakseimbangan label.

Saya senang memiliki banyak versi. tidak berbobot dan "tidak memperhitungkan ketidakseimbangan label" adalah dua hal yang berbeda ;) Apakah Anda memiliki daftar dan referensi?

Apa yang dimaksud dengan mikro-rata-rata dalam kasus ini?

Perhatikan bahwa kami telah melakukan ROC AUC rata-rata mikro dan makro untuk masalah multikelas yang diimplementasikan dalam contoh ini:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass -settings

Sebenarnya, saya pikir dokumentasi itu tidak benar dan seharusnya mengatakan
banyak label...

Pada 26 September 2016 pukul 23:16, Olivier Grisel [email protected]
menulis:

Bukan berarti kami sudah melakukan ROC AUC rata-rata mikro dan makro untuk multikelas
masalah yang diterapkan dalam contoh ini:

http://scikit-learn.org/stable/auto_examples/model_
selection/plot_roc.html#multiclass-settings


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -249566346,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz65IeU7k2CFwyHxTTAjk-5orIxWe6ks5qt8WsgaJpZM4CFzud
.

Dalam rata-rata mikro, true positive rate (TPR) Anda dihitung dengan mengambil jumlah semua TP dari semua kelas, dan membaginya dengan jumlah semua TP dan FN dari semua kelas, yaitu untuk masalah 3-kelas:
TPR = (TP1+TP2+TP3)/(TP1+TP2+TP3+FN1+FN2+FN3)

Contoh matriks kebingungan:
[[1,2,3],
[4,5,6],
[7,8,9]]
TPR = (1+5+9)/(1+5+9+(2+3)+(4+6)+(7+8))
Lakukan hal yang sama untuk tingkat positif palsu dan Anda dapat menghitung AUC.

Rata-rata makro hanya menghitung TPR untuk setiap kelas secara terpisah dan meratakannya (ditimbang dengan jumlah contoh di kelas itu atau tidak):
TPR = (1/3)* (TP1/(TP1+FN1) + TP2/(TP2+FN2) + TP2/(TP2+FN2))

Dengan contoh yang sama:
TPR = (1/3)* (1/(1+(2+3)) + 5/(5+(4+6)) + 9/(9+(7+8)))

Mungkin ini membantu (ini menggunakan presisi, tetapi idenya sama):
http://stats.stackexchange.com/questions/156923/should-i-make-decisions-based-on-micro-averaged-or-macro-averaged-evaluation-mea

Saya pribadi tidak akan pernah menggunakan rata-rata makro tidak berbobot, tetapi saya akan melihat apakah saya dapat menemukan makalah yang mempelajari ini.

Hai! Saya dapat mulai melihat masalah ini minggu lalu, dan saya ingin memposting pembaruan cepat/beberapa pertanyaan, hanya untuk memastikan saya berada di jalur yang benar.

  • Sejauh ini: Saya memulai dengan implementasi fungsi multiclass_roc_auc_score yang akan, secara default, memiliki beberapa parameter average disetel ke Tidak Ada. Default ini akan menggunakan algoritma Hand-Till (seperti yang dibahas, ini tidak memperhitungkan ketidakseimbangan label).
  • Apakah metode akan menerima parameter yang sama dengan yang ada di roc_auc_score ?
  • Dan dari itu, perbedaannya adalah y_true dapat memiliki lebih dari 2 kelas label. Hand-Till akan melibatkan pencarian semua kemungkinan pasangan label, menghitung roc_auc_score untuk masing-masing pasangan ini, dan kemudian mengambil rata-ratanya.

Beri tahu saya koreksi/saran apa yang mungkin Anda miliki!

Biasanya, kita akan menghindari pembuatan fungsi lain jika penggunaan kembali roc_auc_score layak dilakukan. Saya pikir membiarkan default sebagai 'makro' dapat diterima.

Satu hal penting yang harus Anda pikirkan adalah cara menguji perubahan ini, termasuk mengubah sifat roc_auc_score di metrics/tests/test_common.py

ya kita harus memperbarui dokumen.

@joaquinvanschoren menariknya makalah itu tidak membahas makalah AUC multi-kelas yang disebutkan di atas, khususnya bukan makalah Fawcett dari 2005.... hm Saya kira itu adalah renormalisasi dari multi-kelas 1-vs-1?

jadi saat ini kami hanya memiliki multi-label, jadi kami ingin menambahkan multi-kelas dengan 1vs1 dan 1vsRest dan masing-masing memiliki varian berbobot dan tidak berbobot.
Saya tidak begitu mengerti bagaimana rata-rata sample dan micro bekerja untuk AUC :(

Jadi... Saya mengusulkan agar kita menambahkan parameter multi-class ke AUC dan itu bisa berupa ovo atau ovr , dan akan mempertimbangkan parameter pembobotan. Saya tidak yakin kami ingin mengizinkan sample dan micro karena itu tidak masuk akal bagi saya.

@arjoly jadi micro dan sample beroperasi pada baris daripada kolom dari matriks? Apakah ada makalah tentang itu? Saya tidak menemukan itu dalam literatur ROC.

Masalah dengan itu adalah bahwa untuk membuat ukuran tangan-sampai default kita harus melakukan rata-rata tertimbang OvO dan kita tidak bisa benar-benar mengubah opsi pembobotan. Jadi mungkin kita melakukan OVR secara default dan menjelaskan dalam narasi bahwa OvO dengan pembobotan juga merupakan pilihan yang baik dan menambah referensi?

Ringkasan makalah yang dikutip @joaquinvanschoren juga mengatakan bahwa semua versi AUC memberikan hasil yang hampir sama.

@amueller : Sempat membaca kembali komentar anda, dan saya agak bingung dengan bagian ini:

Masalah dengan itu adalah bahwa untuk membuat ukuran tangan-sampai default kita harus melakukan rata-rata tertimbang OvO dan kita tidak bisa benar-benar mengubah opsi pembobotan. Jadi mungkin kita melakukan OVR secara default dan menjelaskan dalam narasi bahwa OvO dengan pembobotan juga merupakan pilihan yang baik dan menambah referensi?

Saya akan memodifikasi roc_auc_score untuk memasukkan parameter multiclass=['ovo', 'ovr'] sesuai tanggapan Anda. Jika OvR adalah default ( roc_auc_score(y_true, y_score, multiclass="ovo" ... ) ), tetapi Hand & Till adalah OvO, apa yang harus saya lakukan untuk menangani bagian OvR dari implementasi? (yaitu jika saya mendeteksi bahwa y_true adalah multikelas, cukup ajukan kesalahan jika "ovr" tidak diterapkan dan instruksikan pengguna untuk meneruskan "ovo"?)

Maaf, saya mengharapkan Anda untuk mengimplementasikan ovo dan ovr ;) Saya pikir itu seharusnya cukup mudah.

@amueller : Dicatat dan itu akan dimasukkan juga! Juga ingin bertanya: apakah ada saran tentang cara mendeteksi perbedaan antara multiclass dan multilabel? Pada awalnya, saya hanya memeriksa dimensi y_score tetapi dengan sangat cepat menyadari bahwa ini tidak akan cukup. (yaitu hanya memeriksa bahwa labelnya hanya 0 dan 1?)

Multilabel berarti beberapa label diprediksi sekaligus: Anda mendapatkan
vektor prediksi per instance. Multiclass berarti Anda mendapatkan satu
prediksi tetapi prediksi itu dapat memiliki lebih dari dua nilai (bukan
biner).

Terkadang, orang memecahkan kasus multikelas dengan binerisasi output, karenanya
anda mendapatkan beberapa nilai biner per instance (maka multilabel) dan ini
sering menimbulkan kebingungan.
Pada Sabtu, 8 Oktober 2016 pukul 16:33, Kathy Chen [email protected] menulis:

@amueller https://github.com/amueller : Tercatat dan itu akan menjadi
tergabung juga! Juga ingin bertanya: apakah ada saran tentang cara
mendeteksi perbedaan antara multiclass dan multilabel? Pada awalnya, saya adalah
hanya memeriksa dimensi y_score tetapi sangat cepat menyadari ini
tidak akan cukup.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252427642,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/ABpQV7Mv0rHGEfrkYi5Xezz3PItyrLZ6ks5qx6mdgaJpZM4CFzud
.

Hai, saya harap type_of_target dapat menyelesaikan tujuan membedakan antara multi-label dan multi-class output. HTH

menggunakan type_of_target adalah ide yang bagus. Padahal dalam scikit-learn dimensi y sebenarnya menjadi indikator apakah kita ingin melakukan multi-label atau multi-target. Jika Anda menggabungkan output seperti yang disarankan @joaquinvanschoren, scikit-learn akan selalu mengasumsikan multi-label.

type_of_target baik-baik saja untuk membedakan antara y_trues, @amueller

Pada 9 Oktober 2016 pukul 05:18, Andreas Mueller [email protected]
menulis:

menggunakan type_of_target adalah ide yang bagus. Padahal di scikit-belajar itu
dimensi y sebenarnya adalah indikator apakah kita ingin melakukan
multi-label atau multi-target. Jika Anda binerisasi output sebagai
@joaquinvanschoren https://github.com/joaquinvanschoren disarankan
scikit-learn akan selalu menganggap multi-label.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298#issuecomment -252439908,
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AAEz6wa5fnE_LX3LLXbCoc0Z4hBbSAQ0ks5qx95rgaJpZM4CFzud
.

Hai semua, saya hanya ingin memberi tahu Anda bahwa saya telah mengajukan PR "permulaan". Saya tertarik untuk mendengar beberapa umpan balik tentang implementasi (misalnya saya yakin ada cara untuk memanfaatkan numpy/dll dengan cara yang lebih baik daripada yang saya lakukan sekarang), bersama dengan praktik terbaik untuk menambahkan tes baru, kata-kata dokumentasi, dll.

Terima kasih atas semua bantuannya selama ini!

Adakah kemajuan dalam menambahkan dukungan multikelas untuk AUC?

@joaquinvanschoren : mengerjakan revisi setelah tinjauan kode oleh @jnothman di #7663. Kemungkinan akan mengirimkan pembaruan lain pada minggu depan ketika saya sudah selesai dengan ujian tengah semester

Hai @kathyxchen , @jnothman ,

Ada update PR?

Hanya memeriksa untuk melihat apakah ada kemajuan dalam menambahkan dukungan multikelas untuk AUC?

kita kesulitan menentukan apa yang diterima dan berprinsip
formulasi ROC AUC untuk multiclass. Lihat
https://github.com/scikit-learn/scikit-learn/pull/7663#issuecomment -307566895
dan di bawah.

Jadi rekan-rekan. Apakah ada kemajuan dengan skor auc multiclass? Saya menemukan kode dokumentasi resmi yang sangat membingungkan dengan dataset iris. Karena metode ini menunjukkan bahwa model saya memprediksi angka acak dengan cukup baik.

Ini hampir selesai, kita perlu memutuskan detail API sebelum menggabungkan: https://github.com/scikit-learn/scikit-learn/pull/12789#discussion_r295693965

@trendsearcher bisakah Anda memberikan contoh? Sekarang digabung tetapi saya ingin melihat masalah yang Anda alami.

Senang untuk membantu. Bagaimana saya bisa memberikan contoh (memiliki banyak kode dan mungkin tidak?
intuitif)? Mungkin saya bisa menulisnya dalam teks biasa?

, 18 . 2019 . 00:35, Andreas Mueller [email protected] :

@trendsearcher https://github.com/trendsearcher dapatkah Anda memberikan
tolong contohnya? Sekarang digabung tetapi saya ingin melihat masalah Anda
berpengalaman.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/scikit-learn/scikit-learn/issues/3298?email_source=notifications&email_token=AKS7QOFYRQY7RZJBWUVVJSTP76GDFA5CNFSM4AQXHOO2YY3PNVWWK3TUL52HS4DFVREXG43VMWZW57
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AKS7QOFQ5LAIZ2ZBR4M4EATP76GDFANCNFSM4AQXHOOQ
.

Hai, Saya menerapkan draf skor ROC/AUC rata-rata makro, tetapi saya tidak yakin apakah itu cocok untuk sklearn.

Berikut kodenya:

from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelBinarizer

def multiclass_roc_auc_score(truth, pred, average="macro"):

    lb = LabelBinarizer()
    lb.fit(truth)

    truth = lb.transform(truth)
    pred = lb.transform(pred)

    return roc_auc_score(truth, pred, average=average)

Mungkinkah sesederhana ini?

@fbrundu Terima kasih telah berbagi! Saya mencoba kode Anda. Tetapi ketika saya memanggil fungsi ini, saya menemui masalah yang mengatakan "Data target multioutput tidak didukung dengan binarisasi label". Kemudian saya menghapus kode "pred=lb.transform(pred)" di fungsi. Namun, saya menemui masalah lain yaitu "Menemukan variabel input dengan jumlah sampel yang tidak konsisten: [198, 4284]".

Bolehkah saya bertanya apakah Anda dapat membantu saya menyelesaikan ini? Terima kasih!

@Junting-Wang

 I meet a problem saying "Multioutput target data is not supported with label binarization". 

anda harus menggunakan predict bukan predict_proba

@fbrundu apakah implementasi Anda benar? Saya menggunakannya dan berfungsi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat