葡萄酒工廠產線(14:32–15:53,NIR/FTIR 快速 QC)↗
今天的任務: 配製一系列已知濃度的醋酸標準品,量測 NIR 光譜,用 PLS 迴歸把光譜「翻譯」成濃度, 並學會用交叉驗證挑選模型複雜度、用獨立測試集誠實回報表現。
今天所有模型數字都來自 Colab NB11 的示範資料(和 Orange OR13 讀同一份資料、數字一致);課堂上各組量到自己的光譜後,再用同一條流程重做一次。
解法:不要直接解 60 個 b,先把光譜濃縮成少數幾個「潛在變數」——這就是 PLS。
| 模型 | 校正樣品 x₁=0.50, x₂=0.50 | 新樣品 x₁=0.52, x₂=0.50 |
|---|---|---|
| ŷ = x₁ + x₂ | 1.00 | 1.02 |
| ŷ = 11x₁ − 9x₂ | 1.00 | 1.22 |
兩個模型在校正樣品上都算出 1.00(一樣準);x₁ 只多了 0.02 的雜訊,第一個模型給 1.02,第二個卻給 1.22——係數越大、正負互相抵消的模型,越會放大雜訊。
| 新樣品 | 直線 | 4 次曲線 |
|---|---|---|
| x = 1.5(真值 1.5) | 1.56 | 0.75 |
| x = 4.5(真值 4.5) | 4.47 | 3.64 |
LV 數控制模型用了幾個潛在方向(latent variable):LV 越多越能貼住校正集(RMSEC↓),但貼到的可能是雜訊,新樣品反而變差(RMSECV、RMSEP↑)——PLS 對前處理後的輸入仍然是線性組合,增加 LV 不會讓它變成更高次的多項式;這裡的 4 次曲線只是拿來類比「配得太貼會犧牲新樣品表現」這個過擬合概念,不是說 PLS 本身在做多項式擬合。此圖為示意數字,不是 NB11 資料。
這種做法叫 leave-one-group-out(以 sample_id 分組);每一種 LV 數都要做一遍,才畫得出 RMSECV vs LV 曲線。
| 前處理(NB11) | 最佳 LV | 最小 RMSECV (% w/v) |
|---|---|---|
| raw(不做) | 3 | 0.458 |
| SNV | 2 | 0.400 |
| SG 一階導數 | 3 | 0.490 |
NB11 示範資料以 SNV 的 RMSECV 最小(LV=2),後面的圖表都用 SNV。換成你們班的資料,結論可能不同——所以每次都要比。
PLSRegression(scale=True)、Orange PLS widget 的 Scale 預設都是勾選。NB11 與 OR13 都保留預設,兩邊的數字才會一樣(RMSECV 0.400)。scale=False),比較 RMSECV 變大還是變小——一樣用 RMSECV 決定,不要猜。| 指標 | 公式 | 白話 |
|---|---|---|
| RMSE | √( Σe² ÷ n ) | 平均來說差多少(單位同濃度) |
| bias | Σe ÷ n | 整體偏高(+)或偏低(−)多少 |
| R² | 1 − Σe² ÷ Σ(y − ȳ)² | 模型解釋參考值變異的比例(W07 ↗) |
| RPD | SD(ytest) ÷ RMSEP | 樣品本身的差異是誤差的幾倍 |
e=殘差;n=光譜數;y=參考值(W4 滴定/配製濃度);ȳ=參考值平均;SD=標準差。用校正集算叫 RMSEC、交叉驗證叫 RMSECV、測試集叫 RMSEP。
bias=0 不代表沒有誤差:正負互相抵消了,所以 RMSE 和 bias 要一起看。
| 指標 | 意思 | NB11 數值 |
|---|---|---|
| RMSEC | 校正集自己考自己(偏樂觀) | 0.269% w/v |
| RMSECV | 分組交叉驗證,用來選 LV | 0.400% w/v |
| RMSEP | 獨立測試集,最終報告用這個 | 0.427% w/v |
| R²(test) | 模型解釋參考值變異的比例 | 0.929 |
| bias(test) | 測試集平均偏高/偏低 | −0.054% w/v |
| RPD | SD(ytest) 1.67 ÷ RMSEP | 3.91 |
| 測試樣品(參考值) | 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 的來源。
練習:把 PLS 的 Components 改成 1–6,看 ① 的 RMSE 何時最小。
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| 組別 | 儀器 | 波段 | 分光/偵測器 | 排除波段 | 前處理/LV | RMSEP(另一組模擬, % w/v) |
|---|---|---|---|---|---|---|
| G1 | InnoSpectra NIR-S-G1 | 900–1700 nm | DLP+單顆 InGaAs | — | SNV/2 | 0.122 |
| G2 | InnoSpectra R14 | 1600–2400 nm | DLP+延伸型 InGaAs | 排除 1885–1994 nm(水吸收飽和) | 一階導數/4 | 0.106 |
| G3 | Avantes 光纖光譜儀 | 900–1650 nm | 光柵+InGaAs 陣列 | — | SNV/2 | 0.132 |
| G4 | Avantes 光纖光譜儀(短波,淘寶購入、待到貨) | 600–1100 nm | 光柵+Si 陣列 | — | SNV/2 | 0.325 |
| G5 | NeoSpectra Micro Dev Kit | 1350–2500 nm | MEMS FT-NIR+單顆 InGaAs | 排除 1889–1987、2495–2500 nm(水吸收飽和) | SNV/2 | 0.129 |
| 時間 | 內容 |
|---|---|
| 0:00–0:55 | 講解:校正集設計、內插/外插、共線性與 LV、交叉驗證選 LV、誤差指標 |
| 0:55–1:35 | 配製標準系列(秤重稀釋濃醋/冰醋酸,抽風櫃操作),準備 W4 商用醋樣品 |
| 1:35–2:35 | NIR 量測(比色槽,每樣品 3 次重裝、各自存檔;先確認本組儀器可用比色槽穿透模式) |
| 2:35–3:30 | Orange OR13:SNV → PLS → Test and Score(以 sample_id 分組交叉驗證)挑 LV,再用測試集算 RMSEP |
| 3:30–4:00 | 全班彙整:各組 model report card、比較各儀器 RMSEP 與 RPD |
Colab NB11:在 Colab 開啟 NB11 ↗ ・入門(不用寫程式):Orange 流程 OR13 ↗。報告需附:model report card(前處理、LV 數、RMSEC/RMSECV/RMSEP、R²、bias、RPD、適用濃度範圍), 以及與另一台儀器模型的比較討論。
點一下打勾——確認自己真的會了。