Phần 2: Học có giám sát (Supervised Learning)
Hai loại học có
giám sát: hồi qui và phân loại. Hồi qui tuyến tính, các hàm lỗ, và đạo hàm giảm.
Chúng ta sẽ xài
bao nhiêu đô la cho quảng cáo kỹ thuật số? Khoản nợ này có hoàn lại hay không?
Chuyện gì sẽ xảy ra với thị trường chứng khoán ngày mai?
Trong các bài
toán học có giám sát, chúng ta sẽ bắt đầu với tập dữ liệu chứa các ví dụ dạy học
bằng các nhãn đúng đi kèm. Ví dụ, khi học phân loại các chữ số viết tay, một giải
thuật học có giám sát sẽ lấy hàng ngàn bức ảnh về các chữ số viết tay có nhãn
chứa các số đúng mà mỗi ảnh biểu diễn. Sau đó thuật toán sẽ học được mối quan hệ
giữa các bức ảnh và các số gắn ở nhãn đi kèm, rồi áp dụng mối quan hệ học được
vào phân loại các ảnh mới hoàn toàn (không có nhãn) mà máy chưa từng nhìn thấy
trước đó. Đó là cách bạn có thể thanh toán một hóa đơn chỉ bằng cách dùng điện
thoại chụp ảnh!
Để minh họa cách
học có giám sát làm việc thế nào, hãy xem bài toán dự đoán thu nhập hàng năm dựa
trên số năm được đi học trình độ cao hơn của ai đó. Một cách hình thức hơn,
chúng ta sẽ xây dựng một mô hình xấp xỉ mối quan hệ f giữa số năm đi học trình
độ cao hơn X và thu nhập hằng năm tương ứng Y.
Y = f(X) + ɛ
X (đầu vào) = số
năm học trình độ cao hơn
Y (đầu ra) = thu
nhập hàng năm
f = hàm mô tả mối
quan hệ giữa X và Y
ɛ (epsilon) =
sai số ngẫu nhiên (dương hoặc âm) có giá trị trung bình bằng 0
Về epsilon, cần
chú ý:
(1) ɛ
biểu diễn sai số không thể giảm được trong mô hình, đó là giới hạn về mặt lý
thuyết quanh hiệu suất thuật toán của bạn do có nhiễu trong hiện tượng bạn đang
cố giải thích. Ví dụ, hãy tưởng tượng đang xây dựng một mô hình để dự đoán kết
quả lật đồng xu.
(2) Rất
ngẫu nhiên, nhà toán học Paul Erdös gọi trẻ em là “epsilons” vì trong phương
pháp tính (chứ không phải thống kê!), ɛ thể hiện một số dương nhỏ tùy tiện. Phù
hợp, không ư? Một phương pháp dự đoán thu nhập có thể tạo ra một mô hình dựa
trên các qui tắc để biết cách thu nhập và giáo dục có liên quan với nhau thế
nào. Ví dụ, “Tôi ước tính cứ thêm một năm giáo dục bậc cao hơn, thì thu nhập hằng
năm lại tăng thêm 5.000 đô la.”
Thu_nhập = ($5.000 * số_năm_học_cao) +
thu_nhập_mức_sàn
Hướng tiếp cận
này là một ví dụ về cách xử lý kỹ thuật một giải pháp (so với
học
một giải pháp, như phương pháp hồi qui tuyến tính sẽ mô tả bên dưới).
Bạn có thể tìm
ra một mô hình phức tạp hơn bằng cách thêm vào một vài qui tắc về kiểu bằng cấp,
số năm làm việc, cấp bậc trường học… Ví dụ: “Nếu họ đã học xong bằng cử nhân hoặc
cao hơn, thu nhập sẽ được dự đoán là gấp 1,5 lần.”
Nhưng kiểu lập
trình theo qui tắc rõ ràng thế này không hoạt động suôn sẻ với dữ liệu phức tạp.
Hãy tưởng tượng bạn đang cố thiết kế một giải thuật phân loại hình ảnh bằng những
câu lệnh if-then (nếu – thì) nhằm mô tả các dạng kết hợp giữa độ sáng của các
pixel để gán nhãn “con mèo” hoặc “không phải con mèo”.
Học có giám sát
giải quyết bài toán này bằng cách để máy tính làm việc đó cho bạn. Sau khi xác
định các mẫu trong dữ liệu, máy tính sẽ có thể tạo ra các heuristic. Sự khác
nhau chính giữa kiểu học này với kiểu học của con người là, học bằng máy chạy
trên phần cứng máy tính và hiểu được tốt nhất thông qua các lăng kính của khoa
học và thống kê máy tính, trong khi đó việc tìm mẫu phù hợp của con người xảy
ra trong một bộ não sinh học (dù cả hai có cùng mục tiêu).
Trong học có
giám sát, máy sẽ cố học được mối liên quan giữa thu nhập và giáo dục từ một mớ
hổ lốn, bằng cách chạy tập dữ liệu đào tạo đã được gán nhãn bằng một giải thuật
dạy học. Hàm học được này có thể dùng để dự đoán thu nhập của mọi người khi thu
nhập Y chưa biết, còn số năm đào tạo X là đầu vào. Nói cách khác, chúng ta có
thể áp dụng mô hình cho các dữ liệu kiểm thứ chưa gán nhãn để dự đoán Y.
Mục đích của học
có giám sát là tiên đoán Y càng chính xác càng tốt khi cho các ví dụ mới với X
đã biết, Y chưa biết. Tiếp theo, chúng ta sẽ khám phá một vài hướng tiếp cận phổ
biến nhất để làm điều đó.
Hồi qui: tiên đoán một giá trị liên tục
Hồi qui tiên
đoán biến mục tiêu Y liên tục. Nó cho phép bạn ước lượng một giá trị, chẳng hạn
giá nhà hay tuổi đời con người, dựa trên dữ liệu đầu vào X.
Ở đây, biến mục
tiêu có nghĩa là biến chưa biết mà chúng ta phải dự đoán, còn liên tục có nghĩa
là không có khoảng trống (sự ngừng lại giữa chừng) trong các giá trị Y có thể
mang.
Cân nặng của một
người là các giá trị liên tục. Còn các biến rời rạc chỉ lấy một số giá trị nhất
định – ví dụ, số con của một người nào đó là một giá trị rời rạc.
Tiên đoán thu nhập
là một bài toán hồi qui cổ điển. Dữ liệu đầu vào X của bạn chứa toàn bộ thông
tin liên quan về các cá nhân trong tập dữ liệu có thể được sử dụng để tiên đoán
thu nhập, chẳng hạn như số năm học trình độ cao, số năm kinh nghiệm làm việc,
chức danh công việc, hay mã vùng. Các thuộc tính đó gọi là Đặc điểm, có thể bằng số
(ví dụ số năm kinh nghiệm làm việc) hoặc phân nhóm (ví dụ chức danh hoặc lĩnh vực
học).
Bạn sẽ muốn có
càng nhiều quan sát càng tốt cho những đặc trưng này của đầu ra mục tiêu Y, vì
thế mô hình của bạn có thể học được mối quan hệ f giữa X và Y.
Dữ liệu được
chia thành tập dữ liệu đào tạo và tập dữ liệu kiểm thử. Tập dữ liệu đào tạo đều
có nhãn, vì thế mô hình của bạn có thể học được từ các ví dụ đã gán nhãn. Tập
kiểm thử không có nhãn, ví dụ bạn chưa biết giá trị bạn đang cố dự đoán là gì.
Quan trọng là mô hình của bạn có thể tổng quát hóa các tình huống mà nó chưa gặp
trước đó, nhờ vậy nó có thể hoạt động tốt trên tập dữ liệu kiểm thử.
Hồi
qui
Y=f(X)
+ ɛ trong đó X = (x1, x2, …, xn)
Đào tạo:
máy học f từ các dữ liệu đào tạo đã gán nhãn
Kiểm
thử: máy tiên đoán Y từ dữ liệu kiểm thử chưa gán nhãn
Chú
ý, X có thể là một tensor có số chiều bất kỳ. Tensor 1D là vector (1 hàng, nhiều
cột), tensor 2D là một ma trận (nhiều hàng, nhiều cột), bạn cũng có thể có
tensor 3,4,5 chiều hay nhiều hơn nữa. Để xem lại thuật ngữ này, hãy tìm đọc
trong đại số tuyến tính.
Trong ví dụ 2D
đơn giản của chúng ta, có thể lấy từ một file .csv trong đó mỗi hàng chưa trình
độ học vấn và thu nhập của một người. Khi thêm một cột nữa là thêm một đặc điểm
nữa vào, và bạn sẽ có một mô hình phức tạp hơn, nhưng có thể chính xác hơn.
Vậy chúng ta giải quyết những bài toán kiểu này thế nào?
Làm sao chúng ta
xây dựng được các mô hình tạo ra các dự đoán chính xác, hữu ích trong thế giới
thực? Chúng ta có thể làm được điều đó bằng cách dùng các thuật toán học có giám sát.
Nào, hãy đi vào
phần rất thú vị: Tìm hiểu các thuật toán.
Chúng ta sẽ khám phá vài cách theo hướng hồi qui và phân loại, đồng thời minh họa
các khái niệm machine learning chính.
2.1. Học có giám sát: Hồi qui
2.1.1. Hồi qui tuyến tính (Bình phương nhỏ nhất)
“Hãy vẽ một đường thẳng. Đúng, đó chính là
cách máy học.”
Đầu tiên, chúng
ta sẽ tập trung giải quyết bài toán dự đoán thu nhập bằng hồi qui tuyến tính,
vì các mô hình tuyến tính không hoạt động tốt trong các tác vụ nhận dạng hình ảnh
(đây là lĩnh vực của deep learning mà chúng ta sẽ tìm hiểu sau).
Chúng ta có tập
dữ liệu JX, và các giá trị mục tiêu Y tương ứng. Mục đích của phương pháp Hồi
qui theo Bình phương tối thiểu (Orginary Least Squares – OLS) là học bằng một
mô hình tuyến tính mà chúng ta có thể dùng để tiên đoán giá trị mới của y với x
đã cho chưa từng gặp trước đó, trong đó sai số càng nhỏ càng tốt. Chúng ta muốn
đoán được ai đó kiếm được bao nhiêu thu nhập dựa trên số năm học họ đã trải
qua.
X_train =
[4,5,0,2,…,6] #số năm học cao hơn học phổ thông
Y_train =
[80,91.5,42,55,…,100] #thu nhập hàng năm tương ứng, tính bằng đơn vị nghìn đô
la
Hồi qui tuyến
tính là phương pháp có tham số, nghĩa là nó đưa ra giả thiết về dạng của hàm thể
hiện mối tương quan giữa X và Y (chúng ta sẽ tìm hiểu ví dụ về các phương pháp
không có tham số sau). Mô hình của chúng ta là một hàm tiên đoán ŷ với một giá
trị x cụ thể đã cho:
ŷ = ß0
+ ß1 * x + ɛ
trong trường hợp
này, chúng ta giả thiết rõ ràng rằng có mối quan hệ tuyến tính giữa X và Y – vì
thế, với mỗi đơn vị tăng lên trong X, chúng ta sẽ thấy ở Y cũng tăng (hay giảm)
đi một hằng số.
ß0 là
điểm chặn của y còn ß1 là độ dốc đường thẳng, ví dụ thu nhập tăng
(hay giảm) bao nhiêu với một năm học thêm vào.
Mục tiêu của
chúng ta là học các tham số mô hình (trong trường hợp này là ß0 và ß1)
để chúng tối thiểu hóa lỗi trong các tiên đoán từ mô hình.
Để tìm các tham
số phù hợp nhất:
(1) Định
nghĩa hàm chi phí, hoặc hàm lỗ - đo lường các tiên đoán từ mô hình của chúng ta
gây ra độ không chính xác như thế nào.
(2) Tìm
các tham số tối thiểu hóa sai số, ví dụ làm mô hình của chúng ta càng chính xác
càng tốt.
Về mặt đồ thị, nếu
có 2 chiều thì kết quả sự phù hợp nhất là một đường thẳng. Nếu 3 chiều, ta phải
vẽ thêm 1 mặt phẳng nữa, và cứ thế với số chiều lớn hơn.
Chú ý về chiều
kích: ví dụ của chúng ta đơn giản chỉ có 2 chiều, nhưng rõ ràng bạn sẽ cần nhiều
đặc điểm hơn (các x) và nhiều cơ số hơn (các beta) trong mô hình của mình, ví dụ,
khi thêm nhiều biến liên quan vào để cải thiện độ chính xác trong các tiên đoán
từ mô hình của bạn. Các nguyên tắc tương tự được tổng quát hóa cho các chiều
kích cao hơn, dù mọi thứ sẽ khó hình dung bằng đồ họa hơn 3 chiều.
Về mặt toán học,
chúng ta nhìn vào sự khác biệt giữa mỗi điểm dữ liệu thực (y) và tiên đoán từ
mô hình (ŷ). Hãy bình phương sai số này để tránh số âm, cộng chúng lại và tính
trung bình. Đó là cách đo lường xem dữ liệu của chúng ta phù hợp với đường thẳng
thế nào.
n = # các quan
sát. Sử dụng 2*n thay cho n để phép toán trơn tru hơn khi lấy đạo hàm tối thiểu
hóa sai số, dù một số nhà thống kê nói đó là vớ vẩn. Khi bạn bắt đầu có quan điểm
về dạng stuff này, bạn sẽ biết mình đang trong lỗ thỏ.
Với bài toán đơn
giản thế này, chúng ta có thể tính toán một giải pháp đóng bằng cách sử dụng
phương pháp tính để tìm ra các tham số beta tối ưu để tối thiểu hóa sai số.
Nhưng khi hàm chi phí có độ phức tạp tăng lên, việc tìm một giải pháp dưới dạng
hàm đóng bằng phương pháp tính sẽ không còn khả thi nữa. Vì thế cần hướng tiếp
cận khác, gọi là đạo hàm giảm (gradient descent), cho phép ta tối thiểu hóa hàm
sai số phức tạp.
2.1.2. Gradient Descent: học tham số
“Hãy bịp mắt lại, và bước xuống dốc. Bạn sẽ
thấy đáy khi bạn chẳng còn nơi nào để bước lên.”
Gradient descent
(đạo hàm giảm) sẽ còn trở lại với chúng ta nhiều lần nữa, đặc biệt trong các mạng
neuron. Các thư viện machine learning giống như scikit-learn và TensorFlow đều
sử dụng nó làm nền tảng khắp nơi, vì thế nó rất đáng giá nếu bạn hiểu chi tiết.
Mục đích của
grandient descent là tìm cách tối thiểu hàm sai số trong mô hình của chúng ta bằng
cách lặp đi lặp lại phương pháp xấp xỉ nó theo hướng làm nó tốt dần lên.
Hãy tưởng tượng
bạn bị bịp mắt lại và đang đi vào một thung lũng. Mục đích của bạn là tìm ra
chân đáy thung lũng. Bạn làm cách nào đây?
Hướng hợp lý nhất
là cứ chạm vào mặt đất xung quanh và di chuyển về hướng mặt đất dốc xuống nhất.
Làm một bước rồi lặp lại đúng cách như vậy cho bước tiếp theo, tới khi mặt đất
xung quanh bằng phẳng. Khi đó bạn biết mình đã tới chân thung lũng; nếu di chuyển
theo bất kỳ hướng nào, bạn có thể quay về vị trí cũ hoặc ở trên sườn cao hơn nữa.
Trở lại với vấn
đề toán học, mặt đất trở thành hàm lỗ/hàm sai số, và việc dò đáy thung lũng là
việc tối thiểu hàm này.
Giờ hãy nhìn vào
hàm lỗ mà chúng ta đã biết trong hồi qui:
Chúng ta thấy
đây thực sự là một hàm hai biến: ß0 và ß1. Tất cả các thứ
còn lại đã xác định, từ X, Y và n đều đã được cho trong quá trình đào tạo.
Chúng ta muốn tối thiểu hóa hàm này.
Hàm trở thành f(ß0,ß1)=z.
Để bắt đầu đạo hàm xuống, bạn phải đoán các tham số ß0,ß1 dùng để tối thiểu hóa
hàm.
Tiếp theo, bạn
phải đạo hàm từng phần hàm sai số cho mỗi tham số beta: [dz/dß0, dz/dß1]. Đạo
hàm từng phần cho thấy tổng sai số bị giảm hoặc tăng bao nhiêu nếu bạn tăng ß0 hay
ß1 một lượng rất nhỏ.
Nhìn theo hướng
khác, ước lượng về thu nhập hằng năm của bạn có thể tăng lên bao nhiêu với giả
thiết ß0 – trình độ giáo dục – làm tăng sai số (ví dụ, độ không chính xác) cho
mô hình của bạn? Bạn muốn theo hướng ngược lại để đi xuống đồi và tối thiểu sai
số chứ?
Tương tự, nếu bạn
tăng ước lượng bao nhiêu năm giáo dục bậc cao ảnh hưởng tới thu nhập - ß1, điều
đó sẽ làm tăng sai số lên bao nhiêu? Nếu đạo hàm từng phần dz/dß1 là số âm, thì
tăng ß1 là tốt vì nó sẽ làm giảm tổng sai số. Nếu là số dương, bạn sẽ muốn giảm
ß1. Nếu nó bằng 0, không thay đổi ß1 vì điều này có nghĩa là bạn đã có con số tối
ưu.
Hãy tiếp tục làm
cho tới khi bạn chạm tới đáy, ví dụ thuật toán đã đồng qui và sai số đã tối thiểu.
Có nhiều thủ thuật và trường hợp ngoại lệ trong phạm vi thực hiện, nhưng nói chung,
đây vẫn là cách giúp bạn tìm ra các tham số tối ưu cho mô hình có tham số của bạn.
Overfitting – Quá phù hợp
Overfitting – quá mức phù hợp:
“Sherlock, giải thích của anh về những gì vừa xảy ra quá cụ thể cho tình huống
này.”
Regularization – qui tắc hóa: “Đừng phức
tạp hóa quá mức mọi thứ, Sherlock. Cứ mỗi từ lạ thêm vào, tôi sẽ đấm cho cậu một
cái.”
Hyperparameter(λ) – siêu tham số: “Ở
đây có đủ sức mạnh để tôi đấm cho cậu một cái nếu có từ lạ thêm vào.”
Vấn đề phổ biến
trong machine learning là overfitting – phù hợp quá mức: học một hàm mà hàm đó
giải thích hoàn hảo tập dữ liệu đào tạo cho mô hình, nhưng lại không khái quát
hóa tốt cho tập dữ liệu kiểm thử chưa từng gặp. Overfitting xảy ra khi một mô
hình học quá nhiều từ dữ liệu đào tạo tới mức nó bắt đầu nhặt cả những đặc điểm
riêng biệt không đại diện cho các mẫu trong thế giới thực. Điều này trở thành vấn
đề đặc biệt, vì bạn đang làm cho mô hình của mình gia tăng độ phức tạp. Ngược lại,
underfitting – chưa phù hợp – lại là vấn đến liên quan tới việc mô hình của bạn
chưa đủ phức tạp để nắm bắt được xu hướng cơ bản của dữ liệu.
Cân bằng
Sai số hệ thống rời – Phương sai (Bias – Variance Tradeoff)
Sai số hệ thống rời (Bias) là tổng số lỗi xảy
ra khi xấp xỉ hóa hiện tượng trong thế giới thực bằng một mô hình đơn giản hóa.
Phương sai (variance) là lỗi kiểm thử trong
mô hình của bạn thay đổi bao nhiêu dựa trên biến động của dữ liệu đào tạo. Nó
phản ánh độ nhạy cảm của mô hình với những đặc điểm cá biệt của tập dữ liệu mà
nó được đào tạo từ đó.
Khi mô hình tăng độ phức tạp và trở lên linh
hoạt hơn, sai số hệ thống rời giảm xuống (tức nó đang giải thích tập dữ liệu
đào tạo tốt), nhưng phương sai lại tăng lên (nó không khái quát hóa tốt). Cuối
cùng, để có một mô hình tốt, bạn cần một mô hình có sai số hệ thống rời thấp và
cả phương sai thấp.
Nhớ rằng điều
duy nhất chúng ta quan tâm là làm sao mô hình hoạt động được trên dữ liệu kiểm
thử. Bạn muốn tiên đoán email nào sẽ bị đánh dấu là spam trước khi chúng bị
đánh dấu, chứ không chỉ là một mô hình phân loại lại các email (vốn đã được
dùng để xây dựng nên nó ban đầu) với độ chính xác 100%. Nhận thức muộn là 20/20
– câu hỏi thực tế là liệu các bài học đã học được có giúp gì trong tương lai
không.
Mô hình bên phải
có sai số bằng không đối với dữ liệu đào tạo vì nó phù hợp hoàn hảo tại mọi điểm
dữ liệu. Nhưng bài học không được khái quát hóa. Với một điểm dữ liệu mới không
nằm trên đường đi của mô hình, nó có thể gây ra sai lầm khủng khiếp.
Có 2 cách để xử
lý overfitting:
(1) Dùng
thêm dữ liệu đào tạo. Bạn càng có nhiều, càng khó bị overfit dữ liệu khi học
quá nhiều từ bất kỳ ví dụ đào tạo đơn lẻ nào.
(2) Qui
tắc hóa. Thêm một điểm phạt vào hàm sai số vì dựng mô hình gán quá nhiều sức mạnh
giải thích cho một đặc điểm bất kỳ hoặc cho phép quá nhiều đặc điểm được đưa
vào xem xét.
Phần đầu của biểu
thức trên là hàm chi phí bình thường. Phần thứ hai là hàm qui tắc hóa được thêm
vào một điểm phạt vì các hệ số beta lớn sẽ có quá nhiều sức mạnh giải thích cho
bất kỳ đặc điểm nào. Với hai thành phần này, hàm sai số giờ đã cân bằng được 2
ưu tiên: giải thích được dữ liệu đào tạo và ngăn giải thích đó trở thành quá mức
cụ thể.
Hệ số lambda
trong thuật ngữ qui tắc hóa của hàm chi phí là một siêu tham số
(hyperparameter): nó là một con số thiết lập khái quát mô hình của bạn, có thể
tăng hoặc giảm để cải thiện hiệu suất. Giá trị lambda cao hơn sẽ phạt các hệ số
beta lớn nghiệt ngã hơn vì beta lớn có thể dẫn tới overfitting tiềm tàng. Để
quyết định giá trị lớn nhất của lambda, bạn nên dùng phương pháp gọi là xác nhận
chéo (cross – validation), cho phép chứa một phần dữ liệu đào tạo trong quá
trình đào tạo, sau đó sẽ thấy mô hình của mình giải thích phần được chứa tốt đến
mức nào. Chúng ta sẽ đi sâu vào phần này hơn.
Ô! Chúng ta đã
làm được rồi.
Bạn đã học được gì từ toàn bộ phần trên?
-
Máy học có giám sát cho phép các
máy tính học tập từ dữ liệu đào tạo được gán nhãn mà không cần lập trình tường
minh như thế nào
-
Hai loại học có giám sát: hồi
qui và phân loại
-
Hồi qui tuyến tính: thuật toán
có tham số theo kiểu bánh mì và bơ
-
Học về các tham số với phương
pháp đạo hàm giảm (gradient descent)
-
Quá phù hợp (overfitting) và qui
tắc hóa (regularization)
Phần tiếp theo, chúng ta sẽ nói về 2 phương pháp căn bản của phân loại:
hồi qui logistic và máy vector hỗ trợ (support vector machines – SVM).
Để hiểu sâu hơn:
-
Hồi qui tuyến tính: để hiểu hơn
nữa về hồi qui tuyến tính, hãy đọc cuốn sách An introduction to Statistical
Learning. Cuốn sách này có bản free online và là nguồn tài nguyên tuyệt vời để
hiểu các khái niệm machine learning kèm bài tập. Có thể xài thử Boston Housing
dataset. Bạn cũng có thể dùng phần mềm với GUI đẹp mắt như Minitab và Excel hoặc
khó hơn là xài Python hay R. Hãy thử vượt qua thử thách Kaggle, chẳng hạn như
tiên đoán giá nhà, hoặc xem người ta tiếp cận bài toán theo hướng khác thế nào.
-
Đạo hàm giảm (gradient descent):
muốn thực sử triển khai gradient descent bằng Python, hãy đọc tài liệu hướng dẫn.
Ở trong hướng dẫn sẽ mô tả các khái niệm tương đương theo cách toán học hơn.
Trong thực hành, bạn hiếm khi cần dùng gradient descent từ đầu, nhưng phải hiểu
nó hoạt động thế nào để bạn sử dụng nó hiệu quả hơn và hiểu được tại sao nhiều
thứ bị hỏng giữa chừng khi chúng làm việc.
2.2. Học có giám sát: Phân loại
Phân loại bằng hồi qui logistic và máy vector hỗ trợ (SVM)
Phân loại: dự đoán nhãn
Email này có là thư rác hay không? Người vay
này có trả được khoản vay của họ không? Người dùng sẽ click vào quảng cáo chứ?
Ai là người trong ảnh Facebook của bạn?
Phương pháp phân
loại tiên đoán một nhãn mục tiêu Y rời rạc. Phân loại là bài toán gán các quan
sát mới cho một lớp các đối tượng dữ liệu có vẻ phù hợp nhất, dựa trên một mô
hình phân loại được xây dựng từ dữ liệu đào tạo đã gán nhãn.
Độ chính xác của
việc phân loại phụ thuộc vào hiệu quả giải thuật bạn lựa chọn, cách bạn áp dụng
nó, và việc bạn có dữ liệu đào tạo hữu dụng nhiều đến mức nào.
2.2.1. Phương pháp hồi qui logistic: 0 hay 1?
Hồi qui logistic
là một phương pháp phân loại: mô hình này cho đầu ra là xác suất biến mục tiêu
Y được phân nhóm thuộc về một lớp cụ thể nào đó.
Một ví dụ thú vị về phân loại là quyết định
xem một đơn đăng ký vay nợ có gian lận hay không.
Nói chung, người cho vay muốn biết họ có nên
cho người đăng ký vay được vay tiền hay không, và họ tất nhiên cũng có khả năng
chịu rủi ro trong một giới hạn nhất định. Trong trường hợp này, mục tiêu của hồi
qui logistic là tính toán xác suất đơn đi vay là gian lận (giữa 0% và 100%). Với
các xác suất này, chúng ta có thể thiết lập vài hạn mức cho vay với người đi
vay, nếu trên hạn mức thì cho vay, dưới hạn mức thì từ chối hoặc đánh dấu vào để
theo dõi kiểm tra kỹ hơn.
Dù hồi qui
logistic thường được dùng cho phân loại nhị phân – chỉ có 2 lớp – nhưng nhớ rằng
cách phân loại này cũng có thể thực hiện với số lượng lớp bất kỳ (ví dụ, khi
gán các chữ số viết tay một cái nhãn từ 0 đến 9, hoặc dùng nhận dạng gương mặt
để phát hiện có bạn bè nào trên bức ảnh Facebook không).
Tôi có thể sử dụng phép toán bình phương nhỏ
nhất không?
Không nên. Nếu bạn
đã đào tạo một mô hình hồi qui tuyến tính trên một tập ví dụ trong đó Y=0 hoặc
1, thế là bạn có thể phải chứng kiến một số xác suất nhỏ hơn 0 hoặc lớn hơn 1,
toàn những con số vô nghĩa. Quả thực, chúng ta nên dùng một mô hình hồi qui
logistic (hay mô hình logit) được thiết kế để gán xác suất từ 0% tới 100% với Y
thuộc về một lớp xác định nào đó.
Toán học làm việc thế nào?
Chú ý: toán học
trong phần này rất thú vị, nhưng có lẽ chỉ trên khía cạnh kỹ thuật. Cứ thoải
mái đọc lướt qua nếu bạn quan tâm tới các khái niệm mức cao hơn. Mô hình logit
là một biến thể sửa đổi của hồi qui tuyến tính, nhằm đảm bảo đầu ra là một xác
suất từ 0 đến 1 nhờ áp dụng hàm sigma, trên đồ thị, giống như đường cong chữ S.
Hàm sigma đảo lại
các giá trị giữa 0 và 1.
Hãy nhớ tới biểu
thức gốc của mô hình hồi qui tuyến tính đơn giản, giờ chúng ta sẽ gọi là g(x)
vì chúng ta sắp sử dụng nó trong một hàm kết hợp:
Bây giờ để giải
quyết vấn đề nhận được đầu ra của mô hình nhỏ hơn 0 hoặc lớn hơn 1, chúng ta sẽ
định nghĩa một hàm mới F(g(x)), hàm này làm biến đổi g(x) bằng cách đảo ngược đầu
ra của hồi qui tuyến tính tới một giá trị trong dải [0,1]. Bạn có nghĩ một hàm
có thể làm được việc này không?
Bạn đang nghĩ tới
hàm sigma phải không? Bùm! Nhanh đấy! Bạn đúng rồi.
Vì thế chúng ta
cắm hàm g(x) vào hàm sigma ở trên, kết quả được một hàm cho đầu ra là xác suất
nằm trong khoảng giữa 0 và 1:
Nói cách khác,
chúng ta đang tính toán xác suất để ví dụ đào tạo này thuộc về một lớp cụ thể
nào đó: P(Y=1).
Ở đây chúng ta
đã cô lập p, xác suất khi Y=1, bên vế trái của đẳng thức. Nếu chúng ta muốn giải
quyết để biểu thức ß0+ß1x+ɛ sạch đẹp bên vế phải, ta có thể dịch thẳng các hệ số
beta sắp học được, thay bằng tỷ số log lẻ, hay logit, ở vế bên trái – thế là được
“mô hình logit”:
Tỷ số log lẻ đơn
giản là log tự nhiên của tỷ lệ lẻ p/(1-p) mà ta thường thấy trong giao tiếp hằng
ngày.
“Ồ, điều bạn nghĩ đến từ “lẻ” có lẽ là cảnh
Tyrion Lannister chết trong Trò chơi Vương quyền mùa này phải không?”
Hừm. Chắc chắn gấp 2 lần là không. Lẻ từ 2 tới
1. Chắc chắn anh ta quá quan trọng để bị giết, nhưng tất cả chúng ta đã thấy những
gì họ làm với Ned Stark…”
Chú ý rằng trong
mô hình logit, ß1 giờ biểu diễn tỷ lệ thay đổi trong tỷ số log lẻ khi X biến đổi.
Nói cách khác, đó là “độ dốc log lẻ”, chứ không phải “độ dốc xác suất”.
Log lẻ có lẽ hơi
không nhạy cảm nhưng rất đáng để tìm hiểu rõ về nó vì ta sẽ gặp lại nó khi dịch
đầu ra của các tác vụ phân loại bằng mạng neuron.
Sử dụng đầu ra của mô hình hồi qui logistic
để ra quyết định
Đầu ra của mô
hình hồi qui logistic trên trông giống đường cong chữ S, thể hiện P(Y=1) dựa
trên giá trị của X:
Để dự đoán nhãn
Y – là spam/không phải spam, bị ung thư/không bị ung thư, giả mạo/không giả mạo,…
- bạn phải thiết lập một điểm chặn xác suất, hay một hạn mức, cho giá trị kết
quả dương. Ví dụ: “Nếu mô hình của chúng
ta nghĩ xác suất email này là spam cao hơn 70%, mô hình sẽ gán nhãn cho nó là
spam. Ngược lại là không phải.”
Hạn mức phụ thuộc
khả năng chấp nhận các giá trị dương sai so với các giá trị âm sai của bạn. Nếu
bạn đang chẩn đoán ung thư, bạn nên có độ dung sai rất nhỏ cho các giá trị âm
sai, vì ngay cả khi có khả năng rất nhỏ rằng bệnh nhân bị ung thư thì bạn vẫn cần
phải thực hiện nhiều tác vụ kiểm thử sâu hơn để đảm bảo chắc chắn. Vì vậy bạn
nên thiết lập một hạn mức thật thấp cho kết quả dương.
Trong trường hợp
đơn xin vay giả mạo, khả năng dung lỗi cho các giá trị dương sai có lẽ cao hơn,
đặc biệt cho những khoản vay nhỏ hơn, vì việc điều trị sâu hơn sẽ rất tốn kém
còn một khoản vay nhỏ có lẽ không đáng để trả cho chi phí phát sinh thêm vào nếu
muốn giả mạo.
Tối thiểu hóa sai số bằng hồi qui logistic
Như trong trường
hợp hồi qui tuyến tính, chúng ta sử dụng đạo hàm giảm để học các tham số beta
làm tối thiểu hóa sai số.
Trong hồi qui
logistic, hàm sai số về cơ bản là thước đo mức độ thường xuyên bạn có tiên đoán
được giá trị 1 không trong khi câu trả lời đúng là 0, hoặc ngược lại. Hàm chi
phí dưới đây được qui tắc hóa giống như ta từng làm với hồi qui tuyến tính.
Đừng hoảng sợ
khi nhìn thấy đẳng thức dài như vậy! Hãy chia nhỏ nó ra và nghĩ xem chuyện gì sẽ
xảy ra trong mỗi phần về mặt khái niệm. Sau đó các chi tiết cụ thể sẽ bắt đầu tự
nói lên ý nghĩa của nó.
Phần đầu tiên là
sai số dữ liệu, ví dụ chênh lệch nhiều bao nhiêu giữa dự đoán của mô hình và thực
tế. Phần thứ hai là sai số qui tắc hóa, ví dụ chúng ta phạt mô hình bao nhiêu
khi có các tham số lớn khiến một số đặc điểm có trọng số nặng hơn (nhớ là điều
này giúp ngăn ngừa overfitting).
Chúng ta sẽ tối
thiểu hóa hàm sai số bằng đạo hàm giảm, như trên, và đây rồi! chúng ta sẽ xây dựng
được một mô hình hồi qui logistic để tiên đoán các lớp càng chính xác càng tốt.
2.2.2. Máy vector hỗ trợ (Support Vector Machines – SVM)
“Chúng ta lại ở
trong căn phòng bằng đá cẩm thạch. Tại sao chúng ta luôn ở trong căn phòng bằng
đá cẩm thạch? Thế mà tôi đã đảm bảo là không có chuyện đó.”
SVM là mô hình
có tham số cuối cùng chúng ta cùng tìm hiểu. Cụ thể, nó cũng giải quyết cùng một
bài toán như hồi qui logistic – phân loại thành 2 lớp – và có hiệu suất tương
đương. Vẫn cần phải hiểu nó vì giải thuật của nó về bản chất dễ hiểu khi biểu
diễn bằng hình học hơn là bị áp đặt bởi tư duy theo xác suất.
Vài ví dụ về các
bài toán SVM có thể giải được:
-
Đây là ảnh chó hay mèo?
-
Kiểm tra này dương hay âm tính?
-
Các chấm 2D này đỏ hay xanh?
Chúng ta sẽ sử dụng
ví dụ thứ ba để minh họa cách SVM hoạt động. Những bài toán thế này gọi là bài
toán trò chơi vì chúng không có thật – nhưng chẳng có gì là thật cả, vì thế
cũng hay mà.
Trong ví dụ này,
chúng ta có các điểm trong không gian 2D là đỏ hoặc xanh, và chúng ta cần chia
thành 2 nhóm.
Tập dữ liệu đào
tạo như trên đồ thị. Chúng ta muốn phân loại các điểm mới, chưa được phân nhóm.
Để làm điều này, SVM sử dụng một đường phân chia (hoặc nhiều hơn 2 chiều, gọi
là siêu mặt đa chiều) để chia không gian thành một vùng đỏ và một vùng xanh. Bạn
đã có thể tưởng tượng ra đường phân chia này có lẽ giống như thế nào trong đồ
thị bên trên.
Làm sao chúng ta
chọn được chỗ nào để vẽ đường đó?
Bên dưới là 2 ví
dụ về đường phân chia này.
Hy vọng bạn cũng
có trực giác cho rằng đường đầu tiên tốt hơn. Khoảng cách tới điểm gần nhất
trên mỗi phía của đường này gọi là lề (margin), và SVM cố gắng tối đa hóa lề
này. Bạn có thể nghĩ nó giống như khoảng cách an toàn: khoảng cách này càng lớn,
các điểm càng ít có khả năng bị phân loại sai.
Dựa trên giải
thích trên, vài câu hỏi lớn được đặt ra.
1.
Các
phép toán bên dưới làm việc thế nào?
Chúng ta muốn
tìm được một siêu đối tượng tối ưu (trong ví dụ 2D kia là một đường thẳng).
Siêu đối tượng này cần (1) phân chia dữ liệu rạch ròi, tất cả điểm xanh ở một
bên và tất cả điểm đỏ ở bên còn lại, và (2) đối đa hóa lề. Đây gọi là bài toán
tối ưu hóa. Giải pháp phải thỏa mãn ràng buộc (1) trong khi tối đa được lề theo
yêu cầu của (2).
Khi con người giải
bài toán này, họ sẽ lấy thước và cố thử những đường thẳng khác nhau có thể chia
mọi điểm thành 2 phần cho đến khi thu được đường có lề tối đa hóa lề.
Nó biến thành
phương pháp toán học để làm việc tối đa hóa này, tất nhiên vẫn trong phạm vi của
chúng ta. Để hiểu sâu hơn, hãy xem video bài giảng về nó (dùng hàm tối ưu
Lagrange) trên mạng.
Siêu đối tượng
mà bạn tìm thấy được xác định theo vị trí của nó với x_i, gọi là vector hỗ trợ,
và thường là vector gần nhất với siêu đối tượng.
2.
Chuyện
gì xảy ra nếu chúng ta không thể phân dữ liệu thành 2 phần rạch ròi?
Có hai phương
pháp để giải quyết vấn đề này.
2.1.Linh động với khái niệm “phân chia”
Chúng ta cho
phép một ít sai số, nghĩa là cho phép một số điểm xanh vẫn trong vùng của điểm
đỏ hoặc vài điểm đỏ vẫn nằm trong vùng điểm xanh. Chúng ta làm thế bằng cách
thêm chi phí C vào hàm sai số như các ví dụ về phân loại sai vẫn làm. Về cơ bản,
chúng ta coi điều này là chấp nhận được nhưng tốn kém khi phân loại sai một điểm.
2.2.Cho dữ liệu vào không gian có số chiều cao hơn
Chúng ta có thể
tạo các bộ phân loại phi tuyến bằng cách tăng số chiều lên, ví dụ x2,
x3, hay cos(x)… Bỗng nhiên bạn có các biên giới trông méo mó ngớ ngẩn
khi so sánh với đường biểu diễn trong không gian có số chiều ít hơn.
Về mặt trực
quan, điều này giống như có chấm đỏ và xảnh nằm trên nền theo cách chúng không
thể bị phân chia rạch ròi chỉ bằng một đường thẳng – nhưng nếu bạn có thể khiến
mọi chấm đỏ lơ lửng trên nền theo một cách nào đó hợp lý, bạn có thể vẽ một đường
chia tách chúng. Sau đó bạn để chúng quay lại trạng thái trước trên nền, cái
này gọi là tìm nơi chấm xanh đứng yên và chấm đỏ bắt đầu.
Một tập dữ liệu
không thể phân chia trong không gian 2 chiều R2, và cũng tập dữ liệu
đó được đưa vào không gian 3 chiều với chiều thứ 3 bằng x2+y2.
Ranh giới ra quyết
định được thể hiện bằng màu xanh, đầu tiên trong không gian 3 chiều (bên trái)
sau đó trở lại trong không gian 2 chiều (bên phải).
Tóm lại, SVM được
dùng để phân loại thành 2 lớp. Phương pháp này cố tìm ra một đường hoặc một mặt
có thể chia tách rạch ròi thành 2 lớp. Khi việc này là không thể, chúng ta cũng
đã linh động hóa khái niệm “chia tách” hoặc chúng ta lại tiếp tục ném dữ liệu
vào một không gian có số chiều cao hơn để xem xét khả năng có thể chia tách
chúng rạch ròi hay không.
Thế là xong!
Trong phần này, chúng ta đã học:
-
Phương pháp phân loại của học có
giám sát
-
2 phương pháp phân loại chính: hồi
qui logistic và máy vector hỗ trợ (SVM)
-
Các khái niệm thường xuyên dùng
tới: hàm sigma, log lẻ (hay “logit”), và các giá trị dương sai với các giá trị
âm sai…
Trong phần tiếp theo, chúng ta sẽ tìm hiểu học có giám sát không dùng
tham số, trong đó ý tưởng phía sau các thuật toán rất trực quan và hiệu suất giải
thuật cực kỳ tuyệt vời đối với một số dạng bài toán nhất định, nhưng các mô
hình có thể không dễ được biên dịch thành mã.
Tài nguyên để tìm hiểu thêm
Hồi qui logistic
Trường Dữ Liệu là một chỉ dẫn mức sâu tuyệt vời với hồi qui logistic.
Chúng tôi cũng muốn tiếp tục mời bạn tham khảo cuốn An Introduction to
Statistical Learning. Hãy xem chương 4 về hồi qui logistic, và chương 9 về máy
vector hỗ trợ.
Để áp dụng hồi qui logistic, chúng tôi khuyến nghị làm việc trên tập
bài toán này. Không may là bạn phải đăng kí vào site mới làm thế được. Đời là
thế mà.
Đi đào hố thỏ SVM
Để đào sâu vào khía cạnh toán học sau SVM, hãy xem bài giảng của giáo
sư Patrick Winston trong MIT 6.034: Artificial Intelligence. Và kiểm tra lại
bài giảng này bằng cách sử dụng Python nhé.
2.3.
Học có giám sát: không tham số
Các mô hình
không tham số; k hàng xóm gần nhất, cây quyết định, rừng ngẫu nhiên. Giới thiệu
xác nhận chéo, xử lý siêu tham số và các mô hình đồng bộ.
Học không tham số
Mọi thứ có vẻ như hơi… uốn lượn.
Đối lập với các
phương pháp chúng ta vừa tìm hiểu ở các phần trên – hồi qui tuyến tính, hồi qui
logistic và SVM, dạng của mô hình đều được định nghĩa từ trước – trong học
không tham số, không có một cấu trúc mô hình được xác định trước. Chúng ta
không suy đoán dạng hàm f cần phải học trước khi đào tạo mô hình, giống như ta
đã làm trước đó với hồi qui tuyến tính. Thay vào đó, cấu trúc mô hình được quyết
định căn bản bởi dữ liệu.
Những mô hình
này thường uyển chuyển hơn với hình thái dữ liệu đào tạo, nhưng đôi khi nó rất
tốn chi phí cho khả năng thông dịch. Nó sẽ được làm sáng tỏ ngay thôi. Nào
chúng ta cùng nhảy vô!
2.3.1.
K hàng xóm gần nhất (k-nearest
neighbors hay k-NN)
“Bạn là trung bình của k người bạn gần gũi
nhất với bạn.”
k-NN có lẽ quá
đơn giản để là một giải thuật machine learning. Ý tưởng này gán nhãn cho một điểm
dữ liệu kiểm thử x bằng cách tìm giá trị trung bình (mean) của các nhãn từ k điểm
dữ liệu gần nhất với nó, còn gọi là tìm mode (giá trị xuất hiện thường xuyên nhất
trong tập hợp k điểm).
Hãy nhìn vào
hình vẽ dưới đây. Giả sử bạn muốn tìm xem Vòng Xanh Thần Bí là Tam Giác Đỏ hay
là Hình Vuông Xanh. Bạn sẽ làm gì?
Bạn cố gắng tìm
ra một đẳng thức không tưởng có thể nhìn vào vị trí Vòng Xanh Thần Bí nằm ở đâu
trong hệ tọa độ bên dưới và tiên đoán. Hoặc, bạn có thể chỉ nhìn vào 3 hàng xóm
gần nhất của nó, và đoán rằng Vòng Xanh Thần Bí này có khả năng là Tam Giác Đỏ.
Bạn cũng có thể mở rộng vòng tiên đoán ra và nhìn vào 5 hàng xóm gần nhất của
nó, rồi tiên đoán theo cách đó (3/5 trong số 5 hàng xóm gần nhất là Hình Vuông
Xanh, vì thế ta đoán Vòng Xanh Thần Bí là Hình Vuông Xanh khi k=5).
Minh họa của k-NN với k=1, 3 và 5. Để phân
loại Vòng_Xanh_Thần_Bí(x) ở trên, hãy nhìn vào 1 hàng xóm gần nhất với nó, một
Tam Giác Đổ. Vì thế ta đoán rằng ŷ=”Tam Giác Đỏ”. Với k=3, hãy nhìn vào 3 hàng
xóm gần nhất, mode = Tam Giác Đỏ, vì vậy ŷ=”Tam Giác Đỏ”. Với k=5, ta thay bằng
mode của 5 hàng xóm gần nhất. Giờ ŷ= “Hình Vuông Xanh”.
Thế đấy. Đó
chính là phương pháp k hàng xóm gần nhất. Bạn nhìn vào k điểm dữ liệu gần nhất
và lấy trung bình các giá trị của chúng nếu các biến là liên tục (như giá nhà
chẳng hạn) hoặc tìm giá trị xuất hiện nhiều nhất nếu chúng là giá trị danh mục
(như chó, mèo…).
Nếu bạn muốn
đoán giá 1 ngôi nhà chưa biết, bạn có thể lấy trung bình từ một số căn nhà gần
đó (về mặt địa lý), và tất nhiên bạn sẽ thu được những phỏng đoán khá chính
xác. Những cách này có thể hoạt động còn vượt trội hơn nhiều so với mô hình hồi
qui có tham số do vài nhà kinh tế học xây dựng nên khi nó chỉ ước lượng các hệ
số mô hình từ số lượng phòng ngủ/phòng tắm, các trường học gần nhất, khoảng
cách tới khu giao thông công cộng…
Cách sử dụng k-NN để dự đoán giá nhà:
1)
Lưu dữ
liệu đào tạo, một ma trận X các đặc điểm như mã vùng, hàng xóm, số phòng ngủ,
diện tích, khoảng cách tới trạm giao thông công cộng, v.v…. và một ma trận Y
các giá bán tương ứng.
2)
Sắp xếp các ngôi nhà trong tập dữ liệu đào tạo
của bạn theo sự tương đồng với
ngôi nhà cần hỏi, dựa trên các đặc điểm trong X. Chúng ta sẽ định nghĩa cho “sự
tương đồng” ở dưới.
3) Lấy
trung bình của k ngôi nhà gần nhất.
Đó chính là dự đoán giá bán ngôi nhà bạn cần.
Thực tế, k-NN
không cần hàm có tham số được định nghĩa trước f(X) thể hiện mối liên quan giữa
Y và X để làm nó phù hợp hơn với các tình huống khi mối liên quan này quá phức
tạp để biểu diễn dưới dạng mô hình tuyến tính đơn giản.
Thước đo khoảng cách: định nghĩa và tính
toán cho khái niệm “gần”
Làm thế nào bạn
tính được khoảng cách từ điểm dữ liệu cần hỏi khi tìm kiếm các hàng xóm gần nhất
của nó? Về mặt toán học, làm sao bạn xác định được cái nào trong tập các Hình
Vuông Xanh và hình Tam Giác Đỏ trong ví dụ trên là gần nhất với Vòng Xanh Thần
Bí, đặc biệt nếu bạn không thể vẽ chúng ra một đồ thị 2D đủ dễ nhìn bằng mắt và
chính xác?
Phép đo nhanh nhất
là khoảng cách Euclid (một đường thẳng, như kiểu của chim ruồi). Cách khác là
dùng khoảng cách Manhattan, giống như đi bộ giữa các khối nhà trong thành phố.
Bạn có thể tưởng tượng rằng khoảng cách Manhattan có ích hơn trong một mô hình
tính phí như Uber chẳng hạn.
Đường màu xanh lá cây = khoảng cách Euclid.
Đường màu xanh nước biển = khoảng cách Manhattan.
Hãy nhớ tới định
lý Pitago về tìm chiều dài cạnh huyền của một tam giác vuông:
a2 + b2 = c2
c = độ dài cạnh huyền (đường màu xanh lá cây
ở trên). Còn a và b = độ dài hai cạnh bên của góc vuông (các đường màu đỏ).
Giải bài toán
theo c, ta sẽ tìm được độ dài cạnh huyền bằng cách lấy căn bậc hai của tổng
bình phương hai cạnh bên a và b (trong đó a và b giao nhau tạo thành góc 90 độ).
Ý tưởng tìm độ
dài cạnh huyền với các vector hai chiều trực giao cho trước đã được khái quát
hóa cho nhiều chiều, đó là cách chúng ta tìm được công thức cho khoảng cách
Euclid d(p,q) giữa các điểm p và q trong không gian n chiều:
Công thức tìm
khoảng cách Euclid được kế thừa từ định lý Pytago. Với công thức này, bạn có thể
tính toán độ gần của toàn bộ các điểm dữ liệu đào tạo tới điểm dữ liệu mà bạn
đang cố gán nhãn, sau đó lấy giá trị trung bình/hoặc giá trị xuất hiện nhiều nhất
của k hàng xóm gần nhất để đưa ra dự đoán.
Rõ ràng bạn
không cần tính bất kỳ thước đo khoảng cách nào bằng tay – chỉ cần search Google
nhanh chóng đã phát hiện ra các hàm được xây dựng sẵn theo NumPy hay SciPy làm
điều đó cho bạn, ví dụ khoảng_cách_euclid = numpy.linalg.norm(p-q), nhưng thật
hài hước khi thấy cách các khái niệm địa lý chỉ đáng điểm 8 nay lại vô cùng hữu
ích cho việc xây dựng các mô hình machine learning ngày nay!
Lựa
chọn k: xử lý các siêu tham số bằng xác nhận chéo (cross – validation)
Để quyết định nên dùng giá trị k nào, bạn có
thể kiểm tra các mô hình k-NN khác nhau sử dụng các giá trị k khác nhau bằng
xác nhận chéo:
(1)
Chia dữ
liệu đào tạo thành các đoạn, và đào tạo hết cho mô hình của bạn chỉ trừ 1 đoạn;
hãy sử dụng đoạn dữ liệu giữ lại này làm dữ liệu kiểm thử.
(2)
Quan
sát xem mô hình của bạn hoạt động thế nào bằng cách so sánh các tiên đoán của
mô hình với các giá trị thật của dữ liệu kiểm thử (y).
(3)
Chọn lấy
cái nào có sai số thấp nhất, tính theo trung bình, trên toàn bộ các lần lặp lại.
Minh họa cho xác nhận chéo. Số các phần phân ra và các vòng lặp có thể
tùy biến.
k cao hơn ngăn chặn được overfitting
Các giá trị k
cao hơn sẽ xử lý được vấn đề overfitting, nhưng nếu giá trị k quá cao, mô hình
của bạn sẽ rất bị ảnh hưởng và không uyển chuyển. Đây là một ví dụ cực đoan: nếu
k=N (tổng số điểm dữ liệu), mô hình chỉ có thể phân loại cào bằng một cách ngớ
ngẩn toàn bộ dữ liệu kiểm thử thành giá trị trung bình hoặc giá trị xuất hiện
nhiều nhất của tập dữ liệu đào tạo.
Nếu con vật phổ
biến nhất trong tập dữ liệu động vật là con mèo thuộc giống Scotland, thì
phương pháp k-NN với k bằng N (số quan sát đào tạo) có thể sẽ tiên đoán mọi động
vật khác trên thế giới cũng đều là mèo Scotland. Theo quan điểm của Vishal, điều
này có thể rất tuyệt. Nhưng Samer không đồng ý.
Ảnh .gif của một con mèo Scotland hoàn toàn
miễn phí. Chúng ta sẽ gọi đây là phút giải lao giữa giờ học. ;-)
Sử dụng k-NN trong thế giới thực ở chỗ nào?
Vài ví dụ về chỗ
ta có thể dùng k-NN:
-
Phân loại: phát hiện gian lận. Mô hình có thể cập
nhật ảo tức thì với các ví dụ đào tạo mới khi bạn lưu nhiều điểm dữ liệu hơn,
cho phép thích nghi nhanh chóng với các phương pháp lừa đảo mới.
-
Hồi qui: dự đoán giá nhà. Trong việc dự đoán giá
nhà, việc trở thành hàng xóm gần nhất thực ra là một dấu hiệu chỉ báo tốt để có
giá tương tự. k-NN rất hữu ích trong các lĩnh vực có dùng đến tính xấp xỉ về mặt
vật lý.
-
Cải tiến dữ liệu đào tạo bị thiếu. Nếu một trong
các cột trong file .csv của bạn có nhiều giá trị thiếu, bạn có thể cải tiến dữ
liệu bằng cách lấy giá trị trung bình hay giá trị lặp lại nhiều nhất. k-NN có
thể cho bạn một dự đoán chính xác hơn tại mỗi điểm dữ liệu bị thiếu sót.
2.3.2.
Cây quyết định, rừng ngẫu nhiên
Tạo một cây quyết
định tốt giống như chơi trò “20 câu hỏi”.
Cây quyết định bên phải mô tả các mẫu sống
sót trên con tàu Titanic
Phần đầu tiên ở
gốc của cây quyết định nên là câu hỏi đầu tiên bạn cần hỏi trong số 20 câu hỏi:
bạn muốn phân chia dữ liệu càng rạch ròi càng tốt, đó là bằng cách tối đa hóa lợi
ích thông tin thu được từ mỗi phần.
Nếu bạn của bạn
bảo: “Mình đang nghĩ về một danh từ, hãy hỏi mình tối đa 20 câu hỏi có/không để
đoán xem đó là từ gì.” Và câu hỏi đầu tiên của bạn là: “Đó có phải là khoai tây
không?”, thế thì bạn là thằng ngốc, vì họ sẽ nói “không” mà bạn lại hầu như chẳng
thu được thông tin gì. Trừ khi bạn biết rõ bạn mình luôn nghĩ về khoai tây suốt
ngày, hoặc đang nghĩ về nó ngay lúc này. Nếu vậy bạn đã hoàn thành công việc một
cách tuyệt vời.
Thực ra, câu hỏi
nên kiểu như là “Đó là một đồ vật à?” thì sẽ có nghĩa nhiều hơn.
Cách này gần giống
cách các bệnh viện phân chia bệnh nhân hoặc hướng chuẩn đoán khác nhau. Họ hỏi
vài câu hỏi trước và kiểm tra tình trạng cơ bản để quyết định liệu bạn đã sắp
chết chưa hoặc gì đó. Khi bạn bước vào cửa, họ không bắt đầu bằng cách làm sinh
thiết để kiểm tra liệu bạn có bị ung thư tuyến tụy hay không đâu.
Có những cách
thu được nhiều lợi ích thông tin vì thế về cơ bản, bạn có thể đánh giá được mọi
phần có thể của dữ liệu đào tạo và tối đa hóa lợi ích thông tin cho mỗi phần.
Cách này bạn có thể dùng để dự đoán mọi nhãn hoặc mọi giá trị một cách hiệu quả
nhất có thể.
Còn bây giờ, hãy
nhìn vào một tập dữ liệu đặc biệt và nói về cách chúng ta lựa chọn các phần.
Tập dữ liệu Titanic
Kaggle có một tập
dữ liệu về con tàu Titanic dùng cho rất nhiều lần giới thiệu về machine
learning. Khi Titanic chìm, 1.502 trong tổng số 2.224 hành khách và thủy thủ
đoàn đã chết. Dù có vài yếu tố may mắn, nhưng phụ nữ, trẻ em và những người thuộc
tầng lớp trên hầu như đều được cứu sống. Nếu bạn nhìn vào cây quyết định dưới
đây, bạn sẽ thấy rằng nó phản ánh phần nào sự biến thiên này theo giới tính, tuổi
và tầng lớp.
Chọn các phần trong một cây quyết định
Entropy là tổng
các rối loạn trong một tập hợp (được đo bằng chỉ số Gini hoặc entropy chéo). Nếu
các giá trị thực sự bị lẫn lộn, sẽ có nhiều entropy; nếu bạn có thể phân chia
các giá trị rạch ròi, sẽ chẳng còn entropy nào. Với mỗi phần ở dữ liệu cha, bạn
muốn các nốt con phải càng sạch càng tốt – tức là tối thiểu hóa entropy. Ví dụ,
trong trường hợp Titanic, giới tính là một chỉ dấu lớn quyết định sự sống sót,
vì thế nó có ý nghĩa và nên dùng đặc điểm này trong phần phân loại đầu tiên như
là thứ mang tới lợi ích thông tin lớn nhất.
Hãy nhìn vào các
biến số của vụ Titanic:
Từ điển dữ liệu
Biến số
|
Định nghĩa
|
Khóa
|
survival
|
Là người sống sót?
|
0-Không, 1-Đúng
|
pclass
|
Hạng vé
|
1-
Hạng nhất
2-
Hạng hai
3-
Hạng ba
|
sex
|
Giới tính
|
|
Age
|
Tuổi tính theo năm
|
|
sibsp
|
Số lượng anh chị em/bạn đời ở trên khoang tàu
Titanic
|
|
parch
|
Số lượng cha mẹ/con cái ở trên khoang tàu Titanic
|
|
ticket
|
Số hiệu vé
|
|
fare
|
Phí hành khách
|
|
cabin
|
Số hiệu cabin
|
|
embarked
|
Cổng lên tàu
|
C= lên tàu từ Cherbourg, Q=lên tàu từ Queenstown,
S=lên tàu từ Southampton
|
Chúng ta sẽ xây
dựng một cái cây bằng cách lấy một trong các biến trên và phân tập dữ liệu theo
nó.
Phần đầu tiên
phân chia tập dữ liệu thành “Đàn ông” và “Phụ nữ”. Sau đó, nhóm “Phụ nữ” sẽ lại
phân theo tuổi (để tối thiểu hóa entropy). Tương tự, nhóm “Đàn ông” cũng được
phân theo hạng vé. Bằng cách đi theo cây quyết định, áp dụng với một hành khách
mới, bạn có thể dự đoán họ sẽ sống hay chết.
Ví dụ Titanic đã
giải quyết bài toán phân loại (sống hay chết). Nếu chúng ta dùng cây quyết định
cho hồi qui – để tiên đoán giá nhà chẳng hạn – chúng ta nên tạo các phần dựa
trên các đặc điểm quan trọng nhất quyết định tới giá nhà. Diện tích bao nhiêu:
nhiều hay ít hơn____? Bao nhiêu phòng tắm và phòng ngủ: nhiều hơn hay ít hơn
____?
Sau đó, trong
quá trình kiểm thứ, bạn nên thử với một ngôi nhà cụ thể bằng toàn bộ các phần
phân chia trên rồi lấy trung bình của toàn bộ giá nhà trong nốt lá cuối cùng
(note gần đáy nhất) làm dự đoán cho giá bán.
Có vài siêu tham
số bạn có thể xử lý với mô hình cây quyết định, trong đó có max_depth và
max_leaf_nodes. Hãy nhìn module scikit-learn trên các cây quyết định để biết
cách xác định các tham số này.
Cây quyết định rất
hiệu quả vì chúng dễ đọc, rất mạnh ngay cả với dữ liệu hỗn loạn, và tính toán rẻ
do chỉ triển khai một lần sau khi đào tạo. Cây quyết định cũng rất phù hợp với
dữ liệu pha trộn lẫn lộn (giá trị số lẫn với giá trị danh mục).
Có thể nói, cây
quyết định rất đắt đỏ về phương diện tính toán khi đào tạo, mang theo rủi ro
cao bị overfitting, và có xu hướng tìm những điều kiện tốt nhất cục bộ vì chúng
không thể trở lại sau khi đã phân chia. Để xử lý những điểm yếu này, chúng ta tới
với một phương pháp minh họa sức mạnh kết hợp nhiều cây quyết định trong một mô
hình.
Rừng ngẫu nhiên: một tập hợp các cây quyết định
Một mô hình tạo
thành từ nhiều mô hình được gọi là một mô hình tập hợp, thường là một chiến lược
thành công.
Một cây quyết định
đơn lẻ có thể tạo ra nhiều phân chia sai vì nó chỉ phán đoán đen hay là trắng.
Một rừng ngẫu nhiên là một người ước tính siêu việt vì tập hợp nhiều cây quyết
định với vài sửa đổi hữu ích:
(1)
Số đặc
điểm có thể phân chia tại mỗi nốt bị giới hạn chỉ còn vài phần trăm trong tổng
số (đây là một siêu tham số bạn có thể lựa chọn – hãy đọc tài liệu scikit –
learn để biết thêm chi tiết). Điều này đảm bảo rằng mô hình tập hợp không phụ
thuộc nặng nề vào bất kỳ đặc điểm riêng lẻ nào, và đảm bảo công bằng trong việc
sử dụng tất cả các đặc điểm có tiềm năng dự đoán.
(2)
Mỗi
cây tạo ra một mẫu ngẫu nhiên từ tập dữ liệu gốc khi sinh các phần phân chia của
nó, thêm một phần tử ngẫu nhiên nữa sẽ chặn được overfitting.
Những sửa đổi này cũng ngăn các cây không nằm
trong thế tương quan quá cao. Với 2 điểm trên, mọi cây có thể được định danh,
vì cách phân chia theo kiểu nhị phân hồi qui đều đã xác định.
Để minh họa, hãy
nhìn 9 bộ phân loại bằng cây quyết định dưới đây:
9 bộ phân loại
này có thể được tập hợp thành một rừng ngẫu nhiên kết hợp các đầu ra của chúng.
Hãy nghĩ tới các tọa độ dọc và ngang của mỗi đầu ra cây quyết định như là các đặc
điểm x1 và x2. Tại các giá trị xác định của mỗi đặc điểm, cây quyết định sẽ cho
đầu ra được phân loại là “xanh da trời”, “xanh lá cây”, “đỏ”, …
Những kết quả
này sẽ được tổng hợp lại, thông qua lấy bình chọn hoặc trung bình, trong mô
hình tập hợp. Như vậy mô hình này cho đầu ra ưu việt hơn bất kỳ đầu ra của một
cây quyết định đơn lẻ nào.
Rừng ngẫu nhiên
là điểm khởi đầu tuyệt vời cho quá trình mô hình hóa, vì chúng có hiệu suất rất
cao, độ dung lỗi lớn với các dữ liệu khó phân biệt rạch ròi và có thể hữu dụng
khi tìm kiếm những đặc điểm gây ra vấn để trong số nhiều đặc điểm.
Còn có nhiều mô
hình tập hợp thông minh hơn khác nữa, có thể kết hợp các cây quyết định và cho
ra hiệu suất tuyệt vời – hãy đọc XGBoost (Extreme Gradient Boosting) như một ví
dụ khác.
Như vậy, chúng
ta đã nghiên cứu xong về học có giám sát!
Thật tuyệt. Trong phần này, chúng ta đã đi qua:
-
Hai thuật toán học có giám sát
không tham số: k-NN và cây quyết định
-
Đo khoảng cách và lợi ích thông
tin
-
Rừng ngẫu nhiên (ví dụ về một mô
hình tập hợp)
-
Xác nhận chéo và xử lý các siêu
tham số
Hy vọng giờ bạn đã có một số kiến thức cơ bản về cách chúng ta học f với
tập dữ liệu đào tạo cho trước và dùng nó để dự đoán cho tập dữ liệu kiểm thử.
Tiếp theo, chúng ta sẽ nói về cách xử lý các bài toán với tập dữ liệu
đào tạo không được gán nhãn, trong phần 3.
Học không giám sát.
Để học thêm về phần này
Ứng dụng k-NN
Hãy thử đi sâu vào áp dụng k-NN bằng Python. Bạn có lẽ cũng muốn xem
tài liệu scikit-learn để hiểu làm sao việc áp dụng các hàm xây dựng từ trước hoạt
động được.
Cây quyết định
Thử thư viện cây quyết định trong chương 8 cuốn sách An Introduction to
Statistical Learning. Nếu bạn thích tập dữ liệu Titanic, hãy đọc chỉ dẫn với
các khái niệm liên quan kèm theo mã nguồn. Đó là cách áp dụng scikit-learn của
rừng ngẫu nhiên khi áp dụng vượt phạm vi trên tập dữ liệu.
Vishal Maini
Samer Sabri
"""Cùng tìm hiểu thêm về machine learning nhé!
Trả lờiXóamachine learning là gì"""