機械学習のメトリクス3【AAAMLP】

AAAMLP

前回に引き続き、機械学習のメトリクス、評価指標について学んだことを記録します。

harukary7518.hatenablog.com

AAAMLP (Approaching (Almost) Any Machine Learning Problem)という書籍で勉強した内容の整理です。

github.com

この書籍は多くの言語に翻訳されていて、2021年8月に「Kaggle Grandmasterに学ぶ 機械学習 実践アプローチ」として日本語版も発売されています。

www.amazon.co.jp

Metrics for multi-label classification

マルチラベル問題、つまり、一つのサンプルが複数のクラスを持つ可能性のある問題に対する評価指標についてまとめます。

P@k: Precision at k

真値と予測値のそれぞれTop-kをとり、そこで重複しているクラスの割合を計算します。

def pk(y_true, y_pred, k):
    if k == 0:
        return 0
    y_pred = y_pred[:k
    pred_set = set(y_pred)
    true_set = set(y_true)
    common_values = pred_set.intersection(true_set)
    return len(common_values) / len(y_pred[:k])

AP@k: Average Precision at k

kまでのP@kの平均を計算します。

 AP@k = \frac{1}{k} \sum_{i=1}^k {P@k}

def apk(y_true, y_pred, k):
    pk_values = []
    for i in range(1, k + 1):
        pk_values.append(pk(y_true, y_pred, i))
    if len(pk_values) == 0:
        return 0
    return sum(pk_values) / len(pk_values)

MAP@k: Mean Average Precision at k

各サンプルに対してAP@kを計算し、その平均を計算します。

def mapk(y_true, y_pred, k):
    apk_values = []
    for i in range(len(y_true)):
        apk_values.append(apk(y_true[i], y_pred[i], k=k))
    return sum(apk_values) / len(apk_values)

P@kやAP@kには、順序を考慮し重みづけをするものなど様々な実装があります。

Log Loss

マルチクラス問題におけるLog Lossでは、真値をバイナリフォーマットに変換し、その各列に対してLog Lossを計算します。そして、すべての列のLog Lossの平均を計算します。

Metrics for regression

回帰問題に対する評価指標についてまとめます。

Mean Absolute Error (MAE)

まず、エラーの絶対値による評価指標です。

def mean_absolute_error(y_true, y_pred):
    error = 0
    for yt, yp in zip(y_true, y_pred):
        error += np.abs(yt - yp)
    return error / len(y_true)

Mean Squared Error (MSE)

MAEに似た指標としてMSEがあります。 MSEと、MSEのルートをとったRMSEは、回帰問題において最も使われる評価指標です。

def mean_squared_error(y_true, y_pred):
    error = 0
    for yt, yp in zip(y_true, y_pred):
        error += (yt - yp) ** 2
    return error / len(y_true)

Mean Squared Log Error (MSLE)

対数を用いた評価指標もある。

 Error = ( \log{1+y_t} - \log{1+y_p} ) ^2

これをそのまま使うのがSLE、この平均をとるのがMSLEです。

def mean_squared_error(y_true, y_pred):
    error = 0
    for yt, yp in zip(y_true, y_pred):
        error += (yt - yp) ** 2
    return error / len(y_true)

Mean Percentage Error

各サンプルのエラー率を計算し、その平均をとります。

 Error = 100(y_t -y_p)/y_t

def mean_percentage_error(y_true, y_pred):
    error = 0
    for yt, yp in zip(y_true, y_pred):
        error += (yt - yp) / yt
    return error / len(y_true)

Mean Absolute Percentage Error (MAPE)

絶対値をとるバージョンで、こちらのほうがより一般的だそうです。

def mean_abs_percentage_error(y_true, y_pred):
    error = 0
    for yt, yp in zip(y_true, y_pred):
        error += np.abs(yt - yp) / yt
    return error / len(y_true)

R-squared

R^2は、coefficient, determinationとも呼ばれます。 簡単に言うと、R^2はモデルがどれだけデータにフィットしているかを表現します。

定義をいかに示します。

[tex: R2 = 1- \frac{\sum{i=1}^N (y{t_i} - y{p_i})2}{\sum{i=1}^N (y{t_i} - y{t_{mean}})} ]

def r2(y_true, y_pred):
    mean_true_value = np.mean(y_true)
    numerator = 0
    denominator = 0
    for yt, yp in zip(y_true, y_pred)
        numerator += (yt - yp) ** 2
        denominator += (yt - mean_true_value) ** 2
    ratio = numerator / denominator
    return 1 - ratio

Matthew's Correlation Coefficient (MCC)

MCCは、-1から1の値をとります。 1は完璧な予測を表し、‐1はすべて誤る予測、0はランダムな予測を表します。

 MCC=\frac{TP \cdot TN-FP \cdot FN}{[(TP+FP)(FN+TN)(FP+TN)(TP+FN)^{1/2}} ]

def mcc(y_true, y_pred):
    tp = true_positive(y_true, y_pred)
    tn = true_negative(y_true, y_pred)
    fp = false_positive(y_true, y_pred)
    fn = false_negative(y_true, y_pred)
    numerator = (tp * tn) - (fp * fn)
    denominator = (
        (tp + fp) *
        (fn + tn) *
        (fp + tn) *
        (tp + fn)
    )
    denominator = denominator ** 0.5
    return numerator/denominator

Conclusion

今回は、マルチラベル問題、回帰問題に対するメトリクスについてまとめました。

この本では、評価指標の理論や性質について詳細に書いているわけではありませんでした。 自分自身、2クラス問題の指標しかよく理解していない気がします。

使っていくうちにわかるようになるのか、改めて勉強が必要になるのか。。 とりあえず評価指標がいっぱいあることを学びました。

Link

GitHub - abhishekkrthakur/approachingalmost: Approaching (Almost) Any Machine Learning Problem

機械学習のメトリクス1【AAAMLP】 - harukary.log

機械学習のメトリクス2【AAAMLP】 - harukary.log