Phương pháp tính điểm OOB RandomForestClassifier


14

Là việc triển khai rừng ngẫu nhiên trong scikit-learn sử dụng độ chính xác trung bình làm phương pháp tính điểm của nó để ước tính lỗi tổng quát hóa với các mẫu ngoài túi? Điều này không được đề cập trong tài liệu, nhưng phương thức points () báo cáo độ chính xác trung bình.

Tôi có một bộ dữ liệu không cân bằng cao và tôi đang sử dụng AUC của ROC làm chỉ số cho điểm của mình trong tìm kiếm lưới. Có cách nào để yêu cầu bộ phân loại sử dụng cùng một phương pháp cho điểm trên các mẫu OOB không?


Các oob_score tham số của RandomForestClassifier lớp không làm những gì bạn muốn?
Pierre

AFAIK, oob_scorebáo cáo độ chính xác. Tôi cần phải nhìn vào mã nguồn một lần nữa mặc dù.
darXider

Thông số nào bạn đang ước tính với tìm kiếm lưới của bạn?
JahKnows

^ Xin lỗi, nhưng tôi thực sự không nhớ bây giờ! Tôi đã hỏi câu hỏi này 1,5 năm trước.
darXider

Câu trả lời:


14

Nói chung, hiệu suất của các phân loại được so sánh bằng cách sử dụng độ chính xác, đây là thước đo số lượng các trường hợp được phân loại chính xác chia cho tổng số trường hợp. Tuy nhiên, từ dữ liệu đào tạo, chúng tôi có thể nhận được xấp xỉ tốt hơn các lỗi dự kiến ​​từ trình phân loại của chúng tôi khi chúng tôi đang sử dụng các kỹ thuật học tập hoặc đóng gói.

Lỗi túi

xTôi

Để triển khai oob trong sklearn, bạn cần chỉ định nó khi tạo đối tượng Rừng ngẫu nhiên là

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Sau đó chúng ta có thể đào tạo mô hình

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Điểm: 0,979921928817

Như mong đợi độ chính xác của mô hình khi đánh giá tập huấn luyện là rất cao. Tuy nhiên, điều này là vô nghĩa vì bạn rất có thể đang quá tải dữ liệu của mình và do đó mô hình của bạn là rác rưởi. Tuy nhiên, chúng ta có thể sử dụng điểm số ngoài túi như

print(forest.oob_score_)

0,86453272101

Đây là độ chính xác trong khi đánh giá các thể hiện của chúng ta trong tập huấn luyện chỉ sử dụng các cây mà chúng bị bỏ qua. Bây giờ hãy tính điểm trên bộ thử nghiệm là

print('Score: ', forest.score(X_test, y_test))

Điểm: 0.86517733935

Chúng tôi thấy rằng độ chính xác được đo bằng oob rất giống với độ chính xác thu được với bộ thử nghiệm. Do đó, thông qua lý thuyết rằng độ chính xác oob là một số liệu tốt hơn để đánh giá hiệu suất của mô hình của bạn thay vì chỉ là điểm số. Đây là hậu quả của các mô hình đóng bao và không thể thực hiện được với các loại phân loại khác.

Tính oob bằng các số liệu khác nhau

Vâng, bạn có thể làm điều này! Tuy nhiên, nó phụ thuộc vào cách chính xác mã của bạn được cấu trúc. Tôi không chắc làm thế nào bạn có thể bao gồm oob và AUC cùng với cross_val_scorechức năng. Tuy nhiên, nếu bạn đang thực hiện các lần xác thực chéo một cách thủ công, bạn có thể thực hiện các thao tác sau, thuật toán rừng ngẫu nhiên trong sklearn cung cấp cho bạn chức năng quyết định của oob như

print(forest.oob_decision_function_)

Lớp có thể được lấy bằng cách sử dụng

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Sau đó, chúng ta có thể tính toán AUC bằng cách sử dụng như sau

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204


3
Cảm ơn! Tôi biết cách quy trình OOB hoạt động trong các khu rừng ngẫu nhiên. Tôi đặc biệt hỏi liệu RandomForestClassifiercó thể trả về điểm OOB KHÔNG chính xác hay không , và phần thứ hai trong câu trả lời của bạn cung cấp một gợi ý rất hay về cách tiếp cận vấn đề này. Tuy nhiên, tôi phải nhấn mạnh rằng người ta không nên sử dụng nhãn lớp để tính AUC của đường cong ROC; thay vào đó, xác suất lớp nên được sử dụng trực tiếp. Vì vậy, định nghĩa chính xác sẽ là pred_train = forest.oob_decision_function_[:, 1].
darXider

@darXider Không phải điều này mờ ám, vì Forest.oob_decision_feft_.shape [0] == X_train.shape [0], trong khi tôi hy vọng nó sẽ là == số lượng mẫu OOB, nên ít hơn số lượng mẫu trong X_train? Ngoài ra, cá nhân tôi cũng quan tâm đến việc tính toán logloss, đối với những người khác cũng muốn làm điều này, tôi nghĩ rằng pre_train nên là = Forest.oob_decision_feft_ thay vào đó.
Sander Vanden Hautte
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.