食品分析實驗 · W13
← → / 空白鍵切頁 · F 全螢幕 · 點兩側翻頁
食品分析實驗 · W13

PLS 迴歸定量 I:醋酸

Quantitative NIR Calibration — PLS Regression for Acetic Acid
食品分析實驗 · 4 小時課程 · 各組使用各自的 NIR
校正集設計 · 共線性與 LV · 分組交叉驗證選 LV · RMSEC/RMSECV/RMSEP · RPD · 儀器間比較
PLS 迴歸分組交叉驗證RMSECVRPDOrange OR13 / Colab NB11
開始前,先看一段酒廠影片
酒廠用 NIR/FTIR 快篩品質,
但模型的準確度從哪裡來?

葡萄酒工廠產線(14:32–15:53,NIR/FTIR 快速 QC)↗

今天最核心的一句話:葡萄酒與醋的產線都用光譜儀快篩成分,但光譜儀本身不知道「答案」—— 它是靠一批已知參考值(reference value)的樣品「教」出來的。 這批參考值今天就是 W4 手動滴定的醋酸度數據。 參考方法的系統性偏差會直接帶進校正;參考值的獨立隨機誤差則會墊高驗證的 RMSEP——這句話貫穿今天整堂課。

今天的任務: 配製一系列已知濃度的醋酸標準品,量測 NIR 光譜,用 PLS 迴歸把光譜「翻譯」成濃度, 並學會用交叉驗證挑選模型複雜度、用獨立測試集誠實回報表現。

W13 / PLS COURSE TOUR

PLS 醋酸定量:先分組,再誠實驗證

完整旁白與字幕;使用 NB11 模擬光譜。 獨立播放器與下載 · 互動實驗

W13 / PREDICT · OBSERVE · EXPLAIN

六幕互動:分組、PLS、鎖定與測試

今天的學習目標

上完 W13,你應該會…

  • 說出 PLS 怎麼用 LV 解決「波長多、樣品少、共線性」,和 PCA 差在哪
  • 設計校正集/測試集,分辨內插與外插
  • 用分組交叉驗證選 LV,認出欠擬合/過擬合
  • 會算 RMSE/bias/R²/RPD 並用 RPD 分級
  • 解釋參考方法的偏差與隨機誤差如何影響校正與 RMSEP
  • 在 Orange 跑通 OR13,看懂等效 sklearn 程式
  • 完成本組 PLS 建模與 model report card
  • 說出模型為何不能直接跨儀器套用

今天所有模型數字都來自 Colab NB11 的示範資料(和 Orange OR13 讀同一份資料、數字一致);課堂上各組量到自己的光譜後,再用同一條流程重做一次。

校正集設計

標準品要涵蓋範圍,測試集絕不能拿來調參

  • 濃醋稀釋成 14 個等間距標準品(0–10% w/v),再加 2 支醋(其中白醋有 W4 滴定值)
  • Kennard–Stone(KS)=挑最能撐滿光譜空間的樣品當校正集:先挑光譜差最多的兩個,之後每次挑「離已選樣品最遠」的那一個
  • KS 用每個樣品的平均光譜來挑;但建模時 3 次重裝各自存檔、不平均,3 條都當成獨立的列
  • 同一樣品的 3 條光譜要整組放在同一邊,否則就是資料外洩(data leakage),誤差會假性偏低
  • 測試集只在最後用一次算 RMSEP——絕不能拿來挑 LV 數或前處理
NB11/OR13 示範資料(16 個樣品 × 3 次重裝):

校正集 12 個樣品(36 條光譜),含 0% 與 10% 兩端點+商用醋B
測試集 4 個樣品(12 條光譜):STD-06(4.62%)、STD-08(6.15%)、STD-11(8.46%)、白醋(W4 滴定)(4.50%)
白醋固定放測試集,當「已知答案的真實樣品」查核點;其餘由 KS 決定。
配製範例(C₁V₁=C₂V₂):由 9.0% 醋酸配 100 mL 的 4.00% 標準品:V₁ = 4.00 × 100 ÷ 9.0 = 44.44 mL,加水定量至 100 mL。
內插 vs 外插

模型只在它看過的濃度範圍裡可信

校正範圍 0–10%:內插(模型看過這一段)外插(沒看過)024681012醋酸濃度 (% w/v)?
  • 內插(interpolation):新樣品落在校正範圍(0–10%)裡面——模型在附近有樣品撐著,預測可信
  • 外插(extrapolation):新樣品落在範圍外面(例如 12%)——模型沒看過,光譜和濃度的關係可能已經不一樣
  • 所以 0% 與 10% 兩端一定留在校正集(藍點=校正集、橘三角=測試集,全部落在範圍內);報告要寫適用範圍(applicability domain):本模型只適用 0–10% w/v 醋酸水溶液
從標準曲線到整條光譜

W07 只用一個波長;今天要用整條光譜

標準曲線(一個波長):A = m·C + b
反過來用:C = (A − b) ÷ m

整條光譜(很多波長):
ŷ = b₀ + b₁x₁ + b₂x₂ + … + bpxp
   = b₀ + Σ bjxj
  • 標準曲線與 R²、RMSE 見 W07 標準曲線與驗證指標 ↗
  • ŷ=預測的醋酸濃度;xj=第 j 個波長的吸光度;bj=這個波長的權重(係數);p=波長數
  • 直接解出每個 bj 叫多元線性迴歸(MLR),W07 手持 Brix 儀用幾個濾光片就是這樣做
⚠️
問題:未知數比方程式多
示範資料每條光譜有 60 個波長(實機 InnoSpectra 是 228 個),但校正集只有 12 個樣品(36 條光譜)。
要解 61 個以上的 b,只有 12 個「已知答案」——MLR 會有無限多組解,而且相鄰波長幾乎一起動(下一頁:共線性)。

解法:不要直接解 60 個 b,先把光譜濃縮成少數幾個「潛在變數」——這就是 PLS。

共線性(collinearity)

兩個波長幾乎同步變化,係數就估不穩

  • 相鄰波長的吸光度幾乎一起升降:x₁ ≈ x₂,相關係數 r ≈ 1(相關係數見 W04 方法比較 ↗)
  • 這時很多組不同的係數,在校正樣品上都一樣準——MLR 分不出哪一組才對
  • 挑錯一組,新樣品只差一點點雜訊,預測就被放大成大誤差
  • PLS 不直接解每個波長的係數,而是先把一起動的波長合併成 LV,係數自然穩定
模型校正樣品
x₁=0.50, x₂=0.50
新樣品
x₁=0.52, x₂=0.50
ŷ = x₁ + x₂1.001.02
ŷ = 11x₁ − 9x₂1.001.22

兩個模型在校正樣品上都算出 1.00(一樣準);x₁ 只多了 0.02 的雜訊,第一個模型給 1.02,第二個卻給 1.22——係數越大、正負互相抵消的模型,越會放大雜訊。

PLS 的解法:潛在變數(LV)

把 60 個波長加權相加成少數幾個新變數

① 光譜 X:60 個波長x₁, x₂, …, x₆₀(SNV 後)② 每個波長一個權重 wNB11 第 1 個 LV 的權重(橘=隨濃度增加)③ LV 分數 tt = Σ wⱼ·xⱼ④ 濃度 ŷŷ = b₀ + q₁t₁ + q₂t₂
LV 太少 / 太多

LV 數=模型的複雜度,要剛剛好

📉
LV 太少:欠擬合(underfitting)
模型抓不到訊號 → RMSEC 與 RMSECV 都偏高、而且很接近;預測-參考圖呈系統性彎曲,殘差有規律型態
📈
LV 太多:過擬合(overfitting)
模型開始把雜訊當訊號 → RMSEC 一路下降,RMSECV 卻回升;LV 數遠多於化學上合理的成分數(醋酸、水、散射)
過擬合長什麼樣子

曲線穿過每一點,新樣品卻預測得更差

x(示意)— 直線(少彎)— 4 次曲線(穿過每一點)◆ 新樣品(真值)
  • 5 個點(黑點)有一點量測雜訊;直線沒穿過每一點,4 次曲線全部穿過(校正誤差=0)
  • 但換兩個新樣品(綠菱形)來預測:
新樣品直線4 次曲線
x = 1.5(真值 1.5)1.560.75
x = 4.5(真值 4.5)4.473.64

LV 數控制模型用了幾個潛在方向(latent variable):LV 越多越能貼住校正集(RMSEC↓),但貼到的可能是雜訊,新樣品反而變差(RMSECV、RMSEP↑)——PLS 對前處理後的輸入仍然是線性組合,增加 LV 不會讓它變成更高次的多項式;這裡的 4 次曲線只是拿來類比「配得太貼會犧牲新樣品表現」這個過擬合概念,不是說 PLS 本身在做多項式擬合。此圖為示意數字,不是 NB11 資料。

交叉驗證怎麼做

每次拿走一個樣品當考生,輪流 12 次

123456789101112第 1 輪第 2 輪第 3 輪⋮第 12 輪建模用(11 個樣品 × 3 條光譜)被拿走、拿來預測(1 個樣品的 3 條光譜)
  • 每一輪拿走 1 個樣品(連同它的 3 條光譜),用其餘 11 個建模、預測被拿走的那個;重複 12 輪,收集 36 個「沒看過自己」的預測值 → 算出 RMSECV
  • 若把同一樣品的 3 條重複拆到兩邊=資料外洩:模型「認得」那支比色槽,RMSECV 假性偏低
  • Orange:Test and Score → Cross validation by feature → sample_id(OR13 已設好)

這種做法叫 leave-one-group-out(以 sample_id 分組);每一種 LV 數都要做一遍,才畫得出 RMSECV vs LV 曲線。

水與前處理

前處理該選哪一種?用 RMSECV 比,不要猜

  • 水在 NIR 中訊號最強(約 1450 nm 的 O–H 大帶),醋酸的訊號藏在旁邊,靠 C–H/O–H 局部形狀的微小改變顯現
  • 比色槽重裝會造成整條光譜上下平移、傾斜——跟濃度無關,要先扣掉
  • SNV=每條光譜減自己的平均、除以自己的標準差;SG 一階導數=局部多項式平滑後取斜率(W11 前處理 ↗)
前處理(NB11)最佳 LV最小 RMSECV (% w/v)
raw(不做)30.458
SNV20.400
SG 一階導數30.490

NB11 示範資料以 SNV 的 RMSECV 最小(LV=2),後面的圖表都用 SNV。換成你們班的資料,結論可能不同——所以每次都要比。

PLS 預設會 autoscale

Orange 的 Scale 勾選框:每個波長先除以自己的 SD

⚖️
autoscale 在做什麼
每個波長(每一欄)先減自己的平均、再除以自己的標準差(SD)——讓每個波長的「音量」一樣大,變化小的波長也會被放大來看。
🔧
sklearn 與 Orange 都預設開著
sklearn PLSRegression(scale=True)、Orange PLS widget 的 Scale 預設都是勾選。NB11 與 OR13 都保留預設,兩邊的數字才會一樣(RMSECV 0.400)。
🔁
跟 W12 PCA 的建議不同
W12 PCA ↗ 建議光譜做 PCA 時通常不 autoscale(會放大雜訊波長)。PLS 這裡用軟體預設,別把兩週的設定搞混。
🧪
自己試試看
在 Orange 把 PLS 的 Scale 取消勾選(或 sklearn 設 scale=False),比較 RMSECV 變大還是變小——一樣用 RMSECV 決定,不要猜。
數據・LV選擇

選 LV 數:RMSECV 的最小值 vs RMSEC 一路下降

NB11 示範資料(前處理:SNV,以 sample_id 分組交叉驗證)。RMSEC 隨 LV 增加持續下降;RMSECV 在 LV=2 最小(0.400),之後回升再持平——LV=2 之後 RMSEC 的下降只是在配適校正集裡的雜訊,屬於過擬合。
小遊戲 ①這是欠擬合(underfitting)還是過擬合(overfitting)的徵兆?0 / 8
把下面 8 個現象分到「欠擬合」或「過擬合」。
誤差怎麼算

殘差 e = 預測 − 參考;四個指標都從 e 算出來

指標公式白話
RMSE√( Σe² ÷ n )平均來說差多少(單位同濃度)
biasΣe ÷ n整體偏高(+)或偏低(−)多少
R²1 − Σe² ÷ Σ(y − ȳ)²模型解釋參考值變異的比例(W07 ↗)
RPDSD(ytest) ÷ RMSEP樣品本身的差異是誤差的幾倍

e=殘差;n=光譜數;y=參考值(W4 滴定/配製濃度);ȳ=參考值平均;SD=標準差。用校正集算叫 RMSEC、交叉驗證叫 RMSECV、測試集叫 RMSEP。

小例子:4 個殘差 e = 0.2、−0.1、0.1、−0.2

Σe² = 0.04 + 0.01 + 0.01 + 0.04 = 0.10
RMSE = √(0.10 ÷ 4) = √0.025 ≈ 0.158
bias = (0.2 − 0.1 + 0.1 − 0.2) ÷ 4 = 0

bias=0 不代表沒有誤差:正負互相抵消了,所以 RMSE 和 bias 要一起看。

品質指標(Figures of merit)

模型成績單(model report card):SNV、2 個 LV

指標意思NB11 數值
RMSEC校正集自己考自己(偏樂觀)0.269% w/v
RMSECV分組交叉驗證,用來選 LV0.400% w/v
RMSEP獨立測試集,最終報告用這個0.427% w/v
R²(test)模型解釋參考值變異的比例0.929
bias(test)測試集平均偏高/偏低−0.054% w/v
RPDSD(ytest) 1.67 ÷ RMSEP3.91
RPD 分級(全課程統一)
< 2:不足
2–2.5:粗篩
2.5–3:篩選
▶ 3–5:品管定量(本模型 3.91)
> 5:優良
RPD 只描述這批測試集的相對表現:RPD 隨測試集本身的濃度分散程度而變,這裡測試集只有 4 個獨立樣品,數字會有運氣成分;是否真的適合「品管定量」,還要看 RMSEP、bias、允收誤差,並用更多獨立樣品驗證,不能單靠 RPD 級距下結論。
參考方法的隨機誤差會墊高 RMSEP:W4 滴定(單次)的標準差約 0.05% w/v,若參考值只取單次滴定,RMSEP 很難有意義地小於它;若算出來遠小於它,先懷疑資料外洩。(系統性偏差則是另一回事——會直接偏移校正,且不會因為多樣品而消失;若參考值本身是多次平均,這個下限也會跟著變小。)
預測 vs 參考值

校正集(交叉驗證) 與 測試集,對照 1:1 線

測試樣品(參考值)3 次重裝的殘差 e
STD-06(4.62)+0.72、+0.16、−0.26
STD-08(6.15)+0.64、−0.12、−0.15
STD-11(8.46)−0.25、−0.02、−0.17
白醋(W4 滴定)(4.50)−0.62、+0.19、−0.78

NB11 示範資料。藍點=校正集的交叉驗證預測;橘三角=測試集(最終模型)。點越貼近對角線越準;整體偏高或偏低就是 bias。右表 12 個殘差就是 RMSEP 0.427 的來源。

小遊戲 ②計算闖關:用上一頁的 12 個殘差算 RMSEP未作答
上一頁測試集 4 個樣品 × 3 次重裝,共 12 個殘差(預測−參考,% w/v):+0.72、+0.16、−0.26、+0.64、−0.12、−0.15、−0.25、−0.02、−0.17、−0.62、+0.19、−0.78。求 RMSEP。公式:RMSEP = √( Σe² ÷ n ),n = 12。
% w/v
Orange 實作:OR13

File → SNV → Select Rows → PLS → 兩個 Test and Score

Fileor13_acetic.csv16 樣品 × 3Preprocess SpectraSNVSelect Rowssplit = calibration其餘=測試集PLSComponents = 2Scale ✓(預設)Test and Score ①CV by feature: sample_idRMSE → RMSECVTest and Score ②Test on test dataRMSE → RMSEPScatter Plot參考 vs 預測
  • Test and Score ① 只接校正集(Select Rows 的 Matching),選 Cross validation by feature → sample_id:RMSE 欄 = RMSECV 0.400
  • Test and Score ② 另接測試集(Unmatched → Test Data),選 Test on test data:RMSE 欄 = RMSEP 0.427

練習:把 PLS 的 Components 改成 1–6,看 ① 的 RMSE 何時最小。

🐍 等效 sklearn(Colab NB11)
pls = PLSRegression(n_components=2)   # scale=True 預設
y_cv = cross_val_predict(pls, X_cal, y_cal,
        groups=sample_id, cv=LeaveOneGroupOut())
pls.fit(X_cal, y_cal)
y_pred = pls.predict(X_test)      # → RMSEP
另一組模擬(全班 5 台 NIR)

儀器與波段比較:RMSEP 一起攤開來看

組別儀器波段分光/偵測器排除波段前處理/LVRMSEP(另一組模擬, % w/v)
G1InnoSpectra NIR-S-G1900–1700 nmDLP+單顆 InGaAs—SNV/20.122
G2InnoSpectra R141600–2400 nmDLP+延伸型 InGaAs排除 1885–1994 nm(水吸收飽和)一階導數/40.106
G3Avantes 光纖光譜儀900–1650 nm光柵+InGaAs 陣列—SNV/20.132
G4Avantes 光纖光譜儀(短波,淘寶購入、待到貨)600–1100 nm光柵+Si 陣列—SNV/20.325
G5NeoSpectra Micro Dev Kit1350–2500 nmMEMS FT-NIR+單顆 InGaAs排除 1889–1987、2495–2500 nm(水吸收飽和)SNV/20.129
注意:這一頁是另一組模擬,不是 NB11 資料——把同一批 16 個醋酸樣品,依各台的波段、解析度與雜訊重新模擬光譜、各自建 PLS(教學模擬,非實測),只用來比較儀器之間的相對好壞,數字不要和前面 NB11 的 RMSEP 直接比。
短波 600–1100 nm 只剩醋酸 C–H 第三倍頻(約 905 nm,≈4ν),訊號最弱、RMSEP 最大;長波(R14、NeoSpectra)有 C–H 第一倍頻(約 1705 nm,≈2ν)與組合頻(約 2270 nm),訊號最強(倍頻見 W10 倍頻 ↗)——但 1 mm 光徑下水在約 1940 nm 吸收飽和,建模前要排除這段。
模型不能跨儀器直接套用:儀器 A 的模型拿到儀器 B 上通常有明顯偏差,要重新校正,或做校正轉移(calibration transfer)=量一小批兩台都量過的共同樣品,算出把 B 的光譜「翻譯」成 A 的樣子的換算,再沿用 A 的模型。
4 小時課程時間表

講解 → 配標準品 → 量測 → Orange 建模 → 比較

時間內容
0:00–0:55講解:校正集設計、內插/外插、共線性與 LV、交叉驗證選 LV、誤差指標
0:55–1:35配製標準系列(秤重稀釋濃醋/冰醋酸,抽風櫃操作),準備 W4 商用醋樣品
1:35–2:35NIR 量測(比色槽,每樣品 3 次重裝、各自存檔;先確認本組儀器可用比色槽穿透模式)
2:35–3:30Orange OR13:SNV → PLS → Test and Score(以 sample_id 分組交叉驗證)挑 LV,再用測試集算 RMSEP
3:30–4:00全班彙整:各組 model report card、比較各儀器 RMSEP 與 RPD
安全守則

冰醋酸腐蝕/易燃、比色槽操作

🧪
冰醋酸具腐蝕性且易燃、氣味刺鼻
全程在抽風櫃內操作,戴手套與護目鏡,遠離火源
🧤
稀釋時務必先加水
配製標準品時緩慢將醋酸加入水中並搖勻,勿反向操作
🔬
比色槽先確認穿透模式
務必向 TA 確認本組 NIR 的哪個配置支援比色槽穿透量測,光路方向裝反會整批白做
🧴
比色槽用畢立即沖洗
避免醋酸殘留腐蝕槽體或干擾下一位同學的量測
小遊戲 ③PLS 建模流程排序— / 8
用 ▲▼ 把 PLS 定量建模的 8 個步驟排成正確順序。
小遊戲 ④校正集 vs 測試集:這個用途屬於哪一個?0 / 8
把 8 個敘述分到「校正集」或「測試集」。
小遊戲 ⑤PLS 原理 即時測驗0 / 6
小遊戲 ⑥決策挑戰:儀器與品質判讀0 / 5
課後作業

Colab NB11

📥
整理本組光譜與濃度
本組校正集/測試集的光譜與 W4 滴定參考值,確認長格式資料無誤(3 次重裝共用同一個 sample_id)
📈
畫 RMSECV vs LV
用以 sample_id 分組的交叉驗證選出本組資料的最佳 LV 數,附上圖表
📊
算齊六個品質指標
RMSEC、RMSECV、RMSEP、R²、bias、RPD,附計算過程與 RPD 分級
🆚
跟其他組儀器比較
找一組不同儀器/波段的同學,比較 RMSEP 並討論可能原因

Colab NB11:在 Colab 開啟 NB11 ↗ ・入門(不用寫程式):Orange 流程 OR13 ↗。報告需附:model report card(前處理、LV 數、RMSEC/RMSECV/RMSEP、R²、bias、RPD、適用濃度範圍), 以及與另一台儀器模型的比較討論。

自我檢核

今天結束,你應該會…

點一下打勾——確認自己真的會了。

EN