前面各位學會了請 AI 幫你做出一個東西。這一單元我們要處理下一種東西——它會順利跑完,印出一個「準確率 0.98」,然後就停在那裡。當結果是一個數字,而你沒辦法一眼看出它究竟是真是假的時候,你該怎麼辦。
第 10、11 節做的東西,對不對你看得出來。這一種看不出來——它會安安靜靜地錯下去。
**全世界最常被用來教機器學習的資料集。**它很好教——而它為什麼好教,正是它會誤導人的原因。
| 項目 | 內容 |
|---|---|
| 來源 | 統計學家 Fisher(1936)論文使用,原始測量出自植物學家 Anderson |
| 筆數 | 150 |
| 特徵 | 4 個:萼片長、萼片寬、花瓣長、花瓣寬(公分) |
| 類別 | 3 種:setosa/versicolor/virginica |
| 每類筆數 | 50 / 50 / 50(完全平衡) |
| 缺失值 | 0 |
| 特徵 | 平均 | 標準差 | 最小 | 最大 |
|---|---|---|---|---|
| 萼片長 | 5.84 | 0.83 | 4.3 | 7.9 |
| 萼片寬 | 3.06 | 0.44 | 2.0 | 4.4 |
| 花瓣長 | 3.76 | 1.77 | 1.0 | 6.9 |
| 花瓣寬 | 1.20 | 0.76 | 0.1 | 2.5 |
| 品種 | 花瓣長範圍(cm) | 花瓣寬範圍(cm) |
|---|---|---|
| setosa | 1.0 – 1.9 | 0.1 – 0.6 |
| versicolor | 3.0 – 5.1 | 1.0 – 1.8 |
| virginica | 4.5 – 6.9 | 1.4 – 2.5 |
| 真實資料常見狀況 | iris | 後果 |
|---|---|---|
| 缺失值一堆 | 0 個 | 學不到「補、刪、還是當成一種資訊」的判斷 |
| 類別嚴重不平衡 | 完美的 50/50/50 | 準確率剛好可信——這是它最誤導人的一點 |
| 幾百個欄位不知道哪個有用 | 4 個,而且都有用 | 看不到特徵選擇的困難 |
| 標註本身就有爭議 | 植物學家量的,沒有爭議 | 看不到「答案本身可能是錯的」 |
| 資料要自己蒐集清理 | 一行程式就載入 | 省掉真實專案一半以上的時間 |
每一站固定回答三件事:這一站在做什麼、怎麼請 AI 做、你要怎麼確認它沒騙你。第三件事是重點——前兩件網路上到處都有,第三件沒有。
| 要素 | 問句 | iris 的答案 |
|---|---|---|
| 輸入 | 我手上會有什麼資訊 | 四個花朵尺寸的測量值 |
| 輸出 | 我要它回答什麼 | 三個品種之一 |
| 型態 | 分類還是迴歸 | 分類(三選一) |
| 成功標準 | 多準才算成功 | 要明顯贏過「兩條簡單規則」的 0.940 |
| 資料 | 已知答案的例子從哪來 | 150 筆已標註的測量記錄 |
| 典型偷懶 | 長什麼樣 | 追問句 |
|---|---|---|
| 跳過 | 直接給你完整的建模程式碼 | 「先不要建模,回到資料理解,逐項附上輸出」 |
| 敘述代替執行 | 「資料很乾淨,無缺失值,品質良好」 | 「請貼出缺失值統計的實際輸出」 |
| 憑印象講統計值 | 講出來的平均值和實際跑的不完全一樣 | 「這些數字是你跑出來的還是你記得的?請重跑並貼原始輸出」 |
| 統計量 | 隨機森林 | 邏輯迴歸 |
|---|---|---|
| 平均 | 0.9535 | 0.9570 |
| 標準差 | 0.0335 | 0.0326 |
| 最低 | 0.8667 | 0.8667 |
| 最高 | 1.0000 | 1.0000 |
| 剛好 100% | 200 次中 41 次 | 200 次中 46 次 |
| 基線 | 做法 | 5 折交叉驗證準確率 |
|---|---|---|
| 全猜同一類 | 不看資料,永遠回答同一個品種 | 0.333 |
| 一條規則 | 只用一個門檻切一刀 | 0.667 |
| 兩條規則 | 切兩刀(深度 2 的決策樹) | 0.940 |
| 情況 | 建議 |
|---|---|
| 簡單規則 0.94,模型 0.96 | 用規則。少一個要維護的模型,而且規則你看得懂、講得出來、改得動 |
| 簡單規則 0.55,模型 0.88 | 模型帶來真實價值,值得做 |
| 模型只比亂猜好一點 | 資料裡可能沒有你要的訊號。回到站 1 重想問題,不要調參數 |
| 模型 | 平均準確率 | 標準差 | 五折的個別分數 |
|---|---|---|---|
| 邏輯迴歸 | 0.9533 | 0.0452 | 1.000 / 0.967 / 0.900 / 1.000 / 0.900 |
| 決策樹 | 0.9533 | 0.0340 | 1.000 / 0.967 / 0.933 / 0.967 / 0.900 |
| K 近鄰 (k=5) | 0.9733 | 0.0249 | 1.000 / 0.967 / 0.933 / 1.000 / 0.967 |
| 隨機森林 | 0.9600 | 0.0389 | 1.000 / 0.967 / 0.933 / 1.000 / 0.900 |
| 支援向量機 | 0.9600 | 0.0389 | 1.000 / 0.967 / 0.900 / 1.000 / 0.933 |
| AI 的預設行為 | 為什麼是問題 |
|---|---|
| 直接上隨機森林/XGBoost | 對 150 筆是殺雞用牛刀,而且不可解釋 |
| 附一大段自動調參 | 產生幾十個數字,你無從驗證,還可能過擬合 |
| 只回報最高的那一個 | 隱藏了「差距不顯著」這件事 |
| 標準化寫在切分之前 | 這是洩漏(第四部分) |
| 教育場域的任務 | 該看哪個 | 為什麼 |
|---|---|---|
| 篩選「可能需要輔導的學生」 | 召回率 | 漏掉一個需要幫助的學生,比多找一個來談嚴重得多 |
| 自動判定「這份作業有抄襲嫌疑」 | 精確率 | 冤枉一個學生的代價極高 |
| 兩個都要顧 | F1 | 兩者的綜合分數 |
| 模型 | 準確率 | 召回率 | 精確率 |
|---|---|---|---|
| 完全不做事 永遠回答「不是」 | 0.9394 | 0.000 | 0.000 |
| 真的訓練過的 隨機森林 | 0.9697 | 0.500 | 1.000 |
| # | 實際品種 | 模型判成 | 花瓣長 | 花瓣寬 | 萼片長 | 萼片寬 |
|---|---|---|---|---|---|---|
| 1 | virginica | versicolor | 5.1 | 1.5 | 6.3 | 2.8 |
| 2 | virginica | versicolor | 5.6 | 1.4 | 6.1 | 2.6 |
| 3 | versicolor | virginica | 5.0 | 1.7 | 6.7 | 3.0 |
| 4 | virginica | versicolor | 4.5 | 1.7 | 4.9 | 2.5 |
| 誤差分析看到的 | 代表什麼 | 下一步 |
|---|---|---|
| 錯的都在兩類的重疊帶 | 資料本身分不開 | 接受。換模型、調參數都沒用 |
| 錯的都是某種特定情況 (例如全是缺值的那些) | 前處理有問題 | 回站 2 修資料 |
| 錯的毫無規律,散在各處 | 模型沒學到東西,或標籤有雜訊 | 回站 1 重想問題 |
| 錯的其實是標註錯了 | 資料的答案本身有問題 | 修標註(真實專案常見) |
各位啊,機器學習專案裡最常見、也最難自己發現的失敗模式——因為所有訊號都是好訊號。
| 型態 | 長什麼樣 | 教育場域的例子 |
|---|---|---|
| 處理做在切分之前 | 用全部資料算平均、選特徵、補缺失,然後才切 | 用全班(含測試集)的平均分數,補上缺考同學的分數 |
| 混進事後才知道的欄位 | 資料表裡有一欄是「結果發生後才會有的資訊」 | 用「是否已補考」預測「會不會不及格」 |
| 同一個對象被拆到兩邊 | 同一個人的多筆記錄,一部分訓練一部分測試 | 同一位學生的三次段考,兩次在訓練、一次在測試 |
| 做法(跑 100 次取平均) | 準確率 |
|---|---|
| 正確:標準化放進 pipeline,每折內部做 | 0.9560 |
| 洩漏:先對全部資料標準化,再切分 | 0.9557 |
| 資料 | 5 折交叉驗證準確率 |
|---|---|
| 原本的四個測量值 | 0.960 |
| 四個測量值 + 標本編號 | 1.000 |
| 驗證集(拿來挑選的) | 測試集(完全沒碰過的) | |
|---|---|---|
| 24 組的平均 | 0.8945 | 0.8574 |
| 挑出來的最佳組合 | 0.9688 | 0.9333 |
五種錯、八段提示、一次對照示範,和三句話。
| # | 行為 | 為什麼危險 | 一句話追問 |
|---|---|---|---|
| 1 | 跳過資料理解,直接建模 | 你不知道資料長什麼樣,就無法判斷結果合不合理 | 「先不要建模。逐項附上實際輸出,做完資料理解再說」 |
| 2 | 報一個沒有比較對象的準確率 | 0.96 可能很好,也可能輸給兩個 if | 「這個數字和最笨的做法比,好多少?」 |
| 3 | 用敘述代替執行 (「資料很乾淨」) | 那是它的印象,不是它跑出來的 | 「請貼出實際程式碼與原始輸出」 |
| 4 | 過度工程 (一次八個模型+自動調參) | 產出你看不懂也驗不了的一堆數字 | 「先用預設值比較最簡單的兩個模型」 |
| 5 | 悄悄改了你的問題 | 把三分類做成二分類、直接刪掉缺失值、換了評估指標——而且沒說 | 「請條列你在這段程式碼裡對資料做的每一個更動」 |
| 站 | 提示的核心句 |
|---|---|
| 1 定義問題 | 「先用這個任務定義反問我哪裡不明確,先不要寫模型」 |
| 2 看資料 | 「逐項附上實際執行的程式碼與原始輸出,不要用文字描述代替。包含形狀、敘述統計、各類別筆數、缺失值、完全重複的列」 |
| 3 切資料 | 「用分層抽樣與 5 折交叉驗證,回報平均與標準差。另外用 50 個不同種子重跑,告訴我最小值與最大值」 |
| 4 基線 | 「先做三個基線,把規則用中文印出來。我後面的模型如果贏不過它們,代表什麼?」 |
| 5 訓練 | 「同一組折比較五個模型,全部用預設值不要調參。差距如果小於標準差,直接說『不顯著』」 |
| 6 評估 | 「不要只給準確率。印出混淆矩陣與每類的 precision/recall/f1,並主動告訴我準確率在這份資料上可不可信」 |
| 7 誤差分析 | 「列出所有分錯的樣本與其原始數值,和各類別的分布區間對照。不要直接調參數」 |
| 8 洩漏檢查 | 「逐項檢查四種洩漏。最後回答:以這個任務的難度,目前這個分數合不合理?」 |
| 時間 | 內容 |
|---|---|
| 0–10 | 為什麼不一樣+認識 iris(看圖) |
| 10–20 | 站 1、站 2 |
| 20–35 | 站 3 ★ 種子彩票(現場實跑,最有戲劇性) |
| 35–50 | 站 4 ★ 基線(當場印出兩條規則) |
| 50–60 | 站 5 模型比較 |
| 60–75 | 站 6 ★ 準確率會說謊 |
| 75–85 | 站 7、站 8 |
| 85–100 | 洩漏 ★ + 五種錯 + 收束 |
| 項目 | 值 |
|---|---|
| 資料集 | scikit-learn 內建(Fisher 版,非 UCI 版) |
| 重複資料列 | 第 102 筆 = 第 143 筆 |
| 三個基線 | 0.333 / 0.667 / 0.940 |
| 五模型 CV | 0.953 – 0.973 |
| 種子彩票 | 200 次,0.867–1.000,41 次為 1.000 |
| 標準化洩漏 | 0.9560 vs 0.9557 |
| 編號欄洩漏 | 0.960 → 1.000,重要度 0.38 |
| 偷看測試集 | 驗證 0.9688 → 測試 0.9333 |
| 混淆矩陣 | 45 筆錯 4 筆,全在兩類之間 |
| 不平衡陷阱 | 0.9394(recall 0)vs 0.9697(recall 0.5) |