① 照節次讀:每節先讀說明,動手玩互動元件——先預測結果,再按按鈕驗證。 ② 對照講義:每個 §徽章都標了 ISLP 節號與講義頁碼,細節與完整推導請回講義與課本。 ③ 每節做 quiz:答錯就回到該節重讀,不要往下跳;錯的選項也寫了「錯在哪」。 ④ 最後翻關鍵詞彙卡自測術語,並用 REF 總覽當速查表。
這門課有十個主題,但它們不是十件無關的事。全部可以放進一張表: 你手上有沒有想預測的 y?y 是數字還是類別?你要的是準確度還是可解釋性? 答案決定你該翻到哪一章。
下面這張地圖就是這門課的全貌。按條件過濾,看剩下哪幾章—— 每張卡片都直接連到那一章的頁面。現在還看不懂卡片上的名詞完全沒問題, 這一節的目的只是讓你知道「這門課會給你哪些工具、什麼時候該拿哪一把」。
整門課最大的分水嶺只有一個問題:你手上有沒有「答案」?
監督式學習(supervised learning):每一筆資料都有一個 你想預測的目標值 y。薪資、股價漲跌、房價、腫瘤是否為惡性——這些都有明確的答案, 可以拿去對照模型猜得對不對。第 2 到 9 章全部是監督式。
非監督式學習(unsupervised learning):只有 X,沒有 y。 你不是要預測什麼,而是想知道「這堆資料裡有什麼結構」。 哪些顧客是同一群?6830 個基因能不能壓成 2 個維度來看? 第 12 章講這個。
| 監督式 | 非監督式 | |
|---|---|---|
| 資料長相 | X 與 y 都有 | 只有 X |
| 在問什麼 | 給定 X,y 是多少? | X 裡面有什麼結構? |
| 怎麼知道做得好不好 | 跟真實的 y 比,算誤差 | 沒有客觀標準 |
| 本課章節 | 第 2–9 章 | 第 12 章 |
| 例子 | 從年齡預測薪資、從 Lag 預測漲跌 | 把 6830 個基因壓成 2 維、把顧客分群 |
現實中常見的情況是:少數資料有 y,大量資料只有 X。例如你有 100 萬張照片但只有 1000 張被標註過——標註很貴。半監督式學習就是設法同時用上這兩批資料。
本課不教(ISLP 也只在第 1 章提一句)。但值得知道它存在,因為實務上「資料很多、標註很少」幾乎是常態。
差在類別是誰給的。
分類是監督式:類別標籤本來就在資料裡(這封信是垃圾信、這個腫瘤是惡性),你要學的是「怎麼從 X 猜出那個既有的標籤」。
分群是非監督式:沒有標籤,群是演算法自己劃出來的。劃完之後那些群叫什麼、有什麼意義,要靠你自己解讀。K-means 給你「第 1 群、第 2 群」,它不會告訴你第 1 群是「高消費客戶」——那是你看完之後自己命名的。
醫院想從病歷資料裡「找出幾種還沒被命名的糖尿病亞型」。這是什麼問題?
確定是監督式之後,第二個問題:y 是數字還是類別?
大部分方法都有迴歸版與分類版(迴歸樹/分類樹、線性迴歸/邏輯斯迴歸), 背後的想法一樣,只是把「差多少」換成「錯幾個」。
| 方法 | 迴歸版 | 分類版 | 本課章節 |
|---|---|---|---|
| 線性模型 | 線性迴歸 | 邏輯斯迴歸 | 第 3、4 章 |
| 最近鄰 | KNN 迴歸 | KNN 分類 | 第 2、3 章 |
| 樹 | 迴歸樹 | 分類樹 | 第 8 章 |
| 集成 | 隨機森林迴歸、GBDT | 隨機森林分類、AdaBoost | 第 8 章 |
| 邊界法 | 支持向量迴歸 | 支持向量機 | 第 9 章 |
| 誤差怎麼算 | MSE:$\frac1n\sum(y_i-\hat y_i)^2$ | 錯誤率:$\frac1n\sum I(y_i \ne \hat y_i)$ | 第 2 章 |
預測「明天的降雨機率是幾 %」。這是迴歸還是分類?
第三個問題最容易被忽略,但它直接決定你該選什麼模型: 你要的是「猜得準」還是「看懂關係」?
預測(prediction):只在乎 $\hat y$ 準不準, $\hat f$ 內部長什麼樣完全不重要——它可以是一座 500 棵樹的森林。
推論(inference):想知道哪些 X 影響 y、影響多大、 往哪個方向、這個影響可不可信。這時 $\hat f$ 必須看得懂, 而且你需要標準誤與 p 值。
| 預測 | 推論 | |
|---|---|---|
| 在乎什麼 | $\hat y$ 準不準 | $\hat f$ 說了什麼 |
| 模型可以是黑盒嗎 | 可以 | 不行 |
| 需要標準誤與 p 值嗎 | 通常不需要 | 需要 |
| 典型方法 | 隨機森林、GBDT、SVM | 線性迴歸、邏輯斯迴歸、GAM |
| 典型問法 | 這位客戶會不會流失? | 價格每漲 1 元,需求掉多少? |
| 本課章節 | 第 5、8、9 章 | 第 3、4、7 章 |
因為讓模型變準的手段,多半就是讓它變複雜。
線性迴歸只有 p + 1 個係數,每一個都能講成一句人話:「其他條件不變下,X₁ 每增加 1 單位,y 平均增加 β₁」。隨機森林有 500 棵樹、每棵樹幾十個分裂點——它可能準得多,但你沒辦法把它翻譯成一句話。
第 2 章會把這個取捨畫成一張圖(彈性 vs 可解釋性),第 7 章的 GAM 則是刻意站在中間的折衷方案:允許每個變數各自彎曲,但保住「各變數的效果可以分開看」這件事。
理論上是,實務上不行,有三個現實理由。
除錯:模型上線後表現變差,看不懂它你就查不出原因。信任:醫療、信貸、司法這些領域,法規常常要求你能解釋每一個決策。資料洩漏:如果某個變數的重要度高得不合常理,很可能是它偷偷含有答案(例如用「是否已理賠」預測「是否出車禍」)——看得懂模型才抓得到這種錯。
後面每一章都會用到這套符號,先講清楚省得後面卡住。
$x_{{3}}$(下標一個數字 3)指的是什麼?
ISLP 第 1 章用三份資料介紹三類問題。這三份會在後面的章節反覆出現, 現在先認識它們。
美國大西洋中部地區 3000 位男性的薪資與人口特徵。y 是 wage(連續數值),
所以這是迴歸。ISLP 圖 1.1 畫了三件事:薪資對年齡是先升後降的曲線
(不是直線)、對年份幾乎是緩慢的線性上升、對教育程度是
單調但不等距的階梯。
((3000, 11),
Index(['year', 'age', 'maritl', 'race', 'education', 'region', 'jobclass',
'health', 'health_ins', 'logwage', 'wage'],
dtype='object'))11 個欄位裡 wage 是 y、logwage 是它的對數(別同時放進模型),其餘 9 個是候選預測變數。
Ch01-lab-zh.ipynb · 儲存格 145、146
np.float64(111.15999687022256)
這個 111.16 就是上面側欄卡裡的數字——圖表的烘焙資料跟 lab 是同一份資料、同一個算法。
來源:Ch01-lab-zh.ipynb · 儲存格 148
2001–2005 年 S&P 500 的每日報酬。y 是 Direction(Up / Down),
所以是分類。ISLP 圖 1.2 的重點很反直覺:前幾天的報酬(Lag1–Lag5)
在漲日與跌日上的分佈幾乎一樣——也就是說,這件事非常難預測。
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1250 entries, 0 to 1249 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Year 1250 non-null int64 1 Lag1 1250 non-null float64 2 Lag2 1250 non-null float64 3 Lag3 1250 non-null float64 4 Lag4 1250 non-null float64 5 Lag5 1250 non-null float64 6 Volume 1250 non-null float64 7 Today 1250 non-null float64 8 Direction 1250 non-null category dtypes: category(1), float64(7), int64(1) memory usage: 79.6 KB
Today 是當天的報酬、Direction 是它的正負號——所以絕對不能把 Today 當預測變數(那就是答案本身)。這是最典型的資料洩漏。
Ch01-lab-zh.ipynb · 儲存格 157、158
64 個癌症細胞株、每個測 6830 個基因的表現量。沒有 y—— 我們不是要預測什麼,而是想知道「這 64 個樣本會不會自己分成幾群」。 ISLP 圖 1.4 把 6830 維壓到 2 維(第 12 章的主成分分析), 結果同一種癌症的樣本確實傾向靠在一起。
dict_keys(['data', 'labels'])
它回傳一個 dict:data 是 64 × 6830 的表現量矩陣、labels 是 64 個型別標籤。做非監督式分析時只用 data,labels 只拿來事後檢查。
Ch01-lab-zh.ipynb · 儲存格 164
因為它示範了一個真實而重要的事實:不是所有問題都能被預測。
如果課本只用「配得很漂亮」的例子,你會學到一種危險的直覺——覺得只要方法夠好就一定能預測。金融市場的日報酬接近隨機漫步,這是被大量研究支持的結論,不是因為我們的模型不夠強。
更重要的是:在這種資料上,任何回報「正確率 70%」的模型都應該被懷疑。那通常意味著資料洩漏(例如不小心把 Today 放進了預測變數)。
這正是非監督式學習最尷尬也最有趣的地方。
這個例子裡我們剛好有標籤可以驗證,所以能說「PCA 抓到了真實的結構」。但在真正的非監督式應用裡你沒有標籤——所以你永遠無法確定看到的群是真的結構,還是只是雜訊排出來的花樣。
實務上的做法是找外部證據:這些群在別的變數上有沒有差異?換一種方法、換一批資料還在不在?如果換個隨機種子群就變了,那大概不是真的。
同一份 Smarket 資料,如果把 Today(當天報酬)當成預測變數去猜 Direction(當天漲跌),正確率會是多少?
「統計學習」、「機器學習」、「資料科學」、「人工智慧」——這些詞常常混用, 但它們的重心確實不同。講義第 19–22 頁討論了這件事。
| 重心 | 典型問法 | 在意什麼 | |
|---|---|---|---|
| 統計學習 | 從資料推論母體 | 這個效果是真的嗎?多大? | 不確定性、可解釋性、模型假設 |
| 機器學習 | 在新資料上表現好 | 預測誤差能壓到多低? | 泛化能力、算力、可擴展性 |
| 資料科學 | 從問題到決策的整條流程 | 這個結論能支持什麼行動? | 資料品質、溝通、落地 |
| 人工智慧 | 讓機器展現智慧行為 | 它能做這件事嗎? | 能力邊界 |
但這些界線在實務上非常模糊,而且愈來愈模糊。同一個隨機森林, 統計學家與機器學習研究者都在用,只是他們問的問題不同: 前者會問「變數重要度可不可信、能不能給信賴區間」, 後者會問「加到 1000 棵樹還會不會更準」。
同一個隨機森林模型,統計學習與機器學習的取向差在哪?
本課的程式全部用 Python。你需要的套件不多,而且每一章的 lab 開頭都會列出來。
| 套件 | 做什麼 | 在哪幾章會用到 |
|---|---|---|
numpy | 陣列與線性代數 | 全部 |
pandas | 表格資料(DataFrame) | 全部 |
matplotlib / seaborn | 畫圖 | 全部 |
scikit-learn | 配模型、交叉驗證、Pipeline | 第 2 章之後 |
statsmodels | 推論用的迴歸摘要(標準誤、p 值) | 第 3、4 章 |
ISLP | 課本的資料集與幾個輔助函式 | 全部 |
pygam | 廣義加性模型 | 第 7 章 |
每一章的 lab 都是這個開頭。ISLP 的 load_data() 會直接給你課本用的資料集,不必自己找檔案。
Ch01-lab-zh.ipynb · 儲存格 88
pip install ISLP(它會把 numpy、pandas、scikit-learn、statsmodels
一起帶進來)。課程 repo 的 packages.txt 有完整的版本清單。因為它們為不同目的設計,剛好對應這一頁 P03 講的預測與推論。
statsmodels 給你完整的推論報表:係數、標準誤、t 值、p 值、信賴區間、F 檢定。第 3、4 章要的就是這些。
scikit-learn 給你統一的預測介面:fit / predict / score,配上 Pipeline 與 cross_validate。它刻意不提供 p 值——因為在它的世界觀裡,模型好不好是用留出的資料驗證,不是用 p 值判斷。
第 5 章的 lab 會示範怎麼用 ISLP 的 sklearn_sm() 把 statsmodels 的模型包成 sklearn 介面,這樣就能拿去做交叉驗證。
你要報告「廣告支出對銷售額的影響有多大、可不可信」。該用哪個套件?
ISLP 第 1 章沒有課後習題,所以這幾題是照本章觀念設計的。先自己想過再點選項; 每個選項——包含錯的——都寫了為什麼。第 2 章開始就有課本習題可以對答案了。
一家串流平台想「從觀看紀錄預測使用者下個月會不會退訂」。這在本課的地圖上是?
衛生單位想知道「香菸稅每漲 10 元,青少年吸菸率會降多少」。這主要是?
一份資料有 200 位病人、每人測 20000 個基因。n 與 p 各是多少,會有什麼麻煩?
你用「病人是否住進加護病房」來預測「病人是否重症」,正確率 97%。最該做的事是?
這一頁沒有公式要背,但這四個分類問題會決定你之後每次遇到新問題時該翻哪一章。
| 問題 | 答案 | 去哪裡 |
|---|---|---|
| 有 y 嗎? | 有 → 監督式 | 第 2–9 章 |
| 沒有 → 非監督式 | 第 12 章 | |
| y 是什麼型態? | 數字 → 迴歸 | 第 3、6、7 章 |
| 類別 → 分類 | 第 4、9 章 | |
| 要準還是要懂? | 要準 → 彈性方法 | 第 8、9 章 |
| 要懂 → 可解釋方法 | 第 3、4、7 章 | |
| 怎麼知道做得好不好? | 重抽樣估測試誤差 | 第 5 章(每一章都要用) |
| 符號 | 意思 | 長度/形狀 |
|---|---|---|
| n | 觀測值個數(列數) | 純量 |
| p | 預測變數個數(行數) | 純量 |
| $\mathbf{X}$ | 預測變數矩陣 | n × p |
| $x_i$ | 第 i 個觀測值 | 長度 p |
| $\mathbf{x}_j$ | 第 j 個變數 | 長度 n |
| $x_{ij}$ | 第 i 個觀測值的第 j 個變數 | 純量 |
| $y$ | 目標值向量 | 長度 n |
| $\hat f$ | 估計出來的函數 | — |
| $\hat y$ | 預測值 | 長度 n |
| 資料集 | n | p | y | 問題類型 | 後面在哪裡再出現 |
|---|---|---|---|---|---|
| Wage | 3000 | 11 | wage(連續) | 迴歸 | 第 7 章(樣條與 GAM) |
| Smarket | 1250 | 9 | Direction(二元) | 分類 | 第 4 章(邏輯斯、LDA) |
| NCI60 | 64 | 6830 | 無 | 非監督式 | 第 12 章(PCA、分群) |
| Auto | 392 | 8 | mpg(連續) | 迴歸 | 第 3、5 章 |
| Bikeshare | 8645 | 15 | bikers(計數) | 迴歸/Poisson | 第 4 章 |
Today 是課本給的示範,實務上這個坑更隱晦。
本頁「預期輸出」逐字取自課程 lab notebook(老師在課程環境實跑);圖表用的烘焙資料由 tools/frames/ 在固定種子下產生,環境為 numpy 1.24.4 · pandas 2.3.2 · scikit-learn 1.6.1 · scipy 1.13.1 · statsmodels 0.14.2 · ISLP 0.4.0 · pygam 0.10.1。每張卡下方的「來源」標了 lab 的儲存格編號,可以直接回去對。
詞彙卡取自本章講義與 ISLP 第 1 章,正面是中文術語(附英文原名)。 先看正面、心裡默想定義,再翻面對答案;洗牌後再過一輪,直到每張都能不看答案講出來。