iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用

Titanic MLP 損失曲線顏色代碼填空

原題 50

Titanic MLP 連題組第三題:模型訓練後繪製訓練/驗證損失曲線,圖顯示訓練損失(藍實線)持續下降,驗證損失(紅虛線)下降後在 0.45 附近趨平且小幅波動。

history = model.fit(X_train, y_train, validation_split=0.2, epochs=100, batch_size=10)
loss, accuracy = model.evaluate(X_train, y_train, verbose=0)

import matplotlib.pyplot as plt
loss = history.history["loss"]
epochs = range(1, len(loss)+1)
val_loss = history.history["val_loss"]
plt.plot(epochs, loss, 空格 1, label="Training Loss")
plt.plot(epochs, val_loss, 空格 2, label="Validation Loss")

敘述(複選 sub-options):
A:空格 1 須填入 "b-"
B:空格 2 須填入 "b--"
C:空格 1 須填入 "r-"
D:空格 2 須填入 "r--"
E:驗證損失明顯較訓練損失減少更明顯

請問下列何者正確?(4 個選項各為不同的子敘述組合)

白話

Titanic MLP 訓練完成後,工程師要用 matplotlib 畫訓練/驗證損失曲線。圖中訓練損失是藍色實線,驗證損失是紅色虛線。程式碼裡有兩個空格要填入 matplotlib 的顏色+線型格式字串。題目列出 5 個子敘述(A-E),4 個選項各是不同的正確組合。

問你:5 個子敘述中,哪些是正確的?對應到哪個選項?

點選你的答案。

01 總結

一句話總結

5 個子敘述中正確的是子敘述 A 和子敘述 D:空格 1 填 "b-"(藍色實線,訓練損失),空格 2 填 "r--"(紅色虛線,驗證損失),對應選項 C 的「A、D」組合。

02 情境

先感受問題:matplotlib 的格式字串怎麼讀?

Titanic MLP 工程師訓練 100 個 epoch,要畫出訓練和驗證損失的變化曲線。圖的描述已經告訴我們:訓練損失是「藍色實線」,驗證損失是「紅色虛線」。

matplotlib 的 plt.plot() 第三個參數是「格式字串」,格式是「顏色代碼 + 線型代碼」:

  • 顏色:b = 藍色(blue),r = 紅色(red)
  • 線型:- = 實線,-- = 虛線

所以藍色實線 = "b-",紅色虛線 = "r--"。空格 1 對應訓練損失(藍實線)= "b-",空格 2 對應驗證損失(紅虛線)= "r--"。

子敘述 E 說「驗證損失減少更明顯」,但題目描述是「訓練損失持續下降,驗證損失在 0.45 附近趨平」,明顯是訓練損失減少幅度更大,驗證損失反而趨平,所以 E 是錯的。

03 對照

逐一判斷 5 個子敘述

  1. 子敘述 A(正確):空格 1 對應訓練損失(藍實線),"b-" = 藍色(b)+ 實線(-),正確。
  2. 子敘述 B(錯誤):空格 2 對應驗證損失(紅虛線),"b--" = 藍色虛線,顏色錯了,應該是紅色虛線 "r--"。
  3. 子敘述 C(錯誤):空格 1 對應訓練損失(藍實線),"r-" = 紅色實線,顏色錯了,應該是藍色 "b-"。
  4. 子敘述 D(正確):空格 2 對應驗證損失(紅虛線),"r--" = 紅色(r)+ 虛線(--),正確。
  5. 子敘述 E(錯誤):題目說「訓練損失持續下降,驗證損失在 0.45 附近趨平」,表示訓練損失下降更多,驗證損失幾乎不再下降,子敘述 E 說「驗證損失減少更明顯」完全相反。
04 解法

對應圖的描述填入格式字串

根據題目給出的圖的描述:

  • 訓練損失:藍色實線 → plt.plot(epochs, loss, "b-", label="Training Loss")→ 空格 1 = "b-"
  • 驗證損失:紅色虛線 → plt.plot(epochs, val_loss, "r--", label="Validation Loss")→ 空格 2 = "r--"

