Learning Objectives
- 說明「自己寫規則」和「從資料學規則」的差別,以及各自適合的情況
- 分辨監督式與非監督式學習,分類與迴歸
- 從一張資料表指出特徵與標籤,並判斷哪些欄位不能當特徵
- 讀懂 scikit-learn 的 fit 與 predict 在做什麼
規則寫不完的時候
想判斷一則訊息是不是垃圾訊息,你可能會先想到自己寫規則:「出現『中獎』就是垃圾訊息」。 這就是平常寫程式的方式:人想好規則,電腦照著做。
規則少的時候這樣很好。麻煩的是,有些問題的規則你講不清楚,或者永遠寫不完:垃圾訊息的寫法一直變,同一個詞在正常訊息裡也會出現。
機器學習換一個方向:你給資料和答案,由程式找出規則。
| 給電腦什麼 | 電腦產出什麼 | |
|---|---|---|
| 一般程式 | 規則+資料 | 答案 |
| 機器學習 | 資料+答案 | 規則(也就是模型) |
這一軌會教你怎麼用資料訓練模型、怎麼判斷模型真的學到東西。先從一條自己寫的規則開始,看它會在哪裡出問題。
逐步看:自己寫規則來抓垃圾訊息
messages.csv 有 320 則校園短訊,label 欄是人工標好的答案(ham 是正常訊息,spam 是垃圾訊息)。這是程式產生的模擬資料,不是任何學校的真實資料。
先別看準確率,看最後印出來的誤判和漏掉的訊息長什麼樣子。
讓資料決定規則
換一個更簡單的問題:想用小考平均猜一位同學會不會及格。規則的樣子可以先定好:
小考平均 >= 門檻 → 猜及格
但門檻該設多少?與其憑感覺,不如把幾個門檻都試一遍,留下在資料上猜得最準的那個。
這已經是機器學習最核心的樣子:
- 先決定規則的形式(這裡是「一個門檻」),這叫模型;
- 定一個分數來衡量規則好不好(這裡是準確率);
- 讓程式在資料上找出分數最好的規則,這個過程叫訓練(training)。
之後學到的每個模型都是這三件事,差別只在規則的形式更複雜、找的方法更聰明。
逐步看:從資料學一個門檻
students.csv 是課堂上會一直用到的資料:400 位同學的讀書時數、缺席次數、小考與考試成績(同樣是程式產生的模擬資料)。
看 best_t 和 best_acc 怎麼在迴圈裡被更新,最後再和「全部猜及格」比較。
監督式與非監督式、特徵與標籤
資料表裡每個欄位有不同的角色:
| 名詞 | 意思 | 在 students.csv 裡 |
|---|---|---|
| 特徵(feature) | 用來預測的資訊,習慣寫成 X |
讀書時數、缺席次數、小考平均 |
| 標籤(label) | 想預測的答案,習慣寫成 y |
是否及格、期末分數 |
| 樣本(sample) | 一筆資料,也就是一列 | 一位同學 |
依照資料裡有沒有標籤,機器學習可以分成兩大類:
| 類型 | 資料 | 目標 | 例子 |
|---|---|---|---|
| 監督式學習(supervised) | 有標籤 | 預測標籤 | 垃圾訊息判斷、預測期末分數 |
| 非監督式學習(unsupervised) | 沒有標籤 | 找出資料本身的結構 | 把作息相近的同學分成幾群 |
監督式學習再依標籤的型態分成兩種:
- 分類(classification):答案是類別,例如及格或不及格、垃圾訊息或正常訊息;
- 迴歸(regression):答案是連續的數字,例如期末分數、租車次數。
選特徵時要問一件事:預測的時候,這個資訊拿得到嗎? students.csv 的 passed 就是由 final 算出來的(期末 60 分以上算及格),把 final 當特徵去預測 passed,準確率會是 1.0,但完全沒有用:學期結束前你根本不知道期末分數。這種「答案偷偷混進特徵」的情況叫資料洩漏(data leakage),第 14 課會細談。
逐步看:第一個模型,fit 與 predict
scikit-learn 是這一軌主要使用的套件。每個模型的用法都一樣:建立模型 → fit(X, y) 訓練 → predict(X) 預測。
這裡用決策樹(第 9 課會細談)當第一個例子,因為它學到的規則印得出來,可以直接看。注意看 X、y 的形狀,以及印出來的規則。
逐步看:沒有標籤也能學,分群
habits.csv 記錄 240 位同學每週的讀書、睡眠、螢幕、運動時數,沒有任何標籤(模擬資料)。沒有答案可以對,模型能做的是把相近的同學分成幾群。
k-means 的原理在第 17 課,這裡只看它的用法和結果,以及結果該怎麼解讀。
這一軌會用到的資料
下面五份 CSV 都是程式產生的模擬資料,不是任何學校的真實資料。好處是資料裡的規律是我們放進去的,可以清楚檢查模型有沒有學對;也因為是模擬的,模型學到的關聯不能拿來推論真實世界(例如「打工會讓成績變差」)。
| 檔案 | 內容 | 會用來學 |
|---|---|---|
students.csv |
400 位同學的時數、缺席、成績、是否及格 | 迴歸、分類、特徵工程 |
risk.csv |
1000 位同學的學業狀況與是否需要關懷,有 A、B 兩個校區 | 不平衡資料、評估指標、資料偏誤 |
habits.csv |
240 位同學的作息,沒有標籤 | 分群、降維 |
messages.csv |
320 則中文短訊與垃圾訊息標籤 | 文字分類 |
bikes.csv |
校園單車每站每天的租借次數與天氣 | 最後一課的專題 |
此外,有幾課會用 scikit-learn 內附的手寫數字資料(load_digits()):1797 張 8×8 的灰階圖片,是真實的公開資料,來自 UCI 機器學習資料庫的 Optical Recognition of Handwritten Digits。圖片的每個像素都是一個特徵,所以一張圖就是 64 個特徵。
實作:寫一個會找門檻的函數
完成 best_threshold(x, y, candidates):把 candidates 裡的門檻一個一個試,猜測規則是「x >= 門檻 就猜 1」,回傳準確率最高的門檻與它的準確率(四捨五入到小數 3 位)。
同分時留下先試到的那個。回傳的寫法已經給你一個提示:return best_t, round(float(best_acc), 3)。
小測驗:問題的類型
想預測一位同學的期末分數(0 到 100 的數字),這是哪一種問題?
手上有 5000 位同學的選課紀錄,沒有任何分組資訊,想看看選課習慣有沒有自然分成幾類。這是?
下面哪種情況,直接寫規則比訓練模型更合適?
小測驗:特徵與標籤
下面程式會印出什麼?
import pandas as pd
df = pd.DataFrame({"hours": [3, 5, 8, 2], "sleep": [7, 6, 8, 5], "passed": [0, 1, 1, 0]})
X = df[["hours", "sleep"]]
y = df["passed"]
print(X.shape, y.shape)
想在開學第三週預測誰可能不及格,下面哪個欄位不能當特徵?
某個模型準確率 0.80,資料裡 85% 的人及格。最恰當的解讀是?
重點整理
- 一般程式是人寫規則;機器學習是給資料與答案,由程式找出規則。規則清楚又穩定時,直接寫程式就好。
- 訓練的本質:定好規則的形式(模型)和分數,在資料上找分數最好的規則。
- 監督式有標籤(分類預測類別、迴歸預測數字);非監督式沒有標籤,例如分群,結果要由人解讀。
- 特徵是
X、標籤是y;預測當下拿不到的資訊不能當特徵。 - scikit-learn 的模型都是
fit、predict。準確率一定要和基準比較。 - 課堂上的 CSV 都是模擬資料,不要用來推論真實世界。
到這裡還有一個大問題沒解決:我們都在訓練用的同一份資料上算準確率,這個數字能相信嗎?下一課就來回答。