2017-01-26 17 views
7

Tôi đã đào tạo một ExtraTreesClassifier (chỉ mục gini) bằng cách sử dụng scikit-learn và nó phù hợp với nhu cầu của tôi một cách công bằng. Độ chính xác không tốt lắm, nhưng sử dụng xác nhận chéo 10 lần, AUC là 0,95. Tôi muốn sử dụng phân loại này trên công việc của mình. Tôi khá mới với ML, vì vậy hãy tha thứ cho tôi nếu tôi hỏi bạn điều gì đó sai về mặt khái niệm.Làm cách nào để đặt ngưỡng cho trình phân loại sklearn dựa trên kết quả ROC?

Tôi vẽ một số đường cong ROC, và theo nó, dường như tôi có một ngưỡng cụ thể nơi trình phân loại của tôi bắt đầu hoạt động tốt. Tôi muốn thiết lập giá trị này trên phân loại được trang bị, vì vậy mọi khi tôi muốn gọi dự đoán, các phân loại sử dụng ngưỡng đó và tôi có thể tin vào tỷ lệ FP và TP.

Tôi cũng đã truy cập vào bài đăng này (scikit .predict() default threshold), trong đó tuyên bố rằng ngưỡng không phải là khái niệm chung cho các trình phân loại. Nhưng kể từ khi ExtraTreesClassifier có phương thức predict_bị_bị, và đường cong ROC cũng liên quan đến định nghĩa thresdholds, có vẻ như tôi nên có sẵn để xác định nó.

Tôi không tìm thấy bất kỳ tham số nào cũng như bất kỳ lớp/giao diện nào để sử dụng để thực hiện. Làm thế nào tôi có thể thiết lập một ngưỡng cho nó cho một ExtraTreesClassifier được đào tạo (hoặc bất kỳ một khác) bằng cách sử dụng scikit-tìm hiểu?

Nhiều Cảm ơn, Colis

Trả lời

2

Đây là những gì tôi đã làm:

model = SomeSklearnModel() 
model.fit(X_train, y_train) 
predict = model.predict(X_test) 
predict_probabilities = model.predict_proba(X_test) 
fpr, tpr, _ = roc_curve(y_test, predict_probabilities) 

Tuy nhiên, tôi cảm thấy khó chịu mà dự đoán sẽ chọn một ngưỡng tương ứng với 0,4% số dương tính thực (sai số dương là 0). Đường cong ROC cho thấy một ngưỡng tôi thích tốt hơn cho vấn đề của tôi, nơi các mặt tích cực thực sự là khoảng 20% ​​(sai dương khoảng 4%). Sau đó tôi quét các predict_định_đĩa để tìm giá trị xác suất nào tương ứng với điểm ROC yêu thích của tôi. Trong trường hợp của tôi xác suất này là 0,21. Sau đó, tôi tạo ra dự đoán mảng riêng tôi:

predict_mine = np.where(rf_predict_probabilities > 0.21, 1, 0) 

và có bạn đi:

confusion_matrix(y_test, predict_mine) 

lợi nhuận những gì tôi muốn:

array([[6927, 309], 
     [ 621, 121]]) 
0

Thật khó để đưa ra một câu trả lời chính xác mà không cần bất kỳ ví dụ mã cụ thể. Nếu bạn đã làm kiểm chứng chéo, bạn có thể xem xét xác định AUC như các tham số để tối ưu hóa:

shuffle = cross_validation.KFold(len(X_train), n_folds=10, shuffle=True) 
scores = cross_val_score(classifier, X_train, y_train, cv=shuffle, scoring='roc_auc') 
+0

Hi trắng, nhờ trả lời của bạn. Tôi đã tối ưu hóa nó bằng cách chọn roc_auc và các số liệu khác mà tôi quan tâm vào thời điểm đó (tôi cũng đã tạo một trình chỉnh sửa tùy chỉnh để tối ưu hóa LR +). Nghi ngờ chính của tôi là làm thế nào để chọn một trong các ngưỡng hiển thị bởi một điểm trên đường cong ROC như ngưỡng cho khi tôi gọi dự đoán()? Câu hỏi của tôi liên quan đến (). Tôi không chắc chắn rằng điều này sẽ có sẵn cho cây, vì họ thường không sử dụng khí thăm dò. Nhưng làm thế nào để thiết lập nó cho các phương pháp khác, sau đó? – Colis

Các vấn đề liên quan