正確的子敘述是 A(空格 1 = "b-")和 D(空格 2 = "r--"),對應選項 C 的「A、D」組合。

這就是選項 C 講的:A、D(子敘述 A 和 D 正確)

技術版:matplotlib 格式字串與損失曲線解讀

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

Step 1 純故事版(不出現程式碼)

想像你要畫一份「學生練習進度」的折線圖:藍色實線代表課堂練習分數(訓練),紅色虛線代表課外測驗分數(驗證)。

matplotlib 的格式字串就像「顏色 + 線型」的速記:b = 藍色(Blue),r = 紅色(Red);- = 實線,-- = 虛線。所以「藍色實線」是 "b-",「紅色虛線」是 "r--"。

從曲線的走勢判斷:訓練損失一直下降(模型在訓練資料上越來越好),驗證損失最後趨平(模型在沒見過的資料上效果趨於穩定,沒有明顯過擬合)。

Step 2 中文 ↔ 程式碼對照
白話說法程式碼
藍色實線"b-" b=藍色, -=實線
紅色虛線"r--" r=紅色, --=虛線
綠色點線"g:" g=綠色, :=點線
黑色點標記"ko" k=黑色, o=圓點標記
訓練損失曲線plt.plot(epochs, loss, "b-", label="Training Loss")
驗證損失曲線plt.plot(epochs, val_loss, "r--", label="Validation Loss")
Step 3 符號角色表
history.history["loss"]
每個 epoch 的訓練損失值(陣列),共 100 個值
history.history["val_loss"]
每個 epoch 的驗證損失值,來自 validation_split=0.2 切出的驗證集
validation_split=0.2
從 X_train 切出 20% 作為驗證集,這 20% 的資料不用於訓練梯度
"b-" / "r--"
matplotlib 的 format string:顏色字母 + 線型符號
過擬合的信號
訓練損失持續下降、驗證損失先降後升,代表模型開始「背答案」而非「學到規律」
Step 4 完整公式對應
matplotlib 顏色代碼(常用):
  b = blue(藍)  r = red(紅)  g = green(綠)
  k = black(黑) c = cyan(青) m = magenta(洋紅)
  y = yellow(黃)w = white(白)

matplotlib 線型代碼:
  -   = 實線(solid)
  --  = 虛線(dashed)
  -.  = 點劃線(dash-dot)
  :   = 點線(dotted)

組合範例:
  "b-"  → 藍實線  ← 空格 1(訓練損失)
  "r--" → 紅虛線  ← 空格 2(驗證損失)
  "b--" → 藍虛線  ← 子敘述 B 的錯誤(顏色應為紅)
  "r-"  → 紅實線  ← 子敘述 C 的錯誤(顏色應為藍)

損失曲線解讀:
  訓練損失持續下降 + 驗證損失趨平 = 輕微過擬合或已收斂
  訓練損失持續下降 + 驗證損失上升 = 明顯過擬合,需 Early Stopping
  兩條曲線都下降並趨平 = 理想情況,訓練成功收斂
Step 5 自我複述
  1. matplotlib 格式字串 "g:o" 代表什麼顏色、線型、標記?
  2. 訓練損失下降而驗證損失趨平,這代表模型有沒有問題?
  3. validation_split=0.2 和 validation_data=(X_val, y_val) 有什麼差異?
  4. Early Stopping 在損失曲線上對應什麼位置停下來?
  5. 如果驗證損失比訓練損失低(曲線在下方),這正常嗎?
05 陷阱

為什麼其他選項是錯的

選項 A B、C(空格 2 = "b--",空格 1 = "r-")

字面在說什麼:子敘述 B(空格 2 = "b--")和子敘述 C(空格 1 = "r-")是正確的。

為什麼不對:"b--" 是藍色虛線,但驗證損失應該是紅色虛線;"r-" 是紅色實線,但訓練損失應該是藍色實線。兩個都把顏色搞反了。選 B 和 C 是把訓練/驗證的顏色統統搞反的選項。

