2016-09-25 16 views
6

Tôi muốn tính AUC, độ chính xác, chính xác cho trình phân loại của tôi. Tôi đang thực hiện nghiên cứu được giám sát:Tính sklearn.roc_auc_score cho nhiều lớp

Đây là mã làm việc của tôi. Mã này hoạt động tốt cho lớp nhị phân, nhưng không hoạt động đối với nhiều lớp. hãy giả sử rằng bạn có một dataframe với các lớp nhị phân:

sample_features_dataframe = self._get_sample_features_dataframe() 
labeled_sample_features_dataframe = retrieve_labeled_sample_dataframe(sample_features_dataframe) 
labeled_sample_features_dataframe, binary_class_series, multi_class_series = self._prepare_dataframe_for_learning(labeled_sample_features_dataframe) 

k = 10 
k_folds = StratifiedKFold(binary_class_series, k) 
for train_indexes, test_indexes in k_folds: 
    train_set_dataframe = labeled_sample_features_dataframe.loc[train_indexes.tolist()] 
    test_set_dataframe = labeled_sample_features_dataframe.loc[test_indexes.tolist()] 

    train_class = binary_class_series[train_indexes] 
    test_class = binary_class_series[test_indexes] 
    selected_classifier = RandomForestClassifier(n_estimators=100) 
    selected_classifier.fit(train_set_dataframe, train_class) 
    predictions = selected_classifier.predict(test_set_dataframe) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 

    roc += roc_auc_score(test_class, predictions_proba[:,1]) 
    accuracy += accuracy_score(test_class, predictions) 
    recall += recall_score(test_class, predictions) 
    precision += precision_score(test_class, predictions) 

Cuối cùng tôi chia các kết quả trong K dĩ nhiên để có được trung bình AUC, độ chính xác vv Mã này đang làm việc tốt. Tuy nhiên, tôi không thể tính toán tương tự cho nhiều lớp:

train_class = multi_class_series[train_indexes] 
    test_class = multi_class_series[test_indexes] 

    selected_classifier = RandomForestClassifier(n_estimators=100) 
    selected_classifier.fit(train_set_dataframe, train_class) 

    predictions = selected_classifier.predict(test_set_dataframe) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 

tôi thấy rằng đối với đa lớp tôi phải thêm tham số "trọng" đối với trung bình.

roc += roc_auc_score(test_class, predictions_proba[:,1], average="weighted") 

tôi có một lỗi: nâng ValueError ("{0} định dạng không được hỗ trợ" .format (y_type))

ValueError: định dạng nhiều lớp không được hỗ trợ

Trả lời

4

Bạn không thể sử dụng roc_auc dưới dạng chỉ số tóm tắt duy nhất cho các mô hình đa giác. Nếu bạn muốn, bạn có thể tính toán cho mỗi lớp roc_auc, như

roc = {label: [] for label in multi_class_series.unique()} 
for label in multi_class_series.unique(): 
    selected_classifier.fit(train_set_dataframe, train_class == label) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 
    roc[label] += roc_auc_score(test_class, predictions_proba[:,1]) 

Tuy nhiên đó là bình thường hơn để sử dụng sklearn.metrics.confusion_matrix để đánh giá hiệu suất của một mô hình nhiều lớp.

6

Tùy chọn average của roc_auc_score chỉ được xác định cho các sự cố đa nhãn.

Bạn có thể có một cái nhìn vào ví dụ sau đây từ tài liệu scikit-học để xác định bạn sở hữu điểm vi hay vĩ mô trung bình cho các vấn đề nhiều lớp:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass-settings

Sửa: có một vấn đề về trình theo dõi tìm hiểu để thực hiện ROC AUC cho các vấn đề về đa lớp: https://github.com/scikit-learn/scikit-learn/issues/3298

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