Mengukur akurasi model berbasis regresi logistik


26

Saya memiliki model regresi logistik terlatih yang saya terapkan pada set data pengujian. Variabel dependen adalah biner (boolean). Untuk setiap sampel dalam set data pengujian, saya menerapkan model regresi logistik untuk menghasilkan probabilitas% bahwa variabel dependen akan benar. Lalu saya mencatat apakah nilai acutal itu benar atau salah. Saya mencoba menghitung angka atau Adjusted seperti dalam model regresi linier.R2R2

Ini memberi saya catatan untuk setiap sampel dalam set pengujian seperti:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Saya bertanya-tanya bagaimana cara menguji keakuratan model. Upaya pertama saya adalah menggunakan tabel kontingensi dan mengatakan "jika prob_value_is_true> 0,80, tebak bahwa nilai sebenarnya adalah benar" dan kemudian mengukur rasio klasifikasi benar ke salah. Tapi saya tidak suka itu, karena rasanya lebih seperti saya hanya mengevaluasi 0,80 sebagai batas, bukan keakuratan model secara keseluruhan dan pada semua prob_value_is_truenilai.

Kemudian saya mencoba untuk hanya melihat setiap nilai diskrit prob_value_is_true, sebagai contoh, melihat semua sampel di mana prob_value_is_true= 0,34 dan mengukur% dari sampel di mana nilai acutal benar (dalam hal ini, akurasi sempurna akan menjadi jika% sampel sampel itu benar = 34%). Saya mungkin membuat skor akurasi model dengan menjumlahkan perbedaan pada setiap nilai diskrit prob_value_is_true. Tetapi ukuran sampel menjadi perhatian besar di sini, terutama untuk ekstrem (mendekati 0% atau 100%), sehingga rata-rata nilai acutal tidak akurat, sehingga menggunakannya untuk mengukur akurasi model tampaknya tidak tepat.

Saya bahkan mencoba membuat rentang besar untuk memastikan ukuran sampel yang cukup (0-.25, .25-.50, .50-.75, .75-1.0), tetapi bagaimana mengukur "kebaikan" dari% nilai aktual itu membuat saya bingung . Katakan semua sampel yang prob_value_is_trueberada di antara 0,25 dan 0,50 memiliki rata-rata acutal_value0,45. Apakah itu bagus karena berada dalam jangkauan? Buruk karena tidak dekat 37,5% (pusat kisaran)?

Jadi saya terjebak pada apa yang tampaknya menjadi pertanyaan yang mudah, dan berharap seseorang dapat mengarahkan saya ke sumber daya atau metode untuk menghitung akurasi yang stabil untuk model regresi logistik.


Saya pikir contoh rentang: (0-.25, .25-.50, .50-.75, .75-1.0) masuk akal. Apakah akan membantu jika Anda mempersempit rentang? Seperti: 0-.03, .03-.06, .06-.09, ..... yaitu setiap 0,03. Ini mungkin berguna untuk daerah dengan banyak titik data.
mac

Jawaban:


18

Ukuran yang sering digunakan untuk memvalidasi regresi logistik, adalah AUC dari kurva ROC (plot sensitivitas terhadap 1-spesifisitas - hanya google untuk istilah jika diperlukan). Ini, pada dasarnya, mengevaluasi seluruh rentang nilai ambang batas.

Pada sisi negatifnya: mengevaluasi seluruh rentang nilai ambang batas mungkin bukan yang Anda kejar, karena ini (biasanya) mencakup ambang batas yang menghasilkan sangat banyak negatif palsu atau positif palsu. Ada versi AUC yang menjelaskan hal ini (AUC parsial), jadi jika itu merupakan masalah bagi Anda, Anda dapat memeriksanya.


1
Mengesampingkan AUC sejenak, apakah saya benar dengan asumsi konstruksi Kurva ROC adalah sesuatu seperti ini? Untuk setiap nilai diskrit dari prob_value_is_true, buat satu tabel kontingensi dengan menggunakan nilai diskrit sebagai ambang. Kemudian catat Tingkat Positif Sejati dan Tingkat Positif Palsu dari setiap tabel kontingensi. Plot tarif untuk semua tabel kontingensi pada sebar scatter dan Anda akan melihat kurva ROC? Apakah itu benar?
John Reed

