2016-06-24 16 views
10

Tôi đang sử dụng linear_model.LinearRegression từ scikit-learn làm mô hình dự đoán. Nó hoạt động và nó hoàn hảo. Tôi gặp sự cố khi đánh giá kết quả được dự đoán bằng cách sử dụng chỉ số precision_score. Đây là dữ liệu thật của tôi:Điểm chính xác: ValueError: Không thể xử lý kết hợp nhị phân và liên tục

array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0]) 

Và đây là dữ liệu dự đoán của tôi:

array([ 0.07094605, 0.1994941 , 0.19270157, 0.13379635, 0.04654469, 
    0.09212494, 0.19952108, 0.12884365, 0.15685076, -0.01274453, 
    0.32167554, 0.32167554, -0.10023553, 0.09819648, -0.06755516, 
    0.25390082, 0.17248324]) 

Mã của tôi:

accuracy_score(y_true, y_pred, normalize=False) 

Và đây là thông báo lỗi:

"ValueError: Can't handle mix of binary and continuous"

Trợ giúp? Cảm ơn bạn.

+1

các dtypes là gì? Bạn có thể chỉ cần 'y_true' vào' numpy.int8'? Có lẽ bạn đang tìm kiếm hồi quy logistic thay vào đó, để dự đoán các biến phân loại? – Benjamin

+0

Nó đang kiểm tra 'type_of_target (y_true)' và 'type_of_target (y_pred)' (trong 'utils.multiclass.py'). Nếu mảng chỉ có 2 giá trị duy nhất, nó được phân loại là 'binary'. – hpaulj

Trả lời

8
accuracy_score(y_true, y_pred.round(), normalize=False) 

nếu bạn muốn có quyền kiểm soát nhiều hơn về việc sử dụng ngưỡng (y_pred>threshold).astype(int) thay vì y_pred.round() nơi threshold là giá trị của mình để tách hai lớp.

+1

Bạn có thể thiết lập điểm cắt tại 0.5, hoặc quyết định cho một ngưỡng khác ví dụ theo đường cong roc, và có một sự cân bằng khác nhau về độ đặc hiệu so với độ nhạy, hãy kiểm tra https://stats.stackexchange.com/questions/29719/ làm thế nào để xác định-tốt nhất-cắt-điểm-và-nó-sự tự tin-khoảng-sử dụng-roc-curve-i hình thành chi tiết hơn về số liệu thống kê. – natbusa

+0

Một lưu ý về mảng được dự đoán của bạn. Tôi thấy rằng bạn có giá trị âm ở đó.Thông thường bạn nên có xác suất giữa 0 và 1. Bạn có thể chuyển đổi thành xác suất bằng hàm softmax xem http://stackoverflow.com/questions/34968722/softmax-function-python – natbusa

1

Vấn đề là y thực là nhị phân (số không và số), trong khi dự đoán của bạn thì không. Bạn có thể tạo ra xác suất và không dự đoán, do đó kết quả :) Hãy thử để tạo ra thành viên lớp học, và nó sẽ làm việc!

1

Có lẽ điều này giúp ai đó tìm thấy câu hỏi này:

Như JohnnyQ đã chỉ ra, vấn đề là bạn phải không nhị phân (không phải 0 hay 1) giá trị trong y_pred của bạn, i. e. khi thêm

print(((y_pred != 0.) & (y_pred != 1.)).any()) 

bạn sẽ thấy True ở đầu ra. (Lệnh tìm ra nếu có bất kỳ giá trị nào không phải là 0 hoặc 1).

Bạn có thể thấy giá trị phi nhị phân của bạn sử dụng:

non_binary_values = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)] 
non_binary_idxs = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)].index 

Một tuyên bố in có thể xuất các biến derivated trên.

Cuối cùng, chức năng này có thể làm sạch dữ liệu của bạn của tất cả các mục phi nhị phân:

def remove_unlabelled_data(X, y): 
    drop_indexes = X[(y['score'] != 1) & (y['score'] != 0)].index 
    return X.drop(drop_indexes), y.drop(drop_indexes) 
Các vấn đề liên quan