Bagaimana cara menghitung presisi / recall untuk klasifikasi multiclass-multilabel?

72

Saya bertanya-tanya bagaimana cara menghitung pengukuran presisi dan penarikan untuk klasifikasi multilabel multilabel, yaitu klasifikasi di mana terdapat lebih dari dua label, dan di mana setiap instance dapat memiliki beberapa label?

Vam
sumber
1
bagian multilabel membuatnya lebih sulit dan saya juga tertarik pada ini. Saya pikir itu tidak berlaku untuk masalah multilabel tapi jangan percaya sama sekali.
user798719
1
Faktanya, semua masalah multilabel adalah multiclass, sehingga Anda dapat menggunakan paket utiml di R misalnya atau Mulan di Jawa.
Adriano Rivolli

Jawaban:

19

Alat lain yang populer untuk mengukur kinerja classifier adalah ROC / AUC ; yang satu ini juga memiliki ekstensi multi-kelas / multi-label: lihat [Hand 2001]

[Hand 2001]: Generalisasi sederhana dari area di bawah kurva ROC ke berbagai masalah klasifikasi kelas

oDDsKooL
sumber
Ini populer, tetapi bisa buggy. Saya tidak sepenuhnya mempercayainya. stats.stackexchange.com/questions/93901/…
EngrStudent
3
Jangan pernah mengubah stack overflow! Guy mengajukan masalah, jawaban yang paling banyak dipilih tidak benar-benar menjawab pertanyaannya, tetapi menunjukkan beberapa alat / perpustakaan lain yang akan lebih baik
ragvri
Ya, bagaimana jawaban ini memiliki +20? Bahkan tidak mengandung kata-kata yang presisi dan ingat.
Simon Dirmeier
jika Anda berpikir secara menyeluruh, Anda akan menyadari bahwa ketepatan dan daya ingat sebenarnya ditangkap oleh AUC.
oDDsKooL
16

Berikut adalah beberapa diskusi tentang topik forum coursera tentang matriks kebingungan dan pengukuran presisi / recall multi-kelas.

Ide dasarnya adalah untuk menghitung semua presisi dan memanggil kembali semua kelas, kemudian rata-rata mereka untuk mendapatkan pengukuran bilangan real tunggal.

Matriks kebingungan memudahkan untuk menghitung presisi dan penarikan kembali suatu kelas.

Di bawah ini adalah beberapa penjelasan dasar tentang matriks kebingungan, disalin dari utas itu:

Matriks kebingungan adalah cara untuk mengklasifikasikan positif sejati, negatif sejati, positif palsu, dan negatif palsu, ketika ada lebih dari 2 kelas. Ini digunakan untuk menghitung presisi dan daya ingat dan karenanya skor f1 untuk masalah multi-kelas.

Nilai aktual diwakili oleh kolom. Nilai prediksi diwakili oleh baris.

Contoh:

10 contoh pelatihan yang sebenarnya 8, diklasifikasikan (diperkirakan) salah sebagai 5
13 contoh pelatihan yang sebenarnya 4, diklasifikasikan salah 9

Matriks Kebingungan

cm =
     0 1 2 3 4 5 6 7 8 9 10
     1 298 2 1 0 1 1 3 1 1 0
     2 0 293 7 4 1 0 5 2 0 0
     3 1 3 263 0 8 0 0 3 0 2
     4 1 5 0 261 4 0 3 2 0 1
     5 0 0 10 0 254 3 0 10 2 1
     6 0 4 1 1 4 300 0 1 0 0
     7 1 3 2 0 0 0 264 0 7 1
     8 3 5 3 1 7 1 0 289 1 0
     9 0 1 3 13 1 0 11 1 289 0
    10 0 6 0 1 6 1 2 1 4 304

Untuk kelas x:

  • Benar positif: posisi diagonal, cm (x, x).

  • False positive: jumlah kolom x (tanpa diagonal utama), jumlah (cm (:, x)) - cm (x, x).

  • False negative: jumlah baris x (tanpa diagonal utama), jumlah (cm (x, :), 2) -cm (x, x).

Anda dapat menghitung ketepatan, mengingat dan skor F1 mengikuti rumus kursus.