Saya mengumpulkan beberapa kode untuk melakukan ini, hanya memberi makan nilai acak sebagai probabilitas dan nilai aktual, dan itu adalah garis lurus. Saya berasumsi AUC mengukur penyimpangan "kurva" dari model yang dipasang terhadap "garis" atau keacakan?
John Reed

Mengenai ROC: ya, itu benar. Ada beberapa varian (lebih atau kurang dihaluskan; dengan mempertimbangkan probabilitas yang diprediksi untuk ambang pilihan Anda atau tidak). Perhatikan bahwa (tergantung pada perangkat lunak yang Anda gunakan / bahasa pilihan) ada banyak sekali alat di luar sana yang sudah menyediakan ini. Wrt AUC: tidak lebih atau kurang dari area aktual di bawah kurva ROC. Bukan dengan prediktor acak sempurna, kurva ROC akan menjadi garis lurus dari (0,0) ke (1,1), menghasilkan AUC 0,5. AUC memiliki beberapa interpretasi yang bagus, (lihat Google atau Wikipedia :-))
Nick Sabbe

8

clowessval.probrmsrms akan melakukan hal yang sama untuk validasi internal, menggunakan resampling untuk menghilangkan efek overfitting.


6

xx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xvariabel, seperti yang Anda sarankan. Ini tidak sepenuhnya valid, karena akan tergantung pada pilihan tempat sampah, dapat berguna sebagai cara menjelajahi model Anda.

Secara umum, tugas yang Anda berikan sendiri di sini sulit. Itu karena, dengan regresi logistik, Anda berurusan dengan dua hal yang berbeda. Prediksi model adalah variabel laten, sedangkan variabel respons yang Anda amati (walaupun mungkin dihasilkan oleh variabel laten) tidak. Tentu saja, orang akan sering ingin tahu apa tanggapan yang diprediksi, dan itu benar-benar masuk akal; ini hanyalah salah satu kasus di mana kehidupan tidak adil.

y=1y^.5y=1y^hal(y=1)y^=.31y1<.5

(0,1)R2R2c


Jawaban bagus! Jadi dalam contoh bahwa 30% dari semua kasus adalah 1, probabilitas prediksi 0,31 dari kasus tertentu seperti "peringkat" dari kasus ini relatif terhadap kasus-kasus lain pada seberapa dekat itu dengan 1 (semakin besar semakin dekat)? Dan itu tidak boleh dilihat sebagai probabilitas yang diprediksi bahwa kasus khusus ini adalah 1?
mac

1
y^saya=.311.31.31.25

3

Saya pikir Anda bisa menetapkan ambang (katakanlah 0,5), jadi ketika probabilitas Anda sama dengan atau lebih besar dari ambang itu, kelas prediksi Anda akan menjadi 1, dan 0 sebaliknya. Kemudian, Anda bisa mendapatkan ukuran akurasi Anda dengan cara ini:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Mengingat bahwa probabilitas Anda adalah probabilitas untuk memberikan data Anda (x) dan menggunakan model Anda nilai kelas Anda (y) sama dengan 1, saya tidak mengerti mengapa Anda selalu mendapatkan nilai probabilitas lebih rendah dari 0,5. Berapa frekuensi kelas Anda yang sebenarnya (actual_value)?


2

Anda mungkin ingin melihat paket saya softclassval(di softclassval.r-forge.r-project.org Anda juga menemukan dua presentasi lisan yang saya berikan tentang ide-ide di balik paket tersebut).

Saya menulisnya untuk masalah yang sedikit berbeda, yaitu jika referensi (misalnya patolog) "menolak" untuk memberikan kelas yang jelas. Namun, Anda dapat menggunakannya dengan kelas keras "normal" dan itu menghindari definisi ambang batas untuk pengerasan prediksi kontinu awalnya - jadi Anda tidak mengevaluasi 0,8.