誰會選錯:對 "b" 和 "r" 的顏色記憶相反,以為 b = 紅色(red 的聯想?)、r = 藍色,或者把訓練/驗證的曲線說明讀混了。

選項 B A、C、D(空格 1 有衝突:同時是 "b-" 和 "r-")

字面在說什麼:子敘述 A(空格 1 = "b-")、子敘述 C(空格 1 = "r-")和子敘述 D(空格 2 = "r--")都正確。

為什麼不對:子敘述 A 說空格 1 = "b-",子敘述 C 說空格 1 = "r-",兩者對同一個空格給出不同答案,不可能同時正確。選項 B 同時包含這兩個矛盾的子敘述,本身就是自相矛盾。另外子敘述 C 本身也是錯的(訓練損失是藍色不是紅色)。

誰會選錯:沒注意到 A 和 C 對應同一個空格但答案不同,直接從感覺上選了「看起來包含最多正確答案」的組合。

選項 D C、D、E(空格 1 = "r-",驗證損失減少更明顯)

字面在說什麼:訓練損失是紅色實線,且驗證損失下降比訓練損失更明顯。

為什麼不對:子敘述 C 把訓練損失說成紅色(應為藍色),顏色錯了;子敘述 E 說驗證損失減少更明顯,但題目明確說「訓練損失持續下降,驗證損失在 0.45 附近趨平」,是訓練損失下降幅度更大,E 的描述完全相反。

誰會選錯:把「驗證損失趨平」誤解成「驗證損失也很好」,忽略了「持續下降 vs 趨平」的差異;同時顏色也記錯了。

06 變形

同個考點下次怎麼變形

變形 1 顏色代碼擴展

直覺:如果要畫三條曲線(訓練、驗證、測試),各用不同顏色,格式字串應該怎麼寫?

答案:訓練 "b-"(藍實線)、驗證 "r--"(紅虛線)、測試 "g-."(綠點劃線)。或者使用 color 參數明確指定:plt.plot(epochs, test_loss, color='orange', linestyle=':',label="Test Loss")。

變形 2 損失曲線診斷

直覺:本題的訓練/驗證損失曲線(訓練持續下降、驗證趨平),代表模型有沒有過擬合?

答案:輕微過擬合或接近收斂。訓練損失比驗證損失低(訓練表現 > 驗證表現),這是過擬合的徵兆,但驗證損失趨平而非上升,說明還沒到嚴重過擬合。實務上可嘗試 Early Stopping、Dropout、L2 正則化來進一步改善。

變形 3 validation_split

直覺:validation_split=0.2 把哪部分的資料切出去做驗證?是從頭切還是從尾切?

答案:Keras 預設從 X_train 的「末尾」切出 20%,所以最後 20% 的資料是驗證集,前 80% 是訓練集。如果資料有時間順序,這可能造成問題(用舊資料訓練、用新資料驗證)。如果想隨機分割,應該在輸入前先 shuffle 資料,或改用 validation_data 參數手動指定驗證集。

變形 4 history 物件

直覺:history.history 裡面還有什麼?怎麼取得每個 epoch 的準確率?

答案:history.history 是一個字典,keys 包含:"loss"(訓練損失)、"val_loss"(驗證損失)、"accuracy"(訓練準確率,如果 metrics=["accuracy"])、"val_accuracy"(驗證準確率)。取準確率:acc = history.history["accuracy"],然後 plt.plot(epochs, acc, label="Train Acc")。

變形 5 Early Stopping

直覺:如何在驗證損失不再下降時自動停止訓練?

答案:使用 Keras 的 EarlyStopping callback:`from keras.callbacks import EarlyStopping; es = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)`,然後 `model.fit(..., callbacks=[es])`。patience=10 表示驗證損失連續 10 個 epoch 沒有改善就停止,restore_best_weights=True 會把模型還原到驗證損失最低的那個 epoch。

07 延伸

想再往下看,這 5 個

出處

iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用 第 50 題

查看官方原文 PDF