High Recall - Precision Rendah untuk dataset yang tidak seimbang

11

Saya saat ini menghadapi beberapa masalah menganalisis dataset tweet dengan mesin vektor dukungan. Masalahnya adalah bahwa saya memiliki satu set pelatihan kelas biner yang tidak seimbang (5: 2); yang diharapkan sebanding dengan distribusi kelas nyata. Saat memprediksi saya mendapatkan presisi rendah (0,47) untuk kelas minoritas di set validasi; recall adalah 0,88. Saya mencoba menggunakan beberapa metode oversampling dan under-sampling (dilakukan pada set pelatihan) yang tidak meningkatkan presisi karena set validasi tidak seimbang juga untuk mencerminkan distribusi kelas nyata. Saya juga menerapkan biaya yang berbeda di mesin vektor dukungan, yang membantu. Sekarang sepertinya saya tidak dapat meningkatkan kinerja lagi.

Apakah ada di antara Anda yang memiliki saran apa yang bisa saya lakukan untuk meningkatkan ketepatan saya tanpa mengganggu daya ingat saya? Lebih jauh, apakah ada yang tahu mengapa saya mendapatkan lebih banyak positif palsu daripada negatif palsu (positif adalah kelas minoritas)?

Filippo Scopel
sumber
3
Setidaknya sebagian dari masalah adalah mengevaluasi model berdasarkan aturan penilaian yang tidak tepat.
Sycorax berkata Reinstate Monica
Dengan "metode oversampling dan under-sampling", sudahkah Anda mencoba SMOTE (Sintetis Minoritas-Teknik Sampling)? Dari pengalaman saya, itu meningkatkan tingkat klasifikasi saya untuk kelas minoritas untuk dataset tidak seimbang 300: 1.
Matius Lau
Hai Matthew, terima kasih atas balasan Anda. Saya mencoba beberapa undersampling oversampling dan bahkan metode ensembling termasuk semua jenis teknik SMOTE.
Filippo Scopel
2
Karena Anda menggunakan scikit, coba pohon gradien yang ditingkatkan pada data Anda. Anda mungkin akan mendapatkan AUC recall-recall yang lebih baik langsung dari kotak. SVC, seperti yang Anda tunjukkan, sebenarnya tidak praktis untuk apa pun kecuali kumpulan data yang sangat kecil.
rinspy
1
Hai Filippo! Saat ini saya sedang berurusan dengan, saya akan mengatakan, masalah yang sama persis seperti yang Anda jelaskan :-) Mencoba semua hal yang biasa (oversampling / undersampling, SMOTE, kelas-berat) dan bahkan mencoba beberapa pelajar yang berbeda (SVM, Random Forest, Neural Networks yang terkoneksi penuh), tetapi efeknya sama di mana-mana: penarikan kembali kelas minoritas setelah menerapkan SMOTE atau bobot kelas, tetapi presisi sangat rendah. Apakah Anda pada akhirnya menemukan solusi?
u_b

Jawaban:

6

apakah ada yang tahu mengapa saya mendapatkan lebih banyak positif palsu daripada negatif palsu (positif adalah kelas minoritas)? Terima kasih sebelumnya atas bantuan Anda!

Karena positif adalah kelas minoritas. Ada banyak contoh negatif yang bisa menjadi positif palsu. Sebaliknya, ada lebih sedikit contoh positif yang bisa menjadi negatif palsu.

Ingat kembali bahwa Recall = Sensitivity=TP(TP+FN)

Sensitivitas (True Positive Rate) terkait dengan False Positive Rate (1-spesifisitas) sebagaimana divisualisasikan oleh kurva ROC. Pada satu ekstrim, Anda menyebut setiap contoh positif dan memiliki sensitivitas 100% dengan 100% FPR. Di lain, Anda memanggil tidak ada contoh positif dan memiliki sensitivitas 0% dengan 0% FPR. Ketika kelas positif adalah minoritas, bahkan FPR yang relatif kecil (yang mungkin Anda miliki karena Anda memiliki recall tinggi = sensitivitas = TPR) akan berakhir menyebabkan jumlah FP yang tinggi (karena ada begitu banyak contoh negatif).

Sejak

Precision=TP(TP+FP)

Bahkan pada FPR yang relatif rendah, FP akan membanjiri TP jika jumlah contoh negatif jauh lebih besar.

Kalau tidak,

Klasifikasi positif:C+

Contoh positif:HAI+

Presisi =P(HAI+|C+)=P(C+|HAI+)P(HAI+)P(C+)

P (O +) rendah ketika kelas positif kecil.

Apakah ada di antara Anda yang memiliki saran apa yang bisa saya lakukan untuk meningkatkan ketepatan saya tanpa mengganggu daya ingat saya?

Seperti yang disebutkan oleh @rinspy, GBC bekerja dengan baik dalam pengalaman saya. Namun itu akan lebih lambat dari SVC dengan kernel linear, tetapi Anda dapat membuat pohon yang sangat dangkal untuk mempercepatnya. Selain itu, lebih banyak fitur atau lebih banyak pengamatan mungkin membantu (misalnya, mungkin ada beberapa fitur yang saat ini tidak dianalisis yang selalu disetel ke beberapa nilai di semua FP Anda saat ini).

Mungkin juga layak untuk merencanakan kurva ROC dan kurva kalibrasi. Ini mungkin terjadi bahwa meskipun classifier memiliki presisi rendah, itu bisa mengarah pada estimasi probabilitas yang sangat berguna. Misalnya, hanya dengan mengetahui bahwa hard drive mungkin memiliki kemungkinan gagal 500 kali lipat meningkat, meskipun kemungkinan absolutnya cukup kecil, mungkin informasi penting.

Juga, presisi rendah pada dasarnya berarti bahwa classifier mengembalikan banyak kesalahan positif. Namun ini mungkin tidak terlalu buruk jika positif palsu itu murah.

pengguna0
sumber
2

Metode untuk dicoba:

UnderSampling:

Saya sarankan menggunakan teknik pengambilan sampel dan kemudian latih classifier Anda.

Imbalanced Learning menyediakan api gaya scikit belajar untuk dataset yang tidak seimbang dan harus menjadi titik awal yang baik untuk pengambilan sampel dan algoritma untuk dicoba.

Perpustakaan : https://imbalanced-learn.readthedocs.io/en/stable/

SVM Berbasis Peringkat:

Ini telah terbukti memberikan peningkatan dalam ingatan untuk sistem presisi tinggi dan digunakan oleh google untuk mendeteksi iklan yang buruk. Saya sarankan untuk mencobanya.

Kertas Referensi untuk SVM:

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37195.pdf

Vibhu Jawa
sumber
1

Pendekatan standar adalah untuk menimbang kesalahan Anda berdasarkan frekuensi kelas. Misalnya, jika Anda melakukannya dengan Python dengan sklearn:

model = sklearn.svm.SVC(C=1.0, kernel='linear', class_weight='balanced')
model.fit(X, y)
mprat
sumber
Hai mprat, terima kasih atas balasan Anda. Saya sudah menggunakan class_weight = seimbang.
Filippo Scopel