機械学習のメトリクス3【AAAMLP】
AAAMLP
前回に引き続き、機械学習のメトリクス、評価指標について学んだことを記録します。
AAAMLP (Approaching (Almost) Any Machine Learning Problem)という書籍で勉強した内容の整理です。
この書籍は多くの言語に翻訳されていて、2021年8月に「Kaggle Grandmasterに学ぶ 機械学習 実践アプローチ」として日本語版も発売されています。
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の平均を計算します。
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)
対数を用いた評価指標もある。
これをそのまま使うのが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
各サンプルのエラー率を計算し、その平均をとります。
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はランダムな予測を表します。
^{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