Namun, saya merekomendasikan untuk menggunakannya bersamaan dengan, katakanlah, ROC atau diagram spesifisitas-sensitivitas: hasilnya akan sering terlihat sangat buruk karena metode "saya" akan menghukum penyimpangan yang sudah sedikit (misalnya 0,9 bukannya 1 memberikan 0,1 perbedaan untuk tindakan saya. , tetapi semua ambang di bawah 0,9 akan mengabaikan ini). Sebenarnya saya pikir ini lebih menguntungkan: kurangnya penyimpangan kecil terhadap sensitivitas ini adalah salah satu poin utama dari kritik dengan langkah-langkah "keras" seperti akurasi, sensitivitas, daya ingat, dll.

Selain itu, dengan membandingkan mean absolute error (MAE) dan root mean squared error RMSE, Anda dapat mengetahui apakah Anda memiliki banyak penyimpangan kecil atau lebih sedikit sampel yang salah penilaian.


1

Prsaya=sayanvlHaigsayat(Sebuah+bxsaya)

y.rehal[saya]BernHaikamullsaya(hal[saya])

Kemudian, jalankan simulasi ini, katakanlah, 100 kali. Anda akan memiliki matriks dengan n baris (n adalah jumlah subjek) dan kolom k (dalam hal ini, k = 100, jumlah simulasi). Dalam kode r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Sekarang Anda menghitung perbedaan antara prediksi dalam setiap simulasi dan yang diamati. Setelah menghitung perbedaan ini, hitung saja nilai rata-rata true-positive dan false-positive untuk setiap baris (setiap subjek) dan plot histogram. Atau hitung keduanya untuk setiap kolom (simulasi) dan plot histogram (saya lebih suka ini).

Semoga ini bisa membantu ...


1

Ada banyak cara untuk memperkirakan keakuratan prediksi tersebut dan pilihan optimal sangat tergantung pada apa yang akan diestimasikan.

Misalnya, jika Anda berencana untuk memilih beberapa hit skor tinggi untuk studi tindak lanjut yang mahal, Anda mungkin ingin memaksimalkan presisi pada skor tinggi. Di sisi lain, jika studi tindak lanjut murah, Anda mungkin ingin memaksimalkan daya ingat (sensitivitas) pada skor yang lebih rendah. ROC AUC mungkin cocok jika Anda membandingkan metode yang berbeda, dll.

Pada sisi praktis, R's ROCRpaket berisi 2 fungsi yang berguna

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Bersama-sama, fungsi-fungsi ini dapat menghitung berbagai ukuran akurasi, termasuk nilai skalar global (seperti "auc" ) dan vektor yang bergantung pada skor untuk memplot Kurva presisi-ingat dan ROC ( "prec" , "rec" , "tpr" dan "fpr" , dll.)


1

