Pengklasifikasi dengan presisi yang disesuaikan vs pengingatan

11

Saya sedang mengerjakan masalah klasifikasi biner di mana jauh lebih penting untuk tidak memiliki false positive; cukup banyak negatif palsu ok. Saya telah menggunakan banyak pengklasifikasi di sklearn misalnya, tetapi saya pikir tidak satupun dari mereka memiliki kemampuan untuk menyesuaikan tradeoff presisi-recall secara eksplisit (mereka menghasilkan hasil yang cukup bagus tetapi tidak dapat disesuaikan).

Klasifikasi apa yang memiliki presisi / penarikan yang dapat disesuaikan? Apakah ada cara untuk mempengaruhi tradeoff presisi / recall pada pengklasifikasi standar, misalnya Random Forest atau AdaBoost?

Alex I
sumber

Jawaban:

12

Hampir semua pengklasifikasi scikit-learn dapat memberikan nilai keputusan (via decision_functionatau predict_proba).

Berdasarkan nilai keputusan, sangat mudah untuk menghitung presisi-recall dan / atau kurva ROC. scikit-belajar menyediakan fungsi-fungsi dalam nya metrik submodule.

Contoh minimal, dengan asumsi Anda memiliki datadan labelsdengan konten yang sesuai:

import sklearn.svm
import sklearn.metrics
from matplotlib import pyplot as plt

clf = sklearn.svm.LinearSVC().fit(data, labels)
decision_values = clf.decision_function(data)

precision, recall, thresholds = sklearn.metrics.precision_recall_curve(labels, decision_values)

plt.plot(recall, precision)
plt.show()
Marc Claesen
sumber
Sempurna, terima kasih! Tidak yakin bagaimana saya melewatkan itu :)
Alex I
Sepertinya precision_recall_curvemenghitung seluruh F1. Bagaimana cara hanya menghitung yang negatif?
Mithril
6

Saya baru saja memecahkan ini untuk diri saya sendiri sebelum menabrak Q ini jadi saya telah memutuskan untuk membagikan solusi saya.

Ini menggunakan pendekatan yang sama yang telah diusulkan Marc Claesen tetapi menjawab pertanyaan aktual tentang bagaimana menyesuaikan classifier untuk bergerak lebih tinggi pada perdagangan sumbu presisi dari penarikan.

X_test adalah data dan y_test adalah label yang sebenarnya. Pengklasifikasi harus sudah terpasang.

y_score = clf.decision_function(X_test)

prcsn,rcl,thrshld=precision_recall_curve(y_test,y_score)

min_prcsn=0.25 # here is your precision lower bound e.g. 25%
min_thrshld=min([thrshld[i] for i in range(len(thrshld)) if prcsn[i]>min_prcsn])

Dan ini adalah bagaimana Anda akan menggunakan ambang minimal d learne d baru untuk menyesuaikan prediksi Anda (bahwa Anda hanya akan mendapatkan panggilan prediksi (X_test))

y_pred_adjusted=[1 if y_s>min_thrshld else 0 for y_s in y_score]

Senang sekali mendengar tanggapan Anda tentang resep penyesuaian ini.

Diego
sumber