2016-10-15 16 views
5

tôi đang tạo ra một đường ống trong scikit học,sử dụng ma trận nhầm lẫn về số liệu ghi bàn trong kiểm chứng chéo trong scikit học

pipeline = Pipeline([ 
    ('bow', CountVectorizer()), 
    ('classifier', BernoulliNB()), 
]) 

và tính toán chính xác sử dụng kiểm chứng chéo

scores = cross_val_score(pipeline, # steps to convert raw messages  into models 
        train_set, # training data 
        label_train, # training labels 
        cv=5, # split data randomly into 10 parts: 9 for training, 1 for scoring 
        scoring='accuracy', # which scoring metric? 
        n_jobs=-1, # -1 = use all cores = faster 
        ) 

Làm thế nào tôi có thể báo cáo nhầm lẫn ma trận thay vì 'chính xác'?

Trả lời

7

Câu trả lời ngắn gọn là "bạn không thể".

Bạn cần hiểu sự khác biệt giữa cross_val_score và xác thực chéo làm phương pháp lựa chọn mô hình. cross_val_score như tên cho thấy, chỉ hoạt động trên điểm số. Ma trận lẫn lộn không phải là một điểm số, nó là một loại tóm tắt về những gì đã xảy ra trong quá trình đánh giá. Điểm khác biệt chính là điểm số được cho là trả lại một đối tượng có thể đặt hàng, đặc biệt là trong tìm hiểu bằng tiếng Anh - float. Vì vậy, dựa trên điểm số bạn có thể cho biết liệu phương pháp b là tốt hơn từ một bằng cách đơn giản so sánh nếu b có điểm số lớn hơn. Bạn không thể làm điều này với ma trận nhầm lẫn mà, một lần nữa như tên cho thấy, là một ma trận.

Nếu bạn muốn lấy ma trận nhầm lẫn cho nhiều lần chạy đánh giá (chẳng hạn như xác thực chéo), bạn phải thực hiện việc này bằng tay, điều đó không phải là xấu trong việc tìm hiểu - đó thực sự là một vài dòng mã.

kf = cross_validation.KFold(len(y), n_folds=5) 
for train_index, test_index in kf: 

    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index] 

    model.fit(X_train, y_train) 
    print confusion_matrix(y_test, model.predict(X_test)) 
12

Bạn có thể sử dụng cross_val_predict thay vì cross_val_score.

thay vì thực hiện:

from sklearn.model_selection import cross_val_score 
scores = cross_val_score(clf,x,y,cv=10) 

bạn có thể làm:

from sklearn.model_selection import cross_val_predict 
from sklearn.metrics import confusion_matrix 
y_pred = cross_val_predict(clf,x,y,cv=10) 
conf_mat = confusion_matrix(y,y_pred) 
0

gì bạn có thể làm dù là để xác định một vua phá lưới mà sử dụng giá trị nhất định từ ma trận nhầm lẫn. Xem here [link]. Chỉ cần trích dẫn mã:

này sẽ thực hiện việc kiểm chứng chéo cho mỗi người trong số bốn cầu thủ ghi bàn và trở về từ điển ghi bàn cv_results, ví dụ, với các phím test_tp, test_tn vv chứa giá trị các ma trận nhầm lẫn từ mỗi chéo phân chia -validation.

Từ đó bạn có thể tạo lại ma trận nhầm lẫn trung bình, nhưng cross_val_predict của Xema có vẻ thanh lịch hơn cho điều này.

Lưu ý rằng điều này thực sự sẽ không hoạt động với cross_val_score; bạn sẽ cần cross_validate (được giới thiệu trong scikit-learn v0.19).

Lưu ý phụ: bạn có thể sử dụng một trong số các trình ghi điểm này (ví dụ: một phần tử ma trận) để tối ưu hóa siêu tham số thông qua tìm kiếm lưới.

* CHỈNH SỬA: các từ khóa phủ định thực được trả lại tại [1, 1], chứ không phải [0, 0]

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