Anda perlu mendefinisikan apa yang Anda maksud dengan "akurasi". Apa yang ingin Anda ketahui, maafkan saya karena memasukkan kata-kata ke mulut Anda, adalah seberapa baik model Anda sesuai dengan data pelatihan, dan yang lebih penting, seberapa baik model ini "menggeneralisasi" untuk sampel yang tidak ada dalam data pelatihan Anda. Meskipun kurva ROC dapat berguna dalam menganalisis tradeoff antara presisi dan recall untuk berbagai nilai ambang, saya sarankan menambahkan mean-squared-error, atau skor Brier ke kotak peralatan Anda. Sangat mudah untuk dihitung, dan Anda dapat segera merasakan apakah perubahan fitur mempengaruhi kesesuaian model, ketika diterapkan pada data pelatihan. Karena pakaian dalam dimungkinkan dalam hal ini, pekerjaan Anda tidak selesai di sini. Untuk mengevaluasi kinerja generalisasi, atau seberapa baik Anda lakukan pada data yang belum Anda lihat, itu bukan t cukup untuk melihat kinerja Anda pada sampel pelatihan. Tentu saja model Anda bagus dalam hal itu, karena mereka nilai-nilai yang Anda gunakan untuk menentukan koefisien untuk logistik Anda. Anda perlu menyisihkan beberapa sampel untuk data uji. Kinerja MSE Anda pada set ini harus menetapkan ekspektasi generalisasi Anda sesuai dengan ketimpangan Hoeffding. Kesalahan generalisasi maksimum Anda akan tergantung pada jumlah fitur dalam model Anda serta jumlah sampel yang digunakan untuk menghitung statistik pengujian. Ingatlah bahwa Anda perlu mencuri beberapa sampel pelatihan untuk sampel uji. Saya merekomendasikan 10 kali lipat validasi silang, di mana Anda mengocok, pilih 90% untuk pelatihan, 10% untuk pengujian, lalu ukur, ulangi, lalu rata-rata semua pengukuran. karena mereka nilai yang Anda gunakan untuk menentukan koefisien untuk logistik Anda. Anda perlu menyisihkan beberapa sampel untuk data uji. Kinerja MSE Anda pada set ini harus menetapkan ekspektasi generalisasi Anda sesuai dengan ketimpangan Hoeffding. Kesalahan generalisasi maksimum Anda akan tergantung pada jumlah fitur dalam model Anda serta jumlah sampel yang digunakan untuk menghitung statistik pengujian. Ingatlah bahwa Anda perlu mencuri beberapa sampel pelatihan untuk sampel uji. Saya merekomendasikan 10 kali lipat validasi silang, di mana Anda mengocok, pilih 90% untuk pelatihan, 10% untuk pengujian, lalu ukur, ulangi, lalu rata-rata semua pengukuran. karena mereka nilai yang Anda gunakan untuk menentukan koefisien untuk logistik Anda. Anda perlu menyisihkan beberapa sampel untuk data uji. Kinerja MSE Anda pada set ini harus menetapkan ekspektasi generalisasi Anda sesuai dengan ketimpangan Hoeffding. Kesalahan generalisasi maksimum Anda akan tergantung pada jumlah fitur dalam model Anda serta jumlah sampel yang digunakan untuk menghitung statistik pengujian. Ingatlah bahwa Anda perlu mencuri beberapa sampel pelatihan untuk sampel uji. Saya merekomendasikan 10 kali lipat validasi silang, di mana Anda mengocok, pilih 90% untuk pelatihan, 10% untuk pengujian, lalu ukur, ulangi, lalu rata-rata semua pengukuran. Kinerja MSE Anda pada set ini harus menetapkan ekspektasi generalisasi Anda sesuai dengan ketimpangan Hoeffding. Kesalahan generalisasi maksimum Anda akan tergantung pada jumlah fitur dalam model Anda serta jumlah sampel yang digunakan untuk menghitung statistik pengujian. Ingatlah bahwa Anda perlu mencuri beberapa sampel pelatihan untuk sampel uji. Saya merekomendasikan 10 kali lipat validasi silang, di mana Anda mengocok, pilih 90% untuk pelatihan, 10% untuk pengujian, lalu ukur, ulangi, lalu rata-rata semua pengukuran. Kinerja MSE Anda pada set ini harus menetapkan ekspektasi generalisasi Anda sesuai dengan ketimpangan Hoeffding. Kesalahan generalisasi maksimum Anda akan tergantung pada jumlah fitur dalam model Anda serta jumlah sampel yang digunakan untuk menghitung statistik pengujian. Ingatlah bahwa Anda perlu mencuri beberapa sampel pelatihan untuk sampel uji. Saya merekomendasikan 10 kali lipat validasi silang, di mana Anda mengocok, pilih 90% untuk pelatihan, 10% untuk pengujian, lalu ukur, ulangi, lalu rata-rata semua pengukuran.


1

0-log(1-hal^)01-log(hal^)1

Ini tidak menderita dari ambang batas yang sewenang-wenang. Semakin kecil ukuran semakin baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.