iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用・114 年第二次・L23・第 47 題

KNN 搭配交叉驗證,哪幾組程式碼能正確執行?

原題

KNN 連題組第二題:研究人員在對 digits 資料集進行分類時,決定使用 KNN 並搭配交叉驗證來評估模型準確率。他們撰寫了四組不同的程式碼來進行 KNN 訓練與交叉驗證,但不確定哪幾組程式碼能正確執行並輸出準確率。請問哪幾組程式碼能正確使用 KNN 搭配交叉驗證,對 digits 資料集進行訓練並輸出準確率? 程式碼 A:使用 StratifiedKFold(n_splits=5, shuffle=True),scoring="accuracy" 程式碼 B:同 A,但 scoring="f1" 程式碼 C:使用 cv=5(整數),scoring="accuracy" 程式碼 D:同 C,但 scoring="f1"

白話

郵遞區號辨識專案的研究人員要用 KNN 分類手寫數字(digits 資料集,10 個類別:0-9),搭配 5 折交叉驗證評估準確率。他們寫了四組程式碼,兩組用 StratifiedKFold、兩組用整數 cv=5,差別在評估指標:accuracy 或 f1。

問你:四組程式碼中,哪幾組能不出錯地執行並輸出準確率?

一句話總結

能正確執行的只有程式碼 A 和程式碼 C(使用 scoring="accuracy"):digits 是 10 類別的多分類問題,scoring="f1" 的預設是二元分類用法,對多類別問題會報錯或警告,必須改成 "f1_macro" 或 "f1_weighted" 才能正常執行。

情境

先感受問題:f1 指標的「二元預設陷阱」

郵遞區號辨識系統要分辨 0-9 共 10 種數字,這是標準的多分類(multiclass)問題。研究人員用 sklearn 的 cross_val_score 評估 KNN,試了兩種評估指標:accuracy 和 f1。

accuracy 很直觀:答對幾題除以總題數,10 類別也適用。

f1 就有問題了:sklearn 的 cross_val_score 傳入 scoring="f1" 時,預設假設這是「二元分類」問題(只有正例和負例兩類)。一旦偵測到是多類別問題,就會拋出錯誤:「Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted']。」

程式碼 B 和 D 都是 scoring="f1" 的版本,兩個都會出錯。

舊方法

f1 指標用錯場景,為什麼會出錯?

  1. f1 預設是 average='binary':sklearn 的 f1_score 函數,average 參數預設是 'binary',只適合兩類別(0 和 1)的分類問題。
  2. digits 是 10 類別(0-9):每個樣本的 y 值可以是 0、1、2、...、9,不是二元問題,使用 average='binary' 的 f1 會立刻報錯。
  3. StratifiedKFold 和 cv=5 都是交叉驗證策略,沒有問題:StratifiedKFold 是更精確的版本,確保每折的類別比例一致;cv=5 是整數,sklearn 預設用 StratifiedKFold 處理分類問題,兩者都合法。
  4. 多分類的 f1 需要指定平均方式:scoring="f1_macro"(各類別 f1 取算術平均)或 scoring="f1_weighted"(按類別樣本數加權平均)才能在多分類問題上正確運行。
  5. accuracy 沒有二元/多元的限制:accuracy 是「答對/全部」,對任意類別數的問題都適用,不需要指定平均方式。

新方法

只有 accuracy 能在多分類上直接用

逐一分析四組程式碼:

  • 程式碼 A(StratifiedKFold + accuracy):兩個設定都正確,能正常執行輸出準確率。
  • 程式碼 B(StratifiedKFold + "f1"):f1 預設 average='binary',digits 是 10 分類,報錯:ValueError。
  • 程式碼 C(cv=5 + accuracy):cv=5 整數在分類問題上等同 StratifiedKFold(5),accuracy 沒問題,能正常執行。
  • 程式碼 D(cv=5 + "f1"):和 B 同樣問題,f1 在多分類上無法使用,報錯。

能正確執行的是 A 和 C,共同特點是都用 scoring="accuracy"。

這就是選項 B 講的:程式碼 A、程式碼 C。

錯選項

為什麼其他選項是錯的

A全部四組都正確

字面在說什麼

A、B、C、D 四組程式碼都能正確執行並輸出準確率。

為什麼不對

程式碼 B 和 D 使用 scoring="f1",sklearn 的 f1 預設是 average='binary',不適用於 10 類別的 digits 資料集,執行時會拋出 ValueError。四組全部能跑是錯誤的。

誰會選錯

沒注意到 f1 有「二元/多類別」的限制,以為 f1 是萬用的評估指標,任何分類問題都能用 scoring="f1"。

C只有 A 和 B(StratifiedKFold 那兩組)

字面在說什麼

使用 StratifiedKFold 的 A 和 B 能跑,cv=5 整數的 C 和 D 不行。

為什麼不對

cv=5 整數在分類問題上,sklearn 預設用 StratifiedKFold(5) 處理,效果等同程式碼 A 的設定(不含 shuffle=True,但功能上完全合法)。選項 C 的問題不在 cv=5,而在 scoring="accuracy" 完全沒問題。選項 D 的問題不在 cv=5,而在 scoring="f1"。

誰會選錯

誤以為 cv=整數是「不精確」或「錯誤」的用法,以為只有明確指定 StratifiedKFold 物件才算「正確」,忽視了 sklearn 會自動把整數 cv 轉換成 Stratified 交叉驗證。

D只有 C 和 D(cv=5 那兩組)

字面在說什麼

使用 cv=5 整數的 C 和 D 能跑,StratifiedKFold 的 A 和 B 有問題。

為什麼不對

StratifiedKFold 完全合法且是更明確的寫法,程式碼 A 絕對能正確執行。選項 D 裡的程式碼 D(cv=5 + scoring="f1")同樣因為 f1 的多分類問題而出錯,和程式碼 B 一樣。

誰會選錯

誤以為 StratifiedKFold 有什麼問題,或者搞錯了哪組用了什麼 scoring,沒仔細對應每組程式碼的設定。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

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

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。