Chủ Nhật, 22 tháng 10, 2017

Machine Learning cho mọi người - 2: Học có giám sát (Supervised Learning)



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