Lỗi phần trăm tuyệt đối trung bình (MAPE) trong Scikit-learn [đã đóng]


24

Làm cách nào chúng tôi có thể tính toán lỗi phần trăm tuyệt đối trung bình (MAPE) của các dự đoán của chúng tôi bằng Python và scikit-learn?

Từ các tài liệu , chúng tôi chỉ có 4 hàm số liệu này cho Regressions:

  • metrics.explained_variance_score (y_true, y_pred)
  • metrics.mean_absolute_error (y_true, y_pred)
  • metrics.mean_squared_error (y_true, y_pred)
  • metrics.r2_score (y_true, y_pred)

Tham khảo câu trả lời này trên stackOverflow- stackoverflow.com/questions/42250958/
Arpit Sisodia

Câu trả lời:


24

Như đã lưu ý (ví dụ, trong Wikipedia ), MAPE có thể có vấn đề. Rõ ràng nhất, nó có thể gây ra lỗi chia cho 0. Tôi đoán rằng đây là lý do tại sao nó không được bao gồm trong các số liệu sklearn.

Tuy nhiên, nó là đơn giản để thực hiện.

from sklearn.utils import check_arrays
def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = check_arrays(y_true, y_pred)

    ## Note: does not handle mix 1d representation
    #if _is_1d(y_true): 
    #    y_true, y_pred = _check_1d_array(y_true, y_pred)

    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

Sử dụng như mọi số liệu khác ...:

> y_true = [3, -0.5, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> mean_absolute_percentage_error(y_true, y_pred)
Out[19]: 17.738095238095237

(Lưu ý rằng tôi nhân với 100 và trả lại tỷ lệ phần trăm.)

... nhưng thận trọng:

> y_true = [3, 0.0, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> #Note the zero in y_pred
> mean_absolute_percentage_error(y_true, y_pred)
-c:8: RuntimeWarning: divide by zero encountered in divide
Out[21]: inf

1
Có một lỗi trong câu trả lời này. Nên (thay thế y_predbằng y_truemẫu số):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio

1
check_arraysđã bị bỏ rơi bởi scipy. Có check_arraytrong sklearn hiện tại nhưng có vẻ như nó không hoạt động theo cùng một cách.
kilojoules

phương thức check_arrays được xóa khỏi .16.
Arpit Sisodia


17

đây là phiên bản cập nhật:

import numpy as np

def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
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.