Berarti kesalahan persentase absolut (MAPE) di Scikit-belajar [ditutup]

24

Bagaimana kita menghitung kesalahan persentase absolut rata-rata (MAPE) dari prediksi kita menggunakan Python dan scikit-learn?

Dari dokumen , kami hanya memiliki 4 fungsi metrik untuk Regresi ini:

  • 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)
Nyxynyx
sumber
Rujuk jawaban ini di stackOverflow- stackoverflow.com/questions/42250958/...
Arpit Sisodia

Jawaban:

24

Seperti dicatat (misalnya, di Wikipedia ), MAPE bisa bermasalah. Yang paling jelas, ini dapat menyebabkan kesalahan pembagian demi nol. Dugaan saya adalah bahwa inilah mengapa tidak termasuk dalam metrik sklearn.

Namun, sederhana untuk diimplementasikan.

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

Gunakan seperti metrik lainnya ...:

> 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

(Perhatikan bahwa saya mengalikan 100 dan mengembalikan persentase.)

... tetapi dengan hati-hati:

> 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
Seorang pria
sumber
1
Ada kesalahan dalam jawaban ini. Harus (ganti y_preddengan y_truedalam penyebut):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio
1
check_arraysdibuang oleh cipy. Ada check_arraydi sklearn saat ini tetapi sepertinya tidak bekerja dengan cara yang sama.
kilojoules
Metode check_arrays dihapus dari .16.
Arpit Sisodia
17

ini adalah versi terbaru:

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
Antonín Hoskovec
sumber