iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
AI Engineering

從 Pixel 到 AI:30 天影像辨識入門之路系列 第 25 篇

Day25 模型最容易認錯哪種皮膚病灶?Confusion Matrix 告訴你

  • 分享至 

  • xImage
  •  

前幾天我們一直使用 Loss 和 Accuracy 觀察模型表現。

例如 Day24 加入 Dropout 後,Test Accuracy 從 73.16% 提升到 74.03%。

但看到 74.03% 之後,我開始想到另一個問題:

剩下預測錯誤的圖片,到底錯在哪裡?

模型可能很會辨識某些類別,卻一直把另一種皮膚病灶認成其他類別。

因此今天要使用 Confusion Matrix(混淆矩陣),看看模型最容易把哪些皮膚病灶搞混。


一、Accuracy 看不到什麼?

Accuracy 告訴我們:

全部預測中,有多少比例預測正確?

但 HAM10000 並不是每個類別都有相同數量的圖片,因此即使整體 Accuracy 看起來不錯,也不代表每一個皮膚病灶類別都辨識得一樣好。

今天我們想進一步知道:

  • 哪一類最常預測正確?
  • 哪一類最容易預測錯誤?
  • 預測錯誤時,又最常被認成哪一類?

這時就需要 Confusion Matrix。


二、什麼是 Confusion Matrix?

Confusion Matrix 會把 真實類別(Actual) 和 模型預測類別(Predicted) 放在一起比較。

假設只有三種類別:

Actual \ Predicted A B C
A 80 10 10
B 5 90 5
C 15 10 75

對角線上的數字代表 模型預測正確,而不在對角線上的數字則代表 模型把這個類別認成其他類別,因此我們不只可以知道模型「錯了多少」,還可以知道 它到底錯成什麼?


三、先認識 TP、FP、FN

在理解 Confusion Matrix 時,常常會看到:

  • TP:True Positive
  • FP:False Positive
  • FN:False Negative
  • TN:True Negative

以其中一個皮膚病灶類別為例:

  • TP(True Positive)真的是這個類別,而且模型也預測成這個類別。
  • FP(False Positive)實際不是這個類別,但模型卻預測成這個類別。
  • FN(False Negative)實際是這個類別,但模型卻預測成其他類別。

在 HAM10000 這種多分類問題中,可以一次選擇其中一個類別,把它當成 Positive,再觀察其他類別。


四、讓模型預測 Test Data

這次不重新訓練模型,直接使用 Day24 加入 Dropout 後的模型:

y_prob = model_dropout.predict(X_test)y_pred = np.argmax(y_prob, axis=1)

模型最後會輸出 7 個類別的機率,因此使用 argmax() 找出機率最高的類別,作為最後的預測結果。


五、建立 Confusion Matrix

接著使用 Test Data 的正確答案 y_test,和剛剛得到的 y_pred 建立 Confusion Matrix。

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)print(cm)

這時就會得到一個 7 × 7 的矩陣,分別對應 HAM10000 的 7 種皮膚病灶類別。


六、把 Confusion Matrix 畫出來

只有數字不太容易觀察,因此可以把結果畫成圖:

from sklearn.metrics import ConfusionMatrixDisplay
import matplotlib.pyplot as plt

display = ConfusionMatrixDisplay(confusion_matrix=cm,display_labels=class_names)
display.plot(xticks_rotation=45,cmap="Blues")

plt.title("Confusion Matrix")
plt.show()

我們把 X 軸設成 Predicted Label、Y 軸是 Actual Label,對角線代表預測正確的圖片,其他位置則可以看出模型最容易把哪兩種類別搞混。


七、AI 最容易認錯哪種皮膚病灶?

https://ithelp.ithome.com.tw/upload/images/20261007/20169251UzAVxpbiw1.png

從 Confusion Matrix 可以看到,不同類別的辨識結果差異非常明顯,其中 nv 的辨識效果最好,在 996 張圖片中有 957 張預測正確,約為 96.1%。

相較之下,其他類別就沒有這麼理想,例如 mel 共有 187 張圖片,卻只有 24 張預測正確,其中更有 133 張被模型預測成 nv。

bkl 也有類似的情況,152 張圖片中有 56 張預測正確,但有 70 張被預測成 nv。

另外,df 的 7 張圖片中沒有任何一張被正確分類。不過由於 Test Data 中的 df 樣本只有 7 張,因此不能只根據這個結果就直接判斷模型完全無法辨識 df。

整體來看,可以發現模型有一個很明顯的現象許多預測錯誤的圖片,都被模型判斷成了 nv。

這也讓我想到我們前面提過的 Class Imbalance 問題,雖然模型整體 Test Accuracy 可以達到約 74%,但這並不代表模型對七種類別都有相同的辨識能力。


八、為什麼只看 Accuracy 不夠?

這次的 Confusion Matrix 也讓 Accuracy 的限制變得更明顯。

nv 在資料中本來就是數量最多的類別,而模型對 nv 的辨識結果也非常好,因此即使其他少數類別的辨識效果不理想,整體 Accuracy 仍然可以維持在一定程度。

如果只看到整體 Accuracy,就很難發現不同類別之間有這麼大的差異。

因此在 Class Imbalance 的多分類問題中,除了 Accuracy,也需要搭配 Confusion Matrix 等方式觀察每個類別的預測情況。


上一篇
Day24 模型開始背答案怎麼辦?用 Dropout 對抗 Overfitting
下一篇
Day26 不要只看數字!把模型判斷錯的圖片全部抓出來
系列文
從 Pixel 到 AI:30 天影像辨識入門之路 共 26 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言