分類モデルの評価④(確信度)

前回記事までの分類予測では、陽性/陰性という最終的な予測結果のみを見てきましたが、「その予測がどれだけの確信度をもって行われたのか」という情報も重要になります。

確信度

predict_probaメソッドに予測対象データを渡すと、確率の形式で予測結果を出力することができます。

[Google Colaboratory]

1
2
3
4
5
pred_proba_train = rf_cls.predict_proba(X_train)
pred_proba_test = rf_cls.predict_proba(X_test)

print(pred_proba_train[:5])
print(pred_proba_test[:5])

[実行結果]

出力された配列には、陽性に分類される確率陰性に分類される確率がそれぞれ格納されています。

デフォルトでは、50%を上回っているカテゴリを最終的な予測結果とするようになっていますが、このように確率を算出することで60%以上であれば陽性とするなど、新たな閾値を設定することも可能です。

確信度の可視化

領域ごとの確信度を可視化してみます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

x_min, x_max = X["mean radius"].min() - 0.5, X["mean radius"].max() + 0.5
y_min, y_max = X["mean texture"].min() - 0.5, X["mean texture"].max() + 0.5

step = 0.5
x_range = np.arange(x_min, x_max, step)
y_range = np.arange(y_min, y_max, step)
xx, yy = np.meshgrid(x_range, y_range)

Z = rf_cls.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 0]
Z = Z.reshape(xx.shape)

plt.figure(figsize=(10,7))
plt.contourf(xx, yy, Z, alpha=0.8,cmap=plt.cm.coolwarm)
plt.colorbar()
plt.scatter(X_train["mean radius"], X_train["mean texture"], c=y_train,marker="o", edgecolors="k", cmap=plt.cm.coolwarm_r, label="Train")
plt.scatter(X_test["mean radius"], X_test["mean texture"], c=y_test, marker="^",edgecolors="k", cmap=plt.cm.coolwarm_r, label="Test")
plt.xlabel("mean radius")
plt.ylabel("mean texture")
plt.legend()
plt.show()

[実行結果]

背景のメッシュ部分が陽性に分類される確信度を表しています。

各変数(mean/radius/mean texture)の最小値から最大値の範囲内で、それぞれ0.5刻みでデータを新たに生成し、それぞれのデータを説明変数としてpredict_probaで算出した確信度を可視化しています。

確信度を可視化することで、どの領域で誤分類が起こりやすいかを把握することができます。