Rata-rata semua kelas (dengan atau tanpa bobot) memberikan nilai untuk seluruh model.

Bob Yang
sumber
2
Anda memiliki kapak Anda terbalik. Berdasarkan apa yang Anda tulis, CM Anda harus diubah.
Spacey
@Tarantula Mengapa menurut Anda begitu? Saya pikir dia benar.
shahensha
@shahensha Cobalah untuk satu kolom, itu salah.
Spacey
1
Tautan ke utas Coursera rusak
shark8me
8
Saya tidak percaya bahwa jawaban ini menangani masalah multilabel. itu berlaku untuk masalah multi-kelas. Apa pengertian tentang false positive atau false negative dalam masalah multilabel?
user798719
13

Untuk klasifikasi multi-label Anda memiliki dua cara untuk pergi Pertama pertimbangkan yang berikut ini.

  • n
  • Yiith
  • xiith
  • h(xi)ith

Berbasis contoh

Metrik dihitung dengan cara per titik data. Untuk setiap label yang diprediksi, hanya skornya yang dihitung, dan kemudian skor ini dikumpulkan di semua titik data.

  • 1ni=1n|Yih(xi)||h(xi)|
  • 1ni=1n|Yih(xi)||Yi|

Ada metrik lain juga.

Berbasis label

Di sini hal-hal dilakukan label-bijaksana. Untuk setiap label, metrik (mis. Presisi, penarikan kembali) dihitung dan kemudian metrik bijaksana-label ini dikumpulkan. Oleh karena itu, dalam hal ini Anda akhirnya menghitung presisi / recall untuk setiap label di seluruh dataset, seperti yang Anda lakukan untuk klasifikasi biner (karena masing-masing label memiliki tugas biner), kemudian menggabungkannya.

Cara mudah adalah mempresentasikan bentuk umum.

Ini hanyalah perpanjangan dari standar multi-kelas yang setara.

  • 1qj=1qB(TPj,FPj,TNj,FNj)

  • B(j=1qTPj,j=1qFPj,j=1qTNj,j=1qFNj)

TPj,FPj,TNj,FNjjth

B

Anda mungkin tertarik untuk melihat ke dalam kode untuk metrik mult-label di sini , yang merupakan bagian dari paket mldr di R . Anda juga mungkin tertarik untuk melihat perpustakaan multi-label Java MULAN .

Ini adalah makalah yang bagus untuk masuk ke metrik yang berbeda: Tinjauan tentang Algoritma Pembelajaran Multi-Label

phoxis
sumber
Akan lebih baik jika Anda bisa memberikan referensi mengenai keaslian metrik yang telah Anda tulis seperti beberapa referensi wikipedia. Referensi yang telah Anda sebutkan adalah bagian pengkodean dari metrik atau makalah penelitian ..
hacker315
2
Makalah ulasan sudah ditautkan di akhir jawaban (Tinjauan tentang Algoritma Pembelajaran Multi-Label) ieeexplore.ieee.org/document/6471714 . Ini adalah metrik yang terkenal dalam literatur berdasarkan implementasi yang dilakukan. Saya tidak yakin bagaimana saya dapat menunjukkan keaslian.
phoxis
8

Saya tidak tahu tentang bagian multi-label tetapi untuk klasifikasi kelas mutli tautan itu akan membantu Anda

Tautan ini menjelaskan cara membuat matriks kebingungan yang dapat Anda gunakan untuk menghitung presisi dan penarikan kembali untuk setiap kategori

Dan tautan ini menjelaskan cara menghitung ukuran micro-f1 dan macro-f1 untuk mengevaluasi pengklasifikasi secara keseluruhan.

Semoga bermanfaat.

Ahmed Kotb
sumber
4
Poin kuncinya adalah: ada beberapa cara yang mungkin valid untuk menghitung metrik ini (misalnya, mikro-F1 vs makro-F1) karena ada beberapa cara untuk menentukan apa yang benar. Ini tergantung pada aplikasi dan kriteria validitas Anda.
Jack Tanner
Ahmed: Terima kasih atas tautannya! @JackTanner Apakah Anda mungkin memiliki referensi untuk ini (untuk klasifikasi multi-label multi-kelas)?
Vam
1
@ MaVe, maaf, tidak ada tautan. Ini hanya dari pengalaman pribadi. Anda akan sampai di sana hanya dengan memikirkan apa yang merupakan, katakanlah, positif sejati dan positif palsu untuk tujuan Anda.
Jack Tanner
4
Tautan pertama mati
Nikana Reklawyks
1

tautan ini membantu saya .. https://www.youtube.com/watch?v=HBi-P5j0Kec saya berharap ini akan membantu Anda juga

katakan distribusinya seperti di bawah ini

    A   B   C   D
A   100 80  10  10
B   0    9   0   1
C   0    1   8   1
D   0    1   0   9

presisi untuk A akan menjadi

P (A) = 100/100 + 0 + 0 +0 = 100

P (B) = 9/9 + 80 + 1 + 1 = 9/91 psst ... pada dasarnya mengambil nilai positif sebenarnya dari kelas dan membaginya dengan data kolom di seluruh baris

ingat untuk menjadi

R (A) = 100 / 100+ 80 + 10 + 10 = 0,5

R (B) = 9/9+ 0 + 0 + 1 = 0,9

psst ... pada dasarnya mengambil true positive class dan membaginya dengan data baris lintas kolom

setelah Anda mendapatkan semua nilai, ambil rata-rata makro

rata-rata (P) = P (A) + P (B) + P (C) + P (D) / 4

rata-rata (R) = R (A) + R (B) + R (C) + R (D) / 4

F1 = 2 * rata-rata (P) * rata-rata (R) / rata-rata (P) + rata-rata (R)

pengguna1906450
sumber
0

Lihatlah slide-slide ini dari cs205.org di Harvard . Setelah Anda sampai ke bagian tentang Tindakan Kesalahan, ada diskusi tentang presisi dan penarikan kembali dalam pengaturan multi-kelas (misalnya, satu-vs-semua atau satu-vs-satu) dan matriks kebingungan. Matriks kebingungan adalah apa yang benar-benar Anda inginkan di sini.

FYI, dalam paket perangkat lunak Python scikits.learn , ada metode bawaan untuk secara otomatis menghitung hal-hal seperti matriks kebingungan dari pengklasifikasi yang dilatih tentang data multi-kelas. Ini mungkin dapat secara langsung menghitung plot penarikan kembali presisi untuk Anda juga. Layak dilihat.

Ely
sumber
4
Sayangnya tautan ke slide sudah mati dan saya bisa menemukan slide di tempat lain.
f3lix
Itu akan mengisi ketika mereka sampai ke kuliah di kursus tahun ini. Jika saya dapat menyalin PDF ke lokasi tautan permanen, saya akan melakukannya, tetapi saya tidak bisa, jadi memecahnya secara berkala tidak dapat dihindari dan tidak akan ada tempat lain untuk menemukan catatan, mereka khusus untuk kursus itu.
ely
sklearn tidak mendukung multi-label untuk matrix kebingungan github.com/scikit-learn/scikit-learn/issues/3452
Franck Dernoncourt
0

Dari Ozgur et al (2005) adalah mungkin untuk melihat bahwa Anda harus menghitung Precision dan Recall mengikuti ekspresi normal, tetapi alih-alih rata-rata atas jumlah N total dalam dataset Anda, Anda harus menggunakan N = [instance dengan setidaknya satu label dengan kelas yang dimaksud ditugaskan untuk].

di sini adalah referensi yang disebutkan: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf

MachLearn
sumber
0

Persis seperti cara Anda melakukannya pada umumnya, dengan set:

http://en.wikipedia.org/wiki/F1_score

http://en.wikipedia.org/wiki/Precision_and_recall

Berikut adalah fungsi Python sederhana yang melakukan hal itu:

def precision(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1


def recall(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    return len(i) / len(y_true)


def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    if p + r == 0:
        return 0
    else:
        return 2 * (p * r) / (p + r)


if __name__ == '__main__':
    print(f1(['A', 'B', 'C'], ['A', 'B']))
Adel Nizamutdinov
sumber