Hai model được chấm trên cùng 200 ảnh validation. Model A đúng 84%, model B đúng 86%. Nhóm chọn B. Một tuần sau, trên bộ test kín, A lại cao hơn B. Không ai làm sai gì cả: 200 ảnh là một mẫu ngẫu nhiên, và con số đo trên mẫu ngẫu nhiên thì dao động. Để biết một chênh lệch như 2% là thật hay chỉ do may rủi, cần vài khái niệm xác suất và thống kê: xác suất có điều kiện, Bayes, kỳ vọng, phương sai, phân phối chuẩn và sai số chuẩn. Mỗi khái niệm đều được kiểm bằng mô phỏng: cho máy tung xúc xắc hay rút mẫu hàng vạn lần rồi đếm.
Xác suất là tỉ lệ khi lặp lại nhiều lần
Xác suất của một biến cố là một số từ 0 đến 1. Khi mọi kết quả đều khả năng như nhau, xác suất là số kết quả thuận lợi chia cho tổng số kết quả. Xúc xắc cân đối ra mặt 5 hoặc 6 có xác suất . Xác suất biến cố không xảy ra là trừ xác suất nó xảy ra.
Cách hiểu thứ hai hữu ích hơn khi lập trình: xác suất là tỉ lệ biến cố xảy ra nếu lặp lại phép thử rất nhiều lần. Cho máy tung xúc xắc một trăm nghìn lần rồi đếm:
import numpy as np
rng = np.random.default_rng(0)
rolls = rng.integers(1, 7, size=100_000) # số nguyên từ 1 đến 6
print(round((rolls >= 5).mean(), 4), round(1 / 3, 4))
print(round(rolls.mean(), 3))
0.3326 0.3333
3.498
Tỉ lệ đếm được khớp tới hai chữ số thập phân. Dòng thứ hai là trung bình các mặt, gần 3.5; mục kỳ vọng sẽ giải thích con số này. Một biểu thức so sánh như rolls >= 5 cho mảng True/False, và .mean() của nó chính là tỉ lệ True, mẹo đã dùng ở bài 0.3.
Hỏi nhanh
Rút ngẫu nhiên một lá từ bộ bài 52 lá. Xác suất không rút được lá cơ (13 lá) là bao nhiêu?
Xác suất rút được lá cơ là , nên không rút được là . là xác suất của chính biến cố, quên lấy phần bù. Nhân hai xác suất là phép cho hai lần rút. là xác suất rút được một giá trị cụ thể như lá Át.
Xác suất có điều kiện và độc lập
Một lớp 40 học sinh: 25 bạn làm bài tập đều, trong đó 20 bạn đạt; 15 bạn không làm đều, trong đó 6 bạn đạt. Chọn ngẫu nhiên một bạn. Xác suất bạn ấy đạt là . Nhưng nếu đã biết bạn ấy làm bài tập đều, ta chỉ đếm trong nhóm 25 bạn ấy: .
Đó là xác suất có điều kiện, viết , đọc “xác suất của khi đã biết ”:
là “cả lẫn cùng xảy ra”. Ở ví dụ, và , chia ra được . Mẫu số đổi từ cả lớp sang nhóm điều kiện.
Hai biến cố độc lập khi biết cái này không đổi xác suất của cái kia: , tương đương
Ở lớp trên, , nên đạt và làm bài tập đều không độc lập. Hai lần tung xúc xắc thì độc lập: xác suất cả hai lần ra 6 là . Chỉ được nhân hai xác suất khi đã có lý do để tin chúng độc lập.
pass_ = np.array([1] * 20 + [0] * 5 + [1] * 6 + [0] * 9) # đạt hay không
homework = np.array([1] * 25 + [0] * 15) # làm bài tập đều hay không
p_pass = pass_.mean()
p_pass_given_hw = pass_[homework == 1].mean()
p_both = (pass_ & homework).mean()
print(p_pass, p_pass_given_hw, p_both / homework.mean())
0.65 0.8 0.8
pass_[homework == 1] lọc đúng nhóm điều kiện rồi lấy tỉ lệ, cách viết thẳng theo nghĩa “chỉ đếm trong nhóm”. Cột cuối tính theo công thức và ra cùng số.
Hỏi nhanh
Trong lớp trên, xác suất một bạn làm bài tập đều khi đã biết bạn ấy đạt, , là bao nhiêu?
Điều kiện là “đạt”, nên đếm trong 26 bạn đạt: 20 bạn làm đều. là chiều ngược lại, . là không có điều kiện. là xác suất cả hai cùng xảy ra.
Bayes: đảo chiều điều kiện
Một xét nghiệm phát hiện được 95% người có bệnh, và báo nhầm 5% người khỏe. Bệnh này chỉ 1% dân số mắc. Một người xét nghiệm dương tính. Xác suất người ấy có bệnh là bao nhiêu?
Nhiều người trả lời 95%. Con số ấy là , còn câu hỏi là , điều kiện nằm ở phía ngược lại. Cách dễ nhất là đếm trên 10 000 người. 100 người có bệnh, 95 người trong số đó dương tính. 9900 người khỏe, 5% của họ là 495 người dương tính nhầm. Tổng cộng 590 người dương tính, chỉ 95 người thật sự có bệnh: .
Viết thành công thức, đó là định lý Bayes:
Ở đây là “có bệnh”, là “dương tính”, là “không có bệnh”. Tử số ; mẫu số . Chia ra được , khớp phép đếm.
Chuyện này cũng xảy ra với model. Khi trường hợp cần tìm rất hiếm, một model bắt được gần hết ca thật và ít báo nhầm vẫn có thể có phần lớn cảnh báo là nhầm, vì nhóm bình thường quá đông. Bài 1.5 sẽ đo điều này bằng precision.
p_b = 0.01 # tỉ lệ mắc bệnh
p_d_b = 0.95 # dương tính khi có bệnh
p_d_not_b = 0.05 # dương tính nhầm khi khỏe
p_d = p_d_b * p_b + p_d_not_b * (1 - p_b)
print(round(p_d, 4), round(p_d_b * p_b / p_d, 4))
sick = rng.random(1_000_000) < p_b
positive = np.where(sick, rng.random(1_000_000) < p_d_b, rng.random(1_000_000) < p_d_not_b)
print(round(sick[positive].mean(), 4))
0.059 0.161
0.1609
Mô phỏng một triệu người cho tỉ lệ bệnh thật trong nhóm dương tính khoảng 0.161, khớp công thức tới hai chữ số. np.where(điều kiện, a, b) chọn phần tử của a ở chỗ điều kiện đúng và của b ở chỗ sai.
Hỏi nhanh
Giữ nguyên xét nghiệm (bắt 95% người bệnh, báo nhầm 5% người khỏe), nhưng dùng ở một bệnh viện nơi một nửa số người đến khám có bệnh. Một người dương tính có bệnh với xác suất bao nhiêu?
, nên . Xét nghiệm không đổi nhưng tỉ lệ mắc bệnh đổi, nên đáp án đổi; chỉ đúng khi bệnh hiếm 1%. là tử số, chưa chia cho .
Kỳ vọng và trung bình
Kỳ vọng của một đại lượng ngẫu nhiên là trung bình các giá trị, mỗi giá trị nhân với xác suất của nó:
Xúc xắc cân đối: , khớp con số 3.498 ở mục đầu. Kỳ vọng không nhất thiết là một giá trị có thể xảy ra; không lần tung nào ra 3.5. Nó là trung bình về lâu dài.
Một vé số giá 10 000 đồng, trúng 1 000 000 đồng với xác suất . Tiền lời kỳ vọng mỗi vé là đồng: mua càng nhiều, càng gần chắc chắn lỗ.
Kỳ vọng có tính tuyến tính: , kể cả khi và không độc lập. Tung hai xúc xắc, kỳ vọng tổng là mà không cần liệt kê 36 trường hợp.
Trên dữ liệu thật, ta không biết xác suất, chỉ có các giá trị đã quan sát. Trung bình mẫu là ước lượng của kỳ vọng. Median là giá trị đứng giữa khi sắp xếp; nó ít bị kéo bởi một vài giá trị cực lớn, như bài 0.3 đã thấy với giờ tự học lệch phải.
Hỏi nhanh
Tung hai xúc xắc cân đối rồi lấy mặt thứ nhất trừ mặt thứ hai. Kỳ vọng của hiệu là bao nhiêu?
Theo tính tuyến tính, . là kỳ vọng của tổng. là kỳ vọng của một xúc xắc. Không cần liệt kê: tính tuyến tính làm thay.
Phương sai và độ lệch chuẩn
Hai nhóm học sinh có điểm và . Trung bình đều bằng 7, nhưng nhóm sau phân tán hơn nhiều. Đo độ phân tán bằng phương sai: trung bình bình phương khoảng cách tới trung bình,
là độ lệch chuẩn (standard deviation), cùng đơn vị với dữ liệu nên dễ đọc hơn phương sai. Nhóm đầu có độ lệch , bình phương có trung bình , nên . Nhóm sau có phương sai , .
z-score của một giá trị cho biết nó cách trung bình bao nhiêu lần độ lệch chuẩn: . Điểm 10 ở nhóm sau có ; ở nhóm đầu, điểm 10 có , tức là bất thường hơn nhiều. Chuẩn hóa dữ liệu ở bài 1.4 làm đúng phép này cho từng cột.
a = np.array([6, 7, 7, 8, 7], dtype=float)
b = np.array([4, 9, 5, 10, 7], dtype=float)
for g in (a, b):
print(g.mean(), round(g.var(), 2), round(g.std(), 2), round((10 - g.mean()) / g.std(), 2))
print(np.var(a, ddof=1))
7.0 0.4 0.63 4.74
7.0 5.2 2.28 1.32
0.5
NumPy mặc định chia cho . Dòng cuối dùng ddof=1 để chia cho , ra ; pandas mặc định tính std() theo cách này. Chia cho cho kết quả sát hơn khi dùng một mẫu nhỏ để đoán độ phân tán của cả tổng thể. Khi lớn, hai cách gần như bằng nhau; chỉ cần nhớ để không ngạc nhiên khi NumPy và pandas in hai số khác nhau.
Hỏi nhanh
Thêm 10 vào mọi điểm của một nhóm. Trung bình và độ lệch chuẩn thay đổi thế nào?
Mọi điểm dịch cùng một lượng thì trung bình dịch theo, còn khoảng cách từ mỗi điểm tới trung bình giữ nguyên, nên độ phân tán không đổi. Độ lệch chuẩn chỉ đổi khi nhân dữ liệu với một số: nhân 2 thì gấp đôi.
Phân phối chuẩn
Chiều cao, sai số đo, điểm thi của nhiều người thường có histogram hình chuông: dày ở giữa, mỏng dần hai bên, đối xứng. Hình chuông ấy là phân phối chuẩn (normal distribution), xác định bởi hai số: trung bình và độ lệch chuẩn .
Quy tắc dễ nhớ nhất là 68–95–99.7: khoảng 68% giá trị nằm trong , 95% trong , 99.7% trong . Một giá trị có là hiếm, đáng kiểm xem có phải lỗi nhập liệu không.
Phân phối chuẩn xuất hiện nhiều vì một lý do sâu hơn: trung bình của nhiều đại lượng ngẫu nhiên độc lập có phân phối gần chuẩn, dù từng đại lượng có phân phối gì. Đó là định lý giới hạn trung tâm. Ngay cả trung bình của 30 lần tung xúc xắc, vốn có phân phối đều, cũng cho histogram hình chuông. Mục tiếp theo dùng đúng kết quả này cho accuracy.
z = rng.normal(0, 1, size=100_000)
print(round((np.abs(z) < 1).mean(), 3), round((np.abs(z) < 2).mean(), 3))
means = rng.integers(1, 7, size=(100_000, 30)).mean(axis=1)
print(round(means.mean(), 3), round(means.std(), 3), round(np.sqrt(35 / 12 / 30), 3))
print(round((np.abs(means - 3.5) < means.std()).mean(), 3))
0.682 0.954
3.5 0.311 0.312
0.691
Dòng đầu: 68.2% và 95.4% số ngẫu nhiên chuẩn nằm trong một và hai độ lệch chuẩn. Dòng hai: một trăm nghìn lần lấy trung bình 30 mặt xúc xắc; trung bình của chúng quanh 3.5, độ lệch chuẩn 0.311, gần đúng bằng với là phương sai một xúc xắc. Dòng ba: khoảng 69% các trung bình nằm trong một độ lệch chuẩn, gần 68% của phân phối chuẩn. Phần lệch nhỏ đến từ việc trung bình 30 mặt chỉ nhận một số giá trị rời rạc.
Hỏi nhanh
Điểm một kỳ thi có phân phối gần chuẩn, trung bình 6.0, độ lệch chuẩn 1.5. Khoảng bao nhiêu phần trăm thí sinh có điểm từ 3.0 đến 9.0?
3.0 và 9.0 cách trung bình đúng điểm, nên khoảng 95% thí sinh nằm trong đó. 68% là cho khoảng , tức 4.5 tới 7.5. 99.7% là cho .
Sai số chuẩn: điểm validation dao động bao nhiêu
Quay lại câu hỏi đầu bài. Một model có accuracy thật trên toàn bộ ảnh có thể gặp. Ta chỉ chấm trên ảnh rút ngẫu nhiên. Mỗi ảnh đúng hay sai giống một lần tung đồng xu lệch, nên accuracy đo được là trung bình của 200 biến 0/1. Theo mục trước, nó có phân phối gần chuẩn quanh , với độ lệch chuẩn
Độ lệch chuẩn của một con số ước lượng gọi là sai số chuẩn (standard error). Với , : . Theo quy tắc 95%, accuracy đo được thường nằm trong khoảng , tức từ 0.80 tới 0.90. Hai model chênh 2 điểm phần trăm trên 200 ảnh là chênh lệch nằm gọn trong nhiễu.
Muốn SE nhỏ hơn thì cần lớn hơn, nhưng SE chỉ giảm theo : gấp 10 lần dữ liệu thì SE chỉ còn khoảng một phần ba.
p_true = 0.85
for n in [200, 2000]:
acc = rng.binomial(n, p_true, size=10_000) / n # 10 000 bộ validation, mỗi bộ n ảnh
lo, hi = np.percentile(acc, [2.5, 97.5])
print(n, round(acc.std(), 4), round(np.sqrt(p_true * (1 - p_true) / n), 4), lo, hi)
200 0.025 0.0252 0.8 0.895
2000 0.008 0.008 0.8345 0.866
rng.binomial(n, p) đếm số lần thành công trong lần thử, mỗi lần xác suất ; chia cho được accuracy của một bộ validation. Mười nghìn bộ cho thấy với 200 ảnh, 95% số đo nằm từ 0.80 tới 0.895, rộng gần 10 điểm phần trăm. Với 2000 ảnh, khoảng ấy chỉ còn từ 0.8345 tới 0.866.
Hai cách giảm nhiễu khi so model: dùng validation lớn hơn hoặc cross-validation (bài 1.3); và so hai model trên cùng các ảnh, đếm những ảnh mà hai model trả lời khác nhau, thay vì so hai con số tổng.
Hỏi nhanh
Model đạt accuracy 0.90 trên 100 ảnh validation. Sai số chuẩn của con số này khoảng bao nhiêu?
. là , quên chia cho và lấy căn. là lấy căn của trước rồi mới chia cho , nên chia nhiều hơn mức cần. là chính accuracy, không phải độ dao động của nó.
Tương quan: Pearson, Spearman và nhân quả
Hệ số tương quan Pearson đo mức hai đại lượng cùng tăng giảm theo một đường thẳng:
nằm trong : bằng 1 khi mọi điểm nằm trên một đường thẳng đi lên, bằng khi đường thẳng đi xuống, gần 0 khi không có xu hướng thẳng. Tính tay theo thứ tự: hai trung bình, độ lệch của từng điểm, ba tổng ở tử và mẫu, rồi chia.
Hệ số Spearman là Pearson tính trên thứ hạng: thay mỗi giá trị bằng hạng của nó trong dãy (nhỏ nhất hạng 1, giá trị bằng nhau lấy hạng trung bình), rồi tính của hai dãy hạng. Nó đo quan hệ đơn điệu, tức cùng tăng dù đường cong, và ít bị một điểm ngoại lai kéo lệch.
def pearson(x, y):
dx, dy = x - x.mean(), y - y.mean()
return (dx * dy).sum() / np.sqrt((dx ** 2).sum() * (dy ** 2).sum())
def ranks(v):
return np.array([(v < a).sum() + ((v == a).sum() + 1) / 2 for a in v])
x = np.arange(-3, 4, dtype=float)
for name, y in [("2x + 1", 2 * x + 1), ("x^3", x ** 3), ("x^2", x ** 2)]:
print(f"y = {name:6s} Pearson {pearson(x, y):.2f} Spearman {pearson(ranks(x), ranks(y)):.2f}")
y = 2x + 1 Pearson 1.00 Spearman 1.00
y = x^3 Pearson 0.93 Spearman 1.00
y = x^2 Pearson 0.00 Spearman 0.00
Dòng thứ hai: tăng đơn điệu nên thứ hạng của và trùng nhau, Spearman bằng 1, nhưng đường cong nên Pearson chỉ 0.93. Dòng thứ ba: được tính hoàn toàn từ mà cả hai hệ số đều bằng 0, vì nửa trái đi xuống, nửa phải đi lên. Hệ số tương quan gần 0 không có nghĩa là hai đại lượng không liên quan; luôn vẽ biểu đồ trước khi kết luận.
Tương quan cũng không phải nhân quả. Số kem bán ra và số vụ đuối nước cùng tăng vào mùa hè, nhưng ăn kem không gây đuối nước: cả hai cùng do trời nóng. Một biến như vậy gọi là biến gây nhiễu (confounder). Trong học máy, một feature tương quan mạnh với nhãn chưa chắc là nguyên nhân của nhãn. Khi dữ liệu đổi, chẳng hạn ảnh chụp ở bệnh viện khác, mối tương quan ấy có thể mất (bài 8.2).
Hỏi nhanh
Đo trên 100 học sinh: số giờ ngủ và điểm thi có Pearson . Kết luận nào đúng?
chỉ đo xu hướng thẳng. Nếu ngủ quá ít và quá nhiều đều điểm thấp, dữ liệu có hình chữ U như ở trên, và gần 0. Tương quan, dù lớn hay nhỏ, không nói gì về nhân quả. Spearman cũng có thể gần 0 với hình chữ U, nhưng với quan hệ đơn điệu mà cong thì nó cao hơn Pearson, nên không chắc được.
Hỏi nhanh
Một feature có Pearson 0.3 với nhãn, nhưng Spearman 0.9. Dữ liệu nhiều khả năng trông thế nào?
Spearman cao nghĩa là thứ hạng gần như cùng tăng. Pearson thấp hơn nhiều thì quan hệ không thẳng, hoặc vài điểm cực lớn kéo lệch tổng bình phương. Thứ hạng không quan tâm điểm ngoại lai lớn tới đâu. Đường thẳng thì cả hai đều gần 1, còn nhãn giảm thì cả hai đều âm.
Khi đi thi
- Viết rõ điều kiện nằm ở phía nào: khác . Khi rối, đếm trên 10 000 mẫu như mục Bayes.
- NumPy chia , pandas chia khi tính
std. - Hai model chênh nhau ít hơn hai lần thì chưa nói được model nào tốt hơn.
Tóm tắt
- Xác suất là tỉ lệ khi lặp lại nhiều lần; đếm hoặc mô phỏng đều được.
- : chỉ đếm trong nhóm điều kiện; độc lập khi .
- Bayes đảo chiều điều kiện; tỉ lệ nền quyết định nhiều.
- Kỳ vọng là trung bình có trọng số xác suất, có tính tuyến tính; median ít bị giá trị cực đoan kéo.
- Phương sai là trung bình bình phương độ lệch, là căn của nó; z-score .
- Phân phối chuẩn: 68–95–99.7; trung bình của nhiều biến độc lập gần chuẩn.
- Accuracy trên mẫu có sai số chuẩn , giảm theo .
- Pearson đo xu hướng thẳng, Spearman đo xu hướng đơn điệu qua thứ hạng; hệ số gần 0 vẫn có thể có quan hệ cong, và tương quan không phải nhân quả.
Kiểm tra cuối bài
Mười câu dưới đây bao quát cả bài. Làm hết rồi xem điểm; câu nào sai thì đọc lại mục tương ứng.
Câu 1
Trung bình của dãy là bao nhiêu?
Tổng là 30, chia cho 5 số được 6. là chia nhầm cho 6, như đếm thêm một phần tử. là giá trị lớn thứ hai. không ứng với cách tính nào hợp lý.
Câu 2
Median của dãy là bao nhiêu?
Dãy đã sắp xếp, có 5 phần tử, nên median là phần tử thứ 3, bằng 5. Ở dãy đối xứng này median trùng trung bình. là giá trị lớn nhất; và là hai phần tử cạnh giữa.
Câu 3
Phương sai của dãy là bao nhiêu?
Mọi giá trị đều bằng trung bình 0, nên mọi độ lệch bằng 0 và phương sai bằng 0. Phương sai chỉ không xác định khi không có giá trị nào, hoặc khi chia cho với . là số phần tử.
Câu 4
Tung một xúc xắc sáu mặt cân đối. Xác suất ra mặt từ 5 trở lên là bao nhiêu?
Hai mặt thuận lợi (5 và 6) trên 6 mặt: . là chỉ đếm mặt 5. là đếm thêm mặt 4. là phần bù, xác suất ra mặt từ 1 tới 4.
Câu 5
Với phân phối chuẩn, khoảng bao nhiêu phần trăm giá trị nằm trong một độ lệch chuẩn quanh trung bình?
Quy tắc 68–95–99.7: một, hai, ba độ lệch chuẩn. 95% là cho hai độ lệch chuẩn. 50% là nửa phân phối, chẳng hạn mọi giá trị dưới trung bình.
Câu 6
Hai biến cố và độc lập khi nào?
Độc lập nghĩa là biết không đổi xác suất của , tương đương với tích. Ba phương án còn lại mô tả hai biến cố xung khắc, không thể cùng xảy ra. Hai biến cố xung khắc mà mỗi cái có xác suất dương thì lại rất không độc lập: biết xảy ra là biết chắc không xảy ra.
Câu 7
Định lý Bayes dùng để tính gì?
Bayes đảo chiều điều kiện, nhờ thêm tỉ lệ nền và . Tổng và tích của hai xác suất là các phép tính khác, đúng trong những điều kiện riêng. Trung bình và phương sai là đại lượng thống kê, không cần Bayes.
Câu 8
Độ lệch chuẩn là gì?
, nên cùng đơn vị với dữ liệu. Tổng các độ lệch so với trung bình luôn bằng 0, không đo được gì. Trung bình trị tuyệt đối của độ lệch là một đại lượng khác, MAD, cũng đo độ phân tán nhưng không phải độ lệch chuẩn.
Câu 9
Một tập dữ liệu có trung bình 10, độ lệch chuẩn 2. z-score của giá trị 14 là bao nhiêu?
: giá trị này cách trung bình hai độ lệch chuẩn. là quên chia cho độ lệch chuẩn. là chia 14 cho 2 mà quên trừ trung bình.
Câu 10
Trên 500 ảnh validation, model A đạt 0.80 và model B đạt 0.82. Sai số chuẩn của mỗi số khoảng 0.018. Nhóm nên kết luận thế nào?
Chênh 0.02 nhỏ hơn hai lần sai số chuẩn, nên rất có thể chỉ là nhiễu do 500 ảnh được chọn. “Chắc chắn” là bỏ qua nhiễu. Không có dấu hiệu nào cho thấy A tốt hơn. Nói hai model như nhau cũng quá mạnh: chưa phân biệt được không có nghĩa là bằng nhau. Bằng chứng thêm có thể là validation lớn hơn, cross-validation, hoặc so trên những ảnh hai model trả lời khác nhau.
Đọc thêm
- Seeing Theory — A visual introduction to probability and statistics. Trang tương tác của Đại học Brown: xác suất, Bayes, phân phối, định lý giới hạn trung tâm bằng hình động.
- Khan Academy — Statistics and probability. Bài giảng và bài tập từ trung bình, phương sai tới xác suất có điều kiện.
- 3Blue1Brown — Bayes theorem, the geometry of changing beliefs. Bayes bằng hình vẽ, đúng ví dụ xét nghiệm bệnh hiếm.
- Downey — Think Stats. Sách miễn phí, thống kê bằng Python và mô phỏng, rất gần cách làm của bài.