① 依序閱讀:每節先讀說明;遇到互動元件時,先預測結果,再操作驗證。 ② 對照程式範例:程式碼卡下方的「來源」標了課程練習筆記本(lab);需要實作時,再打開原始筆記本對照。 ③ 檢查理解:答錯時先看回饋,再回到相關說明;標為延伸的內容可留待第二輪。 ④ 最後用重點速查與來源複習。
教科書:An Introduction to Statistical Learning with Applications in Python(ISLP)。章節旁的來源標記可點到本頁書目。
這一頁假設你完全沒寫過程式。目標很具體:讀完之後, 你能逐行讀懂課程 lab 的程式。後面幾頁再練習自己寫。
x = [3, 4, 5] 唸成「把一個裝了 3、4、5 的串列,取名叫 x」。程式碼是可以用中文唸的,唸得出來多半就懂了。
fit a model with 11 variables
print 是一個函式,括號裡是要給它的東西,用逗號分開的話它會自動加空白。
Ch02-statlearn-lab-zh.ipynb
'hello world'
加號對數字是相加、對字串是串接。這種「同一個符號、不同型別不同意思」的設計在 P3 的串列與陣列還會再遇到一次。
來源:Ch02-statlearn-lab-zh.ipynb
print('MSE =', 25.57) 會印出什麼?
在 Jupyter/IPython 中,函式名稱後加 ? 可查看參數與說明;這是 notebook 的互動語法。
一般 Python 程式可用 help(print)。先找輸入參數、預設值、回傳值,再看範例,不必一次讀完整份文件。
可以把變數想成物件上的名牌。x = [3, 4, 5] 會先做出一個串列,
然後把 x 這個名牌貼上去。同一個東西可以貼很多張名牌——
P3 會用陣列的「檢視」示範共用資料時的修改結果。
a = 3; b = a; b = 4 之後 a 還是 3。會被就地改掉的只有串列、字典這種可變的東西。
| 型別 | 長什麼樣 | 在這門課裡是什麼 |
|---|---|---|
int | 392 | 樣本數 n、變數個數 p、折數 k |
float | 25.5739 | MSE、係數、p 值,幾乎所有統計量 |
str | 'lstat' | 欄名、檔名、圖的標題 |
bool | True / False | 條件的結果,布林遮罩的元素 |
list | [3, 4, 5] | 一組欄名、一組要試的參數 |
dict | {'R2': 0.54} | 一組具名的結果 |
7 / 2 給 3.5(浮點數),7 // 2 給 3(整數,直接砍掉小數)。算折數或索引時用得到後者,算統計量千萬不要用錯。
串列是有順序的一排東西,用中括號寫,從 0 開始數。 課程 lab 裡最常見的用法是「一組欄名」與「一組要試的參數」。
[3, 4, 5, 4, 9, 7]
輸出有六個元素。要逐元素相加得用 NumPy 陣列。那是 P3 的第一節。
來源:Ch02-statlearn-lab-zh.ipynb
-1 是最後一個、-2 是倒數第二個。要拿最後一欄寫 cols[-1],不用先算長度再減一。
| 你想做的事 | 寫法 |
|---|---|
| 拿第一個 | cols[0] |
| 拿最後一個 | cols[-1] |
| 有幾個 | len(cols) |
| 加一個到最後 | cols.append('mpg') |
| 接上另一個串列 | cols + other 或 cols.extend(other) |
| 在不在裡面 | 'mpg' in cols |
| 複製一份 | cols.copy() |
tuple(元組)也是有順序的序列,例如 (2, 3) 可記錄兩列三欄。
串列可以用 x[0] = 9 更換某一項;tuple 的位置不能這樣重新指定。
只有一項時要寫 (2,),逗號才是關鍵;(2) 只是加括號的數字。
rows, cols = (2, 3) 叫做解包,兩個名稱依序取得 2、3,名稱數量須與項目相符。
之後 fig, ax = subplots() 也採用同樣的方式接住兩個回傳物件。
含有串列的 tuple 仍可讓那個內部串列改變;「tuple 不能改位置」不代表裡面每個物件都不可變。
來源:課程 Ch02 中文 Lab 的序列介紹與 reshape 說明(原始lab 範例);程式碼中的 shape 寫法見 NumPy 附錄。
切片是 起:迄:步長,而且迄不包含。
這個「不包含」讓很多人第一次用就錯,但它有個好處:
a[:3] 加 a[3:] 剛好就是整個 a,中間不會重疊也不會漏。
iloc 用的都是這一套。唯一的例外是 pandas 的 loc——它用名字,所以含尾(P4 會講)。
'lo '
從第 3 個字元開始、取到第 6 個之前,三個字元,其中一個是空白。
來源:Ch02-statlearn-lab-zh.ipynb
'lo '
[3:6] 只是 [slice(3,6)] 的語法糖。知道這件事之後,「為什麼可以把切片存成變數」就不奇怪了。
Ch02-statlearn-lab-zh.ipynb
串列用位置取值,字典用名字取值。統計程式常用字典儲存「一組具名的結果」:模型的評分、欄名對應到型別、參數名稱對應到值。
Ohio 35000 Texas 71000 Oregon 16000 Utah 5000 dtype: int64
鍵變成索引、值變成資料。pandas 可以用字典中的鍵和值建立 Series。
來源:Ch01-lab-zh.ipynb
d['沒有這個鍵'] 會拋 KeyError。不確定在不在就用 d.get('鍵', 預設值)——找不到時回傳預設值而不是報錯。
| 你想做的事 | 寫法 |
|---|---|
| 取值 | d['R2'] |
| 安全取值 | d.get('R2', 0) |
| 新增或覆寫 | d['MSE'] = 38.5 |
| 鍵在不在 | 'R2' in d |
| 所有鍵/所有值 | d.keys() / d.values() |
| 一次拿鍵和值 | for k, v in d.items(): |
for k in d 的順序是可預期的。需要排序時,明確使用 sorted(d)。scores = {'R2': 0.54},執行 scores['MSE'] 會怎樣?
最後一件事:把數字變成人看得懂的一行字。統計程式的輸出幾乎都要格式化—— 「MSE 是 25.573878189684412」沒有人想讀,你要的是「MSE 是 25.57」。
Column "food" has 16.54% missing values Column "bar" has 25.98% missing values Column "pickle" has 29.13% missing values Column "snack" has 21.26% missing values Column "popcorn" has 22.83% missing values
{1:.2%} 的意思是「第 1 個引數,用百分比、小數兩位」。所以 0.1654 印出來是 16.54%。這一格同時示範了迴圈與格式化。
Ch02-statlearn-lab-zh.ipynb
Total is: 24
{0} 是「第 0 個引數」。現在更常見的寫法是 f-string:f'Total is: {total}',兩種都會遇到。
Ch02-statlearn-lab-zh.ipynb
25.573878,換不同的格式規格。按按鈕看每一種的輸出。
f'MSE = {mse:.2f}' 把變數直接寫在字串裡,冒號後面接的格式規格跟 format 完全一樣。本站的程式碼卡兩種都會出現,因為課程 lab 兩種都用。
'{:.2%}'.format(0.1654) 會印出什麼?
回顧本頁觀念與原 Lab 的程式,確認各個操作的意義與使用條件。
你想記錄三個模型的 MSE,之後要能用模型名字查。該用什麼?
MSE 是 25.573878189684412,你想在報告裡印成兩位小數。哪一個寫法對?
需要核對完整公式、比較表或實作時,再展開下方速查。
三張速查表整理串列與字典、切片、格式規格。 Python 的「變數」是指向物件的名稱;統計資料的「變數」通常指一個測量特徵或欄位。 串列索引是位置;pandas 的 Index 可以是列標籤,兩者的對照見loc 與 iloc。
| 你想做的事 | 串列 | 字典 |
|---|---|---|
| 取一個 | a[0](位置) | d['R2'](名字) |
| 安全地取 | 先 if len(a) > 0 | d.get('R2', 0) |
| 加一個 | a.append(x) | d['新鍵'] = x |
| 有幾個 | len(a) | len(d) |
| 走過每一個 | for x in a: | for k, v in d.items(): |
| 在不在 | x in a(比值) | k in d(比鍵) |
| 複製 | a.copy() 或 a[:] | d.copy() |
| 切片 | 意思 |
|---|---|
a[2:5] | 索引 2、3、4(不含 5) |
a[:3] | 從頭到索引 2 |
a[3:] | 從索引 3 到最後 |
a[:] | 整個,而且是新的一份 |
a[::2] | 每隔一個取一次 |
a[-1] | 最後一個 |
a[::-1] | 整個反過來 |
| 格式規格 | 0.1654 印出來 | 什麼時候用 |
|---|---|---|
{:.2f} | 0.17 | 一般統計量 |
{:.4f} | 0.1654 | 係數、p 值 |
{:.2%} | 16.54% | 比例、遺漏率 |
{:.3e} | 1.654e-01 | 非常大或非常小的數 |
{:>10.2f} | 0.17 | 對齊成一欄 |
b = a 只是多貼一張名牌,改 b 會動到 a。a[:k] 加 a[k:] 剛好是整個 a。