ROC曲線とPR曲線にて、歪みの大きいデータセット(陽性<<陰性)の分析評価にはROC曲線よりPR曲線の方が適していると述べたが、一概にそうとは言い切れない体験をしたのでここに記す。
まず、1つ実験を行ってみる。以下のコードを用いて、scikit-learnに付属しているbreast cancerのデータから、PR曲線を作成してみる。(機械学習に用いたのは均衡型ランダムフォレスト分類器。これは歪みの大きなデータセットの分類に特化したランダムフォレストの改良アルゴリズムである。詳細は後日公開予定であり、Schwartzwaldはこの分類器が含まれるライブラリの仮名)
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_recall_curve, auc
from Schwarzwald import BalancedRandomForestClassifier
import numpy as np
from matplotlib import pyplot as plt
import random
data = datasets.load_breast_cancer()
tag_0 = np.sum(data["target"] == 0)
tag_1 = np.sum(data["target"] == 1)
tag_num = 0 # 変更
X_train, X_test, y_train, y_test = train_test_split(data["data"], data["target"], test_size=0.33, random_state=42)
X_train_list = list(X_train)
y_train_list = list(y_train)
X_test_list = list(X_test)
y_test_list = list(y_test)
random.seed(42)
i = 0
for _ in range(len(X_train)):
if y_train[i] == 1:
if random.random() < 0.90:
y_train_list.pop(i)
X_train_list.pop(i)
else:
i += 1
for _ in range(len(X_test)):
if y_train[i] == 1:
if random.random() < 0.90:
y_test_list.pop(i)
X_test_list.pop(i)
else:
i += 1
for i in range(tag_num):
for j in range(len(X_train)):
if y_train[j] == 0:
y_train_list.append(0)
X_train_list.append(X_train[j])
for j in range(len(X_test)):
if y_test[j] == 0:
y_test_list.append(0)
X_test_list.append(X_test[j])
X_train = np.array(X_train_list)
y_train = np.array(y_train_list)
X_test = np.array(X_test_list)
y_test = np.array(y_test_list)
clf = BalancedRandomForestClassifier(100)
clf.fit(X_train, y_train)
precision, recall, _ = precision_recall_curve(y_test, clf.predict_proba(X_test)[:,1])
plt.plot(recall, precision)
plt.show()
print(auc(recall, precision))
その際、陽性データの数を10分の1に減らした。さらに変数tag_numの値だけ陰性データの数を倍にしていき、PR-AUCの変化を記録した。結果は以下のとおりである。
陰性データの数 | PR-AUC |
1倍 | 0.9955687664789827 |
11倍 | 0.9828483486285571 |
101倍 | 0.9828483486285571 |
1001倍 | 0.9140349873613590 |
このように、データの内容は変わっていないにも関わらず、単に陰性データの数が増える(すなわち、歪みが大きくなる)につれてPR-AUCは低下していることがわかる。今回のデータセットは非常に分類がしやすいものであったためPR-AUCは常に0.9以上に保たれているが、筆者がより分類困難で総数約10万の歪んだデータセットを分析した際には、ROC-AUC = 0.9程度の分類ができているにも関わらず、PR-AUCは0.1未満となった。これを最大化するようにグリッドサーチを行ったところで、PR-AUCの最大値と最小値の差はほぼ誤差の範囲内であり、果たして意味があるのだろうか。
歪みが大きくなるにつれてPR-AUCが低下する原理は以下のようなものである。
まず、100例ずつの陽性例と陰性例がともに90%の確率で正しく分類されている状態の混合行列を考えてみる。
陽性(判定) | 陰性(判定) | |
陽性(実際) | 90(TP) | 10(FN) |
陰性(実際) | 10(FP) | 90(TN) |
このとき、
Recall = TP / (TP + FN) = 90 / (90 + 10) = 0.9
Precision = TP / (TP + FP) = 90 / (90 + 10) = 0.9
となるが、ここで陰性例に対する適合率を変えずにデータ数を100倍にすると、
陽性(判定) | 陰性(判定) | |
陽性(実際) | 90(TP) | 10(FN) |
陰性(実際) | 1000(FP) | 9000(TN) |
Recall = TP / (TP + FN) = 90 / (90 + 10) = 0.9
Precision = TP / (TP + FP) = 90 / (90 + 1000) = 0.0826
と、Precisionが大きく低下する。この時、陰性例に対する適合率が一定であるにも関わらず、データ規模が大きくなったために、偽陽性の絶対数が増えた。それが真陽性の値を無視できるほどの大きさになるとき、Precisionはこのように非常に小さな値となるのである。より感覚的な表現をするなら、「少数グループの大多数よりも、大衆のごく一部の方が強い」と言えるかもしれない。また、RecallはTPR (True Positive Rate)と同一であるが、PrecisionはROC曲線に含まれないため、PR-AUCが非常に小さい場合でもROC-AUCは高く保たれうるのである。
このような状況において、分類の精度が多少向上したところで、測定ごとの誤差も考えれば、その成果はPrecisionやPR-AUCに反映されるだろうか。筆者はとても疑わしいと感じる。
そこでPR-AUCやROC-AUCに代わる新しい評価基準としてSP_indexなるものを筆者は考案したのであるが、結論から言うとこれは失敗であった。しかし、その際に新たな知見が得られたため、PR曲線とROC曲線の関係について今一度考えねばなるまいと感じるようになった。その詳細についてはまた次回とする。
コメント
[…] 前記事、PR曲線・ROC曲線再考その1「歪みの増加とPR-AUCの変化」を受けて、非常に歪みの大きいデータセットに対してPR-AUCを評価基準とすることに疑念が生じた。そこで新しい基準を作ることにしたのだが、その考え方の基礎となったのはSeparation Plotである。 […]