Cara menentukan kualitas classifier multiclass

30

Diberikan

  • dataset dengan instance xsaya bersama dengan kelas mana setiap instance persis milik satu kelasx i y iNxsayaysaya
  • classifier multiclass

Setelah pelatihan dan pengujian saya pada dasarnya memiliki tabel dengan benar kelas dan diprediksi kelas untuk setiap instance dalam tes set. Jadi untuk setiap contoh saya memiliki kecocokan ( ) atau miss ( ).ysayax i y i = a i y ia iSebuahsayaxsayayi=aiyiai

Bagaimana saya bisa mengevaluasi kualitas pertandingan? Masalahnya adalah bahwa beberapa kelas dapat memiliki banyak anggota, yaitu banyak instance miliknya. Jelas jika 50% dari semua poin data milik satu kelas dan klasifikasi akhir saya adalah 50% benar secara keseluruhan, saya tidak mendapatkan apa-apa. Saya bisa saja membuat classifier sepele yang menghasilkan kelas terbesar tidak peduli apa inputnya.

Apakah ada metode standar untuk memperkirakan kualitas classifier berdasarkan pengujian set hasil pertandingan dan hit yang diketahui untuk setiap kelas? Mungkin bahkan penting untuk membedakan tarif yang cocok untuk setiap kelas tertentu?

Pendekatan paling sederhana yang dapat saya pikirkan adalah dengan mengecualikan pasangan yang benar dari kelas terbesar. Apa lagi?

Gerenuk
sumber
Saya tidak yakin apakah saya memahami pertanyaan dengan benar. Apakah Anda tahu Matriks Kebingungan dan tindakan yang diturunkan ? Apakah ini jawaban untuk pertanyaan Anda? Atau apakah Anda merujuk pada sesuatu yang lebih rumit?
steffen
Saya pikir ini adalah sumber kebingungan saya: Pada paragraf pertama yang Anda sebutkan .. Di mana yi adalah kelas nyata dan ... : Apakah maksud Anda bahwa instance dapat menjadi milik / memiliki lebih dari satu kelas? Atau apakah setiap x i milik / memiliki tepat satu kelas? Bisakah Anda mengklarifikasi? xixi
steffen
@steffen: Saya telah melihat matriks kebingungan. Dalam kasus khusus saya, saya memiliki 4 kelas. Jadi saya tidak yakin tindakan turunan mana yang dapat digunakan dan akan masuk akal. Setiap hanya milik satu kelas. Namun ada lebih dari dua kemungkinan kelas secara keseluruhan i [ 1 , , N ] . xii[1,,N]
Gerenuk
@steffen Langkah-langkah yang diturunkan tersebut terutama berlaku untuk klasifikasi biner , sedangkan pertanyaan ini secara eksplisit berhubungan dengan lebih dari dua kelas. Ini kemudian membutuhkan pemahaman yang dimodifikasi dari istilah-istilah seperti "benar positif."
Michael McGowan
@MichaelMcGowan Saya telah meminta OP untuk klarifikasi dan kemudian melakukan edit untuk secara eksplisit mencerminkan masalah multiclass, yang tidak jelas sebelum diedit (IMHO).
steffen

Jawaban:

16

Seperti klasifikasi biner, Anda dapat menggunakan tingkat kesalahan empiris untuk memperkirakan kualitas classifier Anda. Biarkan menjadi classifier, dan x i dan y i menjadi contoh dalam basis data Anda dan kelasnya. e r r ( g ) = 1gxiyi Seperti yang Anda katakan, ketika kelas tidak seimbang, garis dasar tidak 50% tetapi proporsi kelas yang lebih besar. Anda bisa menambahkan bobot pada setiap kelas untuk menyeimbangkan kesalahan. BiarkanWymenjadi bobot kelasy. Atur bobot sedemikian rupa sehingga1

err(g)=1nsayan1g(xsaya)ysaya
Wyydan menentukankesalahan empiris tertimbangerrW(g)=11Wy1nin1yi=y
errW(g)=1ninWyi1g(xi)yi

Seperti yang dikatakan Steffen, matriks kebingungan bisa menjadi cara yang baik untuk memperkirakan kualitas classifier. Dalam kasus biner, Anda dapat memperoleh beberapa ukuran dari matriks ini seperti sensitivitas dan spesifisitas, memperkirakan kemampuan classifier untuk mendeteksi kelas tertentu. Sumber kesalahan pengklasifikasi mungkin dengan cara tertentu. Misalnya classifier bisa menjadi terlalu percaya diri ketika memprediksi 1, tetapi tidak pernah mengatakan salah ketika memprediksi 0. Banyak pengklasifikasi dapat ditentukan untuk mengendalikan tingkat ini (false positive vs false negative), dan Anda kemudian tertarik pada kualitas dari seluruh keluarga classifier, bukan hanya satu. Dari sini Anda dapat memplot kurva ROC , dan mengukur area di bawah kurva ROC memberi Anda kualitas pengklasifikasi tersebut.

Kurva ROC dapat diperpanjang untuk masalah multikelas Anda. Saya sarankan Anda untuk membaca jawaban utas ini .

Emile
sumber
1
Apakah tidak perlu membagi kesalahan empiris tertimbang dengan jumlah kelas, untuk berada pada skala yang sama dengan kesalahan empiris? Kalau tidak, akan jauh lebih besar ...
PhilippPro
17

Untuk mengevaluasi sistem klasifikasi teks multi-arah, saya menggunakan F1 mikro-dan makro-rata-rata (ukuran-F). Ukuran-F pada dasarnya adalah kombinasi dari presisi dan mengingatnya. Untuk klasifikasi biner, pendekatan mikro dan makro adalah sama, tetapi, untuk kasus multi-arah, saya pikir mereka dapat membantu Anda. Anda dapat menganggap Mikro F1 sebagai kombinasi presisi dan daya ingat berbobot yang memberikan bobot sama untuk setiap dokumen, sedangkan Makro F1 memberikan bobot yang sama untuk setiap kelas. Untuk masing-masing, persamaan ukuran-F adalah sama, tetapi Anda menghitung presisi dan mengingat berbeda:

F=(β2+1)PRβ2P+R,

β

Pmicro=i=1|C|TPii=1|C|TPi+FPi,Rmicro=i=1|C|TPii=1|C|TPi+FNi

Pmacro=1|C|i=1|C|TPiTPi+FPi,Rmacro=1|C|i=1|C|TPiTPi+FNi

TPFPFNC

Kyle.
sumber
1
# Function in R, using precision, recall and F statistics

check.model.accuracy <- function(predicted.class, actual.class){

  result.tbl <- as.data.frame(table(predicted.class,actual.class ) ) 

  result.tbl$Var1 <- as.character(result.tbl$predicted.class)
  result.tbl$Var2 <- as.character(result.tbl$actual.class)

  colnames(result.tbl)[1:2] <- c("Pred","Act")

  cntr <- 0  
  for (pred.class in unique(result.tbl$Pred) ){
    cntr <- cntr+ 1
    tp <- sum(result.tbl[result.tbl$Pred==pred.class & result.tbl$Act==pred.class, "Freq"])
    tp.fp <- sum(result.tbl[result.tbl$Pred == pred.class , "Freq" ])
    tp.fn <- sum(result.tbl[result.tbl$Act == pred.class , "Freq" ])
    presi <- tp/tp.fp 
    rec <- tp/tp.fn
    F.score <- 2*presi*rec/(presi+rec)
    if (cntr == 1 ) F.score.row <- cbind(pred.class, presi,rec,F.score)
    if (cntr > 1 ) F.score.row <- rbind(F.score.row,cbind(pred.class,presi,rec,F.score))
  }

  F.score.row <- as.data.frame(F.score.row) 
  return(F.score.row)
}

check.model.accuracy(predicted.df,actual.df) 
# For multiclass, average across all classes 
Ashish Markanday
sumber
5
Bisakah Anda menambahkan beberapa teks untuk menjelaskan hal ini?
gung - Reinstate Monica