Phân loại với điều chỉnh độ chính xác vs thu hồi


11

Tôi đang làm việc về một vấn đề phân loại nhị phân trong đó điều quan trọng hơn nhiều là không có dương tính giả; khá nhiều phủ định sai là ok. Tôi đã sử dụng một loạt các trình phân loại trong sklearn chẳng hạn, nhưng tôi nghĩ không ai trong số họ có khả năng điều chỉnh sự đánh đổi thu hồi chính xác một cách rõ ràng (chúng tạo ra kết quả khá tốt nhưng không thể điều chỉnh).

Những phân loại có điều chỉnh độ chính xác / thu hồi? Có cách nào để tác động đến sự đánh đổi chính xác / thu hồi trên các phân loại tiêu chuẩn, ví dụ Rừng ngẫu nhiên hoặc AdaBoost không?

Câu trả lời:


12

Hầu như tất cả các trình phân loại của scikit-learn có thể đưa ra các giá trị quyết định (thông qua decision_functionhoặc predict_proba).

Dựa trên các giá trị quyết định, việc tính toán độ chính xác và / hoặc đường cong ROC là đơn giản. scikit-learn cung cấp các hàm đó trong mô hình con số liệu của nó .

Một ví dụ tối thiểu, giả sử bạn có datalabelscó nội dung phù hợp:

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()

Hoàn hảo, cảm ơn bạn! Không chắc là tôi đã bỏ lỡ điều đó như thế nào :)
Alex I

Hình như precision_recall_curvetính toàn bộ F1. Làm thế nào để chỉ tính toán những người tiêu cực?
Mithril

6

Tôi vừa tự giải quyết vấn đề này trước khi va vào Q này vì vậy tôi đã quyết định chia sẻ giải pháp của mình.

Nó sử dụng cách tiếp cận tương tự mà Marc Claesen đã đề xuất nhưng trả lời câu hỏi chấp hành về cách điều chỉnh bộ phân loại để di chuyển cao hơn trên giao dịch trục chính xác khỏi lệnh thu hồi.

X_test là dữ liệu và y_test là nhãn thực sự. Các phân loại nên được trang bị.

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])

Và đây là cách bạn sử dụng ngưỡng tối thiểu mới học để điều chỉnh dự đoán của mình (rằng nếu không bạn sẽ chỉ nhận được dự đoán cuộc gọi (X_test))

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

Sẽ thật tuyệt khi nghe phản hồi của bạn về công thức điều chỉnh này.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.