Scikit-learnの平均絶対パーセントエラー(MAPE)[終了]


24

Pythonとscikit-learnを使用して予測の平均絶対パーセント誤差(MAPE)を計算するにはどうすればよいですか?

docsから回帰のこれらの4つのメトリック関数のみがあります。

  • 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)

stackOverflow-の上でこの答えを参照してくださいstackoverflow.com/questions/42250958/...
Arpit Sisodia

回答:


24

前述のように(例えば、Wikipediaで)、MAPEには問題があります。最も指摘されるのは、ゼロ除算エラーが発生する可能性があることです。私の推測では、これがsklearnメトリックスに含まれていない理由です。

ただし、実装は簡単です。

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

他のメトリックと同様に使用します...:

> 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

(100を掛けてパーセンテージを返すことに注意してください。)

...しかし、注意してください:

> 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
この回答には誤りがあります。(置き換えるべきであるy_predy_true分母に):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio

1
check_arraysscipyによって捨てられました。check_array現在のsklearnにはありますが、同じように動作するようには見えません。
キロジュール

check_arraysメソッドは.16から削除されました。
Arpit Sisodia


17

更新されたバージョンは次のとおりです。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.