🗺️ AI 學習與考證地圖
中級科目二程式實戰 · 不平衡資料評估

同一份預測,兩個 F1:
0.6465 誠實、0.9298 被多數類拉高

1050 筆資料、少數類只有 50 筆。三行 print 考三件事:macro(各類平權平均)、weighted(按樣本數加權)、recall(少數類抓回幾成)。實跑輸出 0.6465、0.9298、0.4——weighted 被佔 95.2% 的多數類支配,把少數類 F1 只有 0.3333 的慘況遮得乾乾淨淨。下半題考門檻:實跑機率模型從 0.5 降到 0.1,recall 0.271 → 0.712、誤報 3 → 93 筆——升的跟付出的一起看,才是完整的判讀。

閱讀模式

00題目

少數類別標記為 1。執行下列程式後,輸出與門檻調整的判讀何者正確?

from sklearn.metrics import f1_score, recall_score        # 拿出兩把評分尺
y_true = [0]*1000 + [1]*50                              # 正解:1000 個 0 接 50 個 1
y_pred = [0]*950 + [1]*50 + [0]*30 + [1]*20              # 預測:四段對四格(下面解剖)
print(round(f1_score(y_true, y_pred, average='macro'), 4))     # 各類平權平均
print(round(f1_score(y_true, y_pred, average='weighted'), 4))  # 按樣本數加權
print(round(recall_score(y_true, y_pred), 4))                 # 預設只報正類(=1)的 recall

先說:巨無霸班級的兩種「平均」

想像兩個班考同一份試:1000 人的大班考 96 分50 人的小班只考 33 分。「全校表現」怎麼報?各班平權——(96+33)÷2 ≈ 64.65:小班的慘況佔一半版面,藏不住。按人頭平均——大班佔 95.2% 權重,算出來 ≈ 92.98:小班 50 個人被 1000 個人的好成績淹沒。

這正是 macro 與 weighted 的差別。而不平衡任務裡你在乎的通常就是那個小班(詐欺、罕病、流失客戶——少數類標記為 1)——所以本題的三個輸出裡,最誠實的是 macro 的 0.6465 與少數類 recall 的 0.4,最會「報喜」的是 weighted 的 0.9298。

三個先立好的事實: macro = 各類 F1 的平權平均——類再小,發言權一樣大。 weighted = 按各類樣本數(support)加權——誰人多聽誰的。 recall_score 二元預設只報正類(pos_label=1)——本題就是少數類抓回幾成:20/50 = 0.4。

先點開看:macro 平均weighted 平均recall 的分母是誰

不熟 AI 專有名詞?你需要先認識下列名詞

點擊後出現漸進式說明:白話說明 → 說清楚一點 → 常見錯誤與考點。

三種平均
macro 平均weighted 平均micro=accuracysupport 支持度
四格與三把尺
混淆矩陣四格precision:分母是預測recall:分母是真實F1 調和平均
門檻的世界
門檻 thresholdpredict_probaP–R 拉鋸誤報與漏抓
不平衡的老朋友
類別不平衡準確率的假象(第 3 頁回聲)macro 與 weighted 誰大classification_report

不熟 Python?你需要先認識下列名詞

點擊後出現漸進式說明

把工具拿進來
importfrom模組 module
造清單的快寫
[0]*1000 清單乘法+ 清單串接= 指派變數與命名
呼叫與輸出
( ) 呼叫括號關鍵字引數'macro' 字串設定printround 四捨五入. 點運算子方法 method

01逐行拆解:第 1 行到第 6 行

六行,一行一行走完。右上角的「看位置」可以把這一行放回完整程式裡看。

第 1 行拿出兩把評分尺
from sklearn.metrics import f1_score, recall_score   # 評估抽屜,一次拿兩件

sklearn.metrics 是評估工具的抽屜——系列第 2 頁(混淆矩陣)、第 3 頁(不平衡陷阱)都來過。這次拿 f1_score(precision 與 recall 的調和平均)與 recall_score(抓回率)。

相關名詞:F1 調和平均模組 module

第 2 行正解:1000 個 0 接 50 個 1
y_true = [0]*1000 + [1]*50   # 清單乘法+串接:前 1000 筆是 0、後 50 筆是 1

[0]*1000清單乘法:把 [0] 複製 1000 份;+ 把兩段串接起來——共 1050 筆,前 1000 筆真實為 0(多數類)、後 50 筆真實為 1(少數類)。1000 : 50 = 20 : 1 的不平衡——題目說「少數類別標記為 1」,指的就是這 50 筆。

相關名詞:[0]*1000 清單乘法+ 清單串接類別不平衡

第 3 行預測:四段剛好對混淆矩陣四格
y_pred = [0]*950 + [1]*50 + [0]*30 + [1]*20   # 950 TN|50 FP|30 FN|20 TP

把它跟 y_true 逐位置對齊就是解題鑰匙:前 1000 個位置真實為 0——其中 950 筆預測 0(TN)、50 筆預測 1(FP 誤報);後 50 個位置真實為 1——其中 30 筆預測 0(FN 漏抓)、20 筆預測 1(TP 抓到)。四段依序就是 TN、FP、FN、TP——考場 30 秒拆段法,02 節實驗室把四格攤開。

出題者的好心:y_pred 的段落刻意照「真實 0 的 1000 筆、真實 1 的 50 筆」分段寫——段落長度直接就是四格數字,不用真的逐筆對。看到這種 [0]*a + [1]*b + ... 寫法,先把段落長度抄成 2×2。

相關名詞:混淆矩陣四格誤報與漏抓

第 4 行macro F1:各類平權平均 → 0.6465
print(round(f1_score(y_true, y_pred, average='macro'), 4))   # (0.9596 + 0.3333) ÷ 2 = 0.6465

先各類算自己的 F1:類 0 是 0.9596、類 1 只有 0.3333;macro 把兩個數平權平均——(0.9596+0.3333)÷2 = 0.6465。小班考砸,全校成績直接被拖下來——藏不住

相關名詞:macro 平均關鍵字引數

第 5 行weighted F1:按人頭加權 → 0.9298
print(round(f1_score(y_true, y_pred, average='weighted'), 4))   # 0.952×0.9596 + 0.048×0.3333 = 0.9298

同樣的兩個班級 F1,改用樣本數當權重:類 0 佔 1000/1050 = 95.2%、類 1 只佔 4.8%——0.952 × 0.9596 + 0.048 × 0.3333 = 0.9298少數類在這個平均裡幾乎沒有發言權——這就是答案 A 說的「weighted F1 受多數類別支配」。

相關名詞:weighted 平均support 支持度

第 6 行recall:預設只報正類 → 0.4
print(round(recall_score(y_true, y_pred), 4))   # 20 ÷ 50 = 0.4:50 個真正例只抓到 20 個

二元的 recall_score 沒指定就只報正類(pos_label=1):真實為 1 的 50 筆裡抓到 20 筆——20/50 = 0.4分母是「真實為 1」的 50,不是「預測為 1」的 70——把分母搞混,就會算出 20/70 ≈ 0.2857,那是 precision——選項 C 的死因預告。

分母口訣(本頁反覆用):precision 的分母是「預測為 1」(70 筆)、recall 的分母是「真實為 1」(50 筆)——P 問「喊有病的裡面幾個真的病」、R 問「真的病的裡面抓到幾個」。

相關名詞:recall:分母是真實precision:分母是預測round 四捨五入

02混淆矩陣解剖:四段變四格

把第 3 行的四段填進 2×2(本站實跑 confusion_matrix 驗證)。點任一格,看它餵給哪些指標:

互動實驗室:混淆矩陣解剖點格子,看誰的分子、誰的分母
預測 0
預測 1
真實 0
(1000)
950
TN 真陰
50
FP 誤報
真實 1
(50)
30
FN 漏抓
20
TP 抓到
類別precisionrecallF1support
類 0(多數)0.96940.95000.95961000
類 1(少數=正類)0.28570.40000.333350
本站實跑(classification_report 同值):類 1 的三個數全部由三個格子決定——precision = TP/(TP+FP) = 20/70 = 0.2857、recall = TP/(TP+FN) = 20/50 = 0.4、F1 = 兩者調和平均 = 0.3333。多數類三個數都漂亮(0.95 上下)——兩班成績差這麼多,接下來就看你用哪種「平均」報告它

03三種平均比較器:同兩個班,三種報法

類 0 的 F1 = 0.9596、類 1 的 F1 = 0.3333——average 參數決定怎麼把兩個數揉成一個:

互動實驗室:平均比較器macro/weighted/micro 三種報法
這種平均的答案
0.6465
題目第 4 行的輸出
類 0 的發言權
50%
在這種平均裡的權重
類 1 的發言權
50%
少數類被聽見多少
什麼時候用哪個:在乎少數類(詐欺、罕病、流失)→ 看 macro 或乾脆各類分開看(classification_report);要一個「整體帳面」且接受多數類主導 → weighted;micro 在單標籤情境就等於 accuracy(實跑 0.9238)——它跟第 3 頁的「準確率假象」是同一個陷阱的兩張臉。

相關名詞:macroweightedmicro=accuracy

04門檻滑桿:降門檻,recall 與誤報一起漲

答案 A 的下半句要親手拉過才有感。本站訓練一個機率模型(1050 筆測試、59 個正例——跟題目同等級的不平衡),把「判為 1」的門檻從 0.9 一路降到 0.05:

互動實驗室:門檻滑桿recall 升、precision 掉、誤報漲——實跑數字
正類門檻 0.50
recall(59 個正例抓到幾成)
0.271
TP = 16
誤報 FP
3
正常樣本被冤枉的筆數
precision
0.842
F1 = 0.410
本站實跑全表:門檻 0.9 → 0.05:recall 0.068 → 0.797(一路升)、FP 0 → 218(一路漲)、precision 1.000 → 0.177(一路掉)。「降低正類門檻通常可提高 recall,但可能增加誤報」——一句話,整張表。彩蛋:F1 最高點在門檻 0.2(0.508),不在預設的 0.5——門檻是可以調的旋鈕,不是天條。

相關名詞:門檻 thresholdP–R 拉鋸predict_proba

05翻案庭:weighted 跟 macro 到底誰大?

選項 D 說「weighted 必定小於 macro,因為正類樣本比較少」。開庭,兩件展品:

互動實驗室:翻案庭兩件展品,兩個方向
判決:weighted 與 macro 誰大,取決於「人多的班還是人少的班考得好」,跟「正類樣本比較少」本身無關——大班考得好 → weighted > macro(本題 0.9298 > 0.6465,D 的方向整個說反);小班考得好 → weighted < macro(展品二 0.5238 < 0.75)。看到「必定」,先找反例。

06考場加碼:30 秒拆段法,與評估三部曲

這類題目考場上照 SOP 走,30 秒填完四格:

步驟動作本題
① 對段落y_pred 的段落長度照抄,對齊 y_true 的分界950|50|30|20
② 填四格真實 0 的段 → TN、FP;真實 1 的段 → FN、TPTN950 FP50 FN30 TP20
③ 算類 1P=TP/(TP+FP)、R=TP/(TP+FN)、F1=調和0.2857 / 0.4 / 0.3333
④ 算類 0同法(把 0 當正類)0.9694 / 0.95 / 0.9596
⑤ 揉平均macro 平權;weighted 乘 support 佔比0.6465 / 0.9298

本頁也是站上不平衡評估三部曲的完結篇:第 2 頁(混淆矩陣與 recall)教四格與兩把尺、第 3 頁(不平衡評估陷阱)教「全猜 0 也有 95% 準確率」的假象與 baseline 紀律、本頁教怎麼把各類成績「揉成一個數」而不騙到自己——macro 誠實、weighted 報喜、micro 就是 accuracy。三頁合體,就是科目二不平衡評估的完整武器庫。

相關名詞:準確率的假象classification_report

07四個選項收工

A約輸出 0.6465、0.9298、0.4000;weighted 受多數類支配,降門檻通常提高 recall 但可能增加誤報正確

三個數字實跑全中:macro = (0.9596+0.3333)/2 = 0.6465、weighted = 0.952×0.9596+0.048×0.3333 = 0.9298(多數類佔 95.2% 權重——「支配」的數學本體)、recall = 20/50 = 0.4。門檻判讀也對:實跑降門檻 0.5 → 0.1,recall 0.271 → 0.712、誤報 3 → 93 筆——「通常可提高」「可能增加」的措辭嚴謹又符合實測。

B三者都約為 0.95;macro 與 weighted 永遠相同兩類均衡才會像

實跑三個輸出是 0.6465、0.9298、0.4——沒有一個是 0.95。macro 與 weighted 只有在各類表現一樣好各類樣本數相同時才會相等;不平衡+表現懸殊的本題,兩者差了 0.28。「永遠相同」與第 3 頁的「準確率 95% 假象」犯同一個錯:拿多數類的太平掩蓋少數類的災情

Crecall 為 20/70≈0.2857;降低門檻一定同時提高 precision分母抓錯+方向說反

兩刀斃命: 20/70 的 70 是「預測為 1」的筆數——那是 precision(0.2857);recall 的分母是「真實為 1」的 50,答案 0.4。 降門檻讓更多樣本被判 1——TP 變多、FP 通常漲更兇:實跑 precision 從 1.000 一路掉到 0.177。「一定同時提高」與實測完全相反。

Dweighted F1 必定小於 macro F1,因為正類樣本比較少本題就是反例

方向整個說反:本題 weighted(0.9298)遠大於 macro(0.6465)——正類樣本少,代表它在 weighted 裡幾乎沒發言權(4.8%),少數類考砸時 weighted 反而被多數類拉高。誰大誰小取決於「哪一類表現好」:小類考好時才會 weighted < macro(實跑 recall 版反例:0.5238 < 0.75)。「必定」二字,兩個方向都站不住。

回到題目:現在再作答一次

再看一次同一段程式。這次你知道三個數字各自在報告什麼了。

少數類別標記為 1。執行下列程式後,輸出與門檻調整的判讀何者正確?

y_pred = [0]*950 + [1]*50 + [0]*30 + [1]*20              # TN 950|FP 50|FN 30|TP 20
print(round(f1_score(y_true, y_pred, average='macro'), 4))     # 平權:0.6465(誠實)
print(round(f1_score(y_true, y_pred, average='weighted'), 4))  # 按人頭:0.9298(被多數類拉高)
print(round(recall_score(y_true, y_pred), 4))                 # 正類抓回率:20/50 = 0.4

08自我檢測

八題,全部都是本題的延伸。答錯會直接告訴你錯在哪。

09重點整理

  1. 六行程式的分工:第 1 行拿評分尺、第 2–3 行用「清單乘法+串接」造正解與預測(四段就是四格)、第 4–6 行印 macro F1、weighted F1、正類 recall。
  2. 正確答案 A:實跑輸出 0.6465、0.9298、0.4000;weighted 受多數類支配;降門檻通常提高 recall、但可能增加誤報。
  3. 30 秒拆段法:y_pred 段落長度直接填 2×2——TN 950、FP 50、FN 30、TP 20(實跑 confusion_matrix 驗證)。
  4. 逐類成績:類 0 → P 0.9694/R 0.95/F1 0.9596;類 1 → P 0.2857/R 0.4/F1 0.3333——兩班差距就是三種平均分歧的來源。
  5. macro = 平權平均:(0.9596+0.3333)/2 = 0.6465——類再小發言權一樣大,少數類考砸藏不住
  6. weighted = 按 support 加權:0.952×0.9596+0.048×0.3333 = 0.9298——少數類權重只有 4.8%,慘況被多數類的好成績淹沒(「支配」的數學本體)。
  7. 分母口訣(C 的死因①):precision 分母=「預測為 1」(70 筆 → 0.2857);recall 分母=「真實為 1」(50 筆 → 0.4)。P 問喊有病的幾個真病、R 問真病的抓到幾個。
  8. 門檻實跑(C 的死因②、A 的下半句):門檻 0.9 → 0.05:recall 0.068 → 0.797、FP 0 → 218、precision 1.000 → 0.177——降門檻 recall 升、precision 通常,「一定同時提高 precision」與實測相反。
  9. 彩蛋:F1 最高點在門檻 0.2(0.508)不在 0.5——門檻是旋鈕;漏抓成本高(詐欺、罕病)就往低調、誤報成本高就往高調。
  10. D 的死因:本題 weighted(0.9298)大於 macro(0.6465)——方向說反;誰大取決於哪類表現好(實跑 recall 反例:小類考好時 macro 0.75 > weighted 0.5238)。「必定」兩個方向都不成立。
  11. micro = accuracy(單標籤):實跑 0.9238——它跟第 3 頁的準確率假象是同一個陷阱;在乎少數類就看 macro 或各類分開看
  12. 評估三部曲:第 2 頁四格與兩把尺 → 第 3 頁 baseline 假象 → 本頁三種平均與門檻——科目二不平衡評估的完整武器庫。
完整程式碼