Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

  1. 3 dạng Machine Learning chính 1/ Supervised Learning: Nôm na nghĩa là máy sẽ đưa ra suy đoán dựa trên một tập dữ liệu cho trước đã được training.

Những vấn đề của supervised learning được chia làm 2 loại: hồi quy (regression) và phân loại (classification) Ví dụ 1: Chúng ta có sẵn 1000 status facebook (gọi là dataset A) được phân loại theo các trạng thái như vui, buồn, giận dữ v.v.. (ứng với mỗi trạng thái là một tập hợp các đặc tính có liên quan, ví dụ các trạng thái status vui thì thường xuất hiện các cụm từ như “đáng yêu quá”, “thích quá”, “hay quá”…), supervised learning là phương pháp sử dụng dataset A này để xác định 100 status facebook khác chưa được gắn trạng thái.

Ví dụ 2: (a) Hồi quy – Đưa ra tấm hình của 1 người, chúng ta dự đoán tuổi của người đó dựa trên tấm hình

(b) Phân loại – Với một bệnh nhân có khối u, chúng tôi-có để dự đoán xem khối u ác tính hoặc lành tính.

2/ Unsupervised Learning: Nôm na nghĩa là tay không bắt giặc 😀 máy sẽ tự tìm ra các mối quan hệ hoặc các pattern từ một dataset. Ví dụ 1: Chúng ta có thể sử dụng phương pháp unsupervised learning để tìm ra các chủ đề được đề cập tới từ 1000 status facebook, ví dụ các status có chủ đề về bóng đá (vì trong những status này xuất hiện nhiều từ, cụm từ, hashtag có liên quan đến bóng đá chẳng hạn).

Ví dụ 2: Clustering: Lấy một bộ sưu tập của một triệu gen khác nhau, và tìm cách tự động nhóm những gen có liên quan hoặc tương tự vào 1 nhóm lớn bởi những giá trị khác nhau như là tuổi thọ, vị trí, vai trò, …

Non-clustering: Các “Thuật toán tiệc Cocktail”, cho phép bạn tìm thấy một cấu trúc trong môi trường hỗn loạn. (Nghĩa là: Xác định tiếng nói riêng và âm nhạc từ một mạng lưới các âm thanh tại một bữa tiệc cocktail).

3/ Reinforcement Learning: Nôm na nghĩa là máy có thể tự cập nhật cách giải quyết vấn đề theo kiểu thử và sửa liên tục. Ví dụ: DeepMind AlphaGo với việc chiến thắng Lee Sedol trong bộ môn cờ vây là ví dụ nổi tiếng nhất về RL (thực tế DeepMind gọi là Deep Reinforcement Learning).

II. 10 thuật toán Machine Learning quan trọng nhất Để kết luận 10 thuật toán ML nào quan trọng nhất thực sự là việc rất phức tạp vì chúng ta không biết xếp theo tiêu chí nào? Ví dụ độ phổ biến, tính hữu dụng, tính đơn giản, tính chính xác v.v.. Vì thế mình chỉ giả định nếu mình phỏng vấn một người cho vị trí Data Scientist / Data Engineer thì mình cần họ phải nắm được 10 thuật toán sau (theo thứ tự ưu tiên):

  • Linear Regression
  • Logistic Regression
  • Decision Trees
  • Naïve Bayes Classification
  • Ordinary Least Squares Regression
  • Support Vector Machines
  • Ensemble Methods
  • Clustering Algorithms
  • Principal Component Analysis
  • Singular Value Decomposition
  • Independent Component Analysis

1/ Linear Regression và Logistic Regression (Hồi quy tuyến tính và Hồi quy Logistic):

Dùng làm gì nhỉ? Thuật toán Linear Regression mô tả dữ liệu và thể hiện mối quan hệ giữa một biến phụ thuộc (x) với một (y) hoặc nhiều (yi) biến độc lập. Tức là nếu biến độc lập thay đổi thì ảnh hưởng đến biến phụ thuộc như thế nào. Nếu 1 biến độc lập gọi là Hồi quy tuyến tính đơn (Simple Linear Regression), nếu nhiều biến độc lập gọi là Hồi quy tuyến tính đa biến (Multiple Linear Regression).

Đơn:

Đa:

Nhìn vào phương trình ta thấy gì, y thay đổi khi x thay đổi. Ok, tạm hiểu, thế sao người ta lại dùng Linear Regression mà không dùng thuật toán khác? Một số ưu điểm của Linear Regression là tính dễ hiểu của thuật toán (ví dụ trên chẳng hạn, những thuật toán sau ví dụ không dễ hiểu như vậy đâu :)); dễ chỉnh sửa (tuning); độ phổ biến cao và tốc độ giải thuật nhanh. Nghe có vẻ dễ đúng không? Cái khó nhất của các Generalized Linear Model (GLM – Mô hình tuyến tính tổng quát) là việc chọn independent variables chứ không phải là thuật toán. Thế Linear Regression và Logistic Regression thì khác nhau cái gì? Cái khác nhau nhất chính là ở dependent variable, đối với Linear Regression thì DV có dạng liên tục (continuous) còn đối với Logistic Regression thì DV có thể chỉ là Có/Không, Sống/Chết, 0/1 (mô hình nhị phân) hoặc DV có thể ở dạng rời rạc (discrete). Continuos và discrete là hai khái niệm rất lớn trong toán học, các bạn có thể tìm hiểu thêm ở trên mạng, trong khuôn khổ bài này thì hơi khó để giải thích ngắn gọn được. Ứng dụng trong đời thường như thế nào? Một trong những ứng dụng lớn nhất của GLM model (Mô hình tuyến tính tổng quát) là hệ thống quản lý rủi ro hoặc chấm điểm tín dụng của các ngân hàng. Chẳng hạn như để quyết định hạn mức thẻ Credit card của bạn, hệ thống sẽ sử dụng GLM để tính toán dựa trên các thông tin bạn cung cấp như mức lương hiện tại, độ tuổi, giới tính, công việc đang làm v.v..

2/ Decision Trees (Cây quyết định) Dùng làm gì nhỉ?Cây quyết định là một công cụ dùng để hỗ trợ trong việc ra quyết định dựa trên một hoặc nhiều biểu đồ dạng cây. Biểu đồ này thể hiện số lượng câu hỏi yes/no tối thiểu mà một người cần hỏi, để đánh giá về khả năng ra được một quyết định đúng. Ví dụ nhé,chúng ta có một dataset về dữ liệu về các cầu thủ trẻ trong khoảnng 10-16 tuổi. Chúng ta có thể collect được những dữ liệu như vị trí thi đấu, chiều cao, cân nặng, tỷ lệ sút bóng thành công, tỷ lệ xoạc bóng thành công, tỷ lệ chuyền bóng thành công, tốc độ, tỷ lệ đánh đầu thành công v.v… Giả sử bạn là một HLV và đang có một lứa cầu thủ trẻ mới vào. Làm thế nào để quyết định được một cầu thủ trẻ nên chơi ở vị trí thi đấu nào là phù hợp nhất? Sử dụng Cây quyết định sẽ giúp bạn làm được điều này, bằng cách thu thập những dữ liệu của lứa cầu thủ trẻ mới vào và so sánh dữ liệu mới này với dữ liệu có sẵn trong dataset, Cây quyết định sẽ giúp bạn xác định được vị trí thi đấu nào thích hợp nhất với một cầu thủ trẻ mới tuyển. Nghe cool vãi, nhưng theo tôi biết thì đếch có thuật toán nào gọi là Cây quyết định cả :)) Oh đúng, xin lỗi :)) Cây quyết định thực ra là một họ tập hợp các thuật toán mà outcome của nó có thể biểu diễn dưới dạng cây. Một số thuật toán họ này rất phổ biến như C4.5 hoặc Random Forest v.v… Trong khuôn khổ bài mở đầu này, mình chỉ có thể giới thiệu khái quát như vậy, sẽ có những bài khác đi sâu hơn vào từng thuật toán trên.

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Oh thế Cây quyết định thì có gì hay? Cái hay nhất của Cây quyết định là tính đơn giản và dễ interpret của kết quả. Hầu như bất kỳ ai nhìn vào một decision tree cũng có thể hiểu được mà không cần có kiến thức gì về Machine Learning cả. Ứng dụng lớn nhất của Decision Trees là gì? Ứng dụng của Decision Trees cực nhiều, cực phổ biến, vì tính thực tiễn của nó trong việc hỗ trợ ra quyết định (mà trong thực tế thì công việc gì cũng cần quyết định). Ví dụ: quyết định cho vay, quyết định về chiến lược giá bán v.v..

Mình muốn kết thúc phần này bằng một câu nói của Andrew Ng – Chief Scientist của Baidu và Founder của Coursera: “Nếu bạn thành thạo thuật toán hồi quy tuyến tính, hồi quy logistic và nguyên tắc kiểm soát (regularization) thì bạn đã biết nhiều về Machine Learning hơn phần lớn các kỹ sư Machine Learning ở Silicon Valley rồi”. Để biết về các thuật toán này thì không khó nhưng để master nó thì không hề dễ chút nào (nhất là về regularization). Điều mà mình muốn nói ở đây chính là Machine Learning không hề khó, không phải là một black-box, ai cũng có thể học và master được nếu họ thực sự yêu thích và muốn nắm được một trong những vũ khí mạnh nhất của nhân loại hiện nay.

Classification là toán xác xuất nên để kỳ vọng tính chính xác 100% là rất khó vì nó phụ thuộc vào tập dataset. Classification chỉ có 2 giá trị: [0,1], [đúng, sai], về email thì [spam, not spam], [khẳng định, phủ định], thông thường thì có ngưỡng giữa tùy vào ta chọn như [0,1] ta chọn 0.5 cho đơn giản làm ví dụ, nếu < 0.5 ==> 0, > 0.5 là 1. Kết quả trả về rơi nhiều vào giữa ngưỡng [0.4, 0.5, 0.6] có thể dẫn đến kết quả sai. Gọi là na ná giống nhau, nhưng về bản chất nhiều khi khác nhau xa lắm. Cho nên khi có kết quả gần đúng người ta sẽ dùng thuật toán khác filter thêm lần nữa để cho ra kết quả tốt hơn. Ta làm thử 1 ví dụ để xem tính chính xác của Classification như thế nào nhé.

Example: ta dùng tập [0,1] và chọn ngưỡng giữa là 0.5 và có tập kết quả là {1, 0, 0.6, 0.4, 1, 0}

– TP: đúng tuyệt đối, có giá trị là 1.

– FN: Sai tuyệt đối, có giá trị là 0.

– FP: Đúng ở ngưỡng giữa, 0.5, 0.6, 0.7… < 1

– TN: Sai ở ngưỡng giữa: 0.4, 0.3,0.2… > 0

Trong trường hợp này ta có.

TP = 2 (có 2 giá trị 1), đúng 100%

FN = 2 (có 2 giá trị 0), sai 100%

FP = 1 (0.6)

TN = 1 (0.4)

Ta có thể định nghĩa tính chính xác như sau:

Tính chính xác = (TP + TN)/(TP + TN + FP + FN) = (2 + 2)/(2 + 2 + 1 + 1) = 2⁄3

Ta có 4 mẫu đúng trên 6 mẫu. Bây giờ ta xem thêm ví dụ khác về lọc email spam.

Classified positive Classified negative Positive class 10 15 Negative class 5 100

Trong trường hợp này, tính chính xác = (10 + 100)/(10 + 5 + 15 + 100) = 84.6%. Ta tạm thời cho rằng thuật toán phân loại làm việc rất hiệu quả, dò tìm dc gần 85% những email spam. Tuy nhiên điều gì sẽ xảy ra khi ta chuyển đổi thuật toán của Classficication rằng không có email spam nào cả.

Classified positive Classified negative Positive class 0 0 Negative class 15 115

Tính chính xác = (0 + 115)/(0 + 15 + 0 + 115) = 88.5%. Thật không thể tin nổi. Ta thay đổi thuật toán để cho ra kết quả hoàn toàn vô nghĩa, với số 0 ta đã làm tăng tính chính xác.

Cái này dc gọi là nghịch lý chính xác (the accuracy paradox). Khi TP < FP, tính chính xác sẽ luôn tăng khi ta thay đổi thuật toán phân loại để luôn luôn ra kết quả sai. Ngược lại khi TN < FN tương tự như vậy khi ta thay đổi luật để luôn cho ra kết quả đúng.

Vậy thì ta có thể làm dc gì, Ta nên biết rằng không có thuật toán phân loại nào là tốt nhất, chính xác nhất cả, ta phải biết kết hợp nhiều thuật toán phân loại với nhau để cho ra kết quả chính xác nhất có thể.

Kết luận là lại chọn ngưỡng giữa cho Classification là rất quan trọng. Trong y học những triệu chứng bệnh na ná giống nhau là rất nhiều, khi phân loại dc bệnh rồi còn phải yêu cầu đi làm xét nghiệm nữa, nghĩa là phân loại thêm lần nữa để chính xác hơn.

Trong hai bài viết trước (phần 1) và (phần 2), chúng ta đã cùng tìm hiểu về Classification. Chúng ta cũng đã làm quen với một thuật toán rất nổi tiếng gọi là k-nearest neighbors. Nếu có thời gian, bạn nên đọc các bài viết đó để có thể hiểu cặn kẽ những nội dung trong bài viết này, bài viết cuối cùng trong chuỗi bài giới thiệu về Classification.

Thuật toán k-nearest neighbors mà chúng ta tìm hiểu ở bài viết trước là một thuật toán được sử dụng rất rộng rãi. Tuy nhiên, nó cũng là một thuật toán rất cũ. Cho đến thời điểm này, các nhà nghiên cứu đã và đang phát triển những thuật toán phức tạp và mạnh mẽ hơn nhiều. Thuật toán tiếp theo mà tác giả muốn giới thiệu với các bạn được gọi là Random Forest. Đây là một thuật toán mới xuất hiện tầm 10 năm trước, và được coi là một cuộc cách mạng trong Machine Learning. Random Forest chỉ phức tạp hơn một chút so với k-nearest neighbors, nhưng nó hiệu quả hơn nhiều nếu xét trên hiệu năng tính toán của máy tính. Bên cạnh đó, Random Forest còn cho kết quả chính xác hơn nhiều so với k-nearest neighbors. Nghĩa là, khi các nhà nghiên cứu kiểm thử kết quả của hai thuật toán này trên các bộ dữ liệu khác nhau (bao gồm cả the Iris dataset), Random Forest thường cho kết quả đúng hơn so với k-nearest neighbors

Một trong những lí do khiến Random Forest hiệu quả hơn so với k-nearest neigbors là bởi vì, với k-nearest neighbors, tất cả các thuộc tính đều có mức độ quan trọng như nhau. Mặt khác, Random Forest có khả năng tìm ra thuộc tính nào quan trọng hơn so với những thuộc tính khác. Trên thực tế, nó còn có thể chỉ ra rằng một số thuộc tính là hoàn toàn vô dụng.

Random Forest là một thành viên trong họ thuật toán decision tree (cây quyết định). Vậy cây quyết định là gì? Một cây quyết định là một cách đơn giản để biểu diễn một giao thức (protocol). Nói cách khác, cây quyết định biểu diễn một kế hoạch, trả lời câu hỏi phải làm gì trong một hoàn cảnh nhất định. Ví dụ, cây quyết định được sử dụng trong tổng đài điện thoại để quyết định xem tổng đài viên sẽ trả lời như thế nào dựa trên phản hồi của khách hàng. Nó cũng được sử dụng trong hệ điều hành của bất kì cỗ máy nào mà bạn có thể tưởng tượng (tàu ngầm, bom nguyên tử,…) hay đơn giản, cây quyết định được các bác sĩ sử dụng để chẩn đoán bệnh.

Hãy trở lại câu chuyện của chúng ta với một ví dụ đơn giản. Hình ảnh phía dưới minh hoạ một cây quyết định để xác định chủng loại của một con vật. Để đơn giản, chúng ta sẽ chỉ xét một vài chủng loại động vật mà thôi. Giả sử ta có một con vật, hãy thử dùng cây quyết định này để tìm ra chủng loại của nó.

Đường đi bắt đầu từ câu hỏi đầu tiên ở phía trên của cây (bên dưới vòng tròn đỏ). Trả lời câu hỏi đó, và đi tiếp xuống các nút phía dưới của cây tuỳ thuộc vào câu trả lời (có/không với câu hỏi đầu tiên). Lặp lại hành động đó cho đến khi đi tới nút lá (các út màu xanh lá cây). Khi đó, bạn sẽ có câu trả lời.

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

(chú thích trên hình bị sai: 50cm thay vì 50kg)

Ví dụ, bạn bắt gặp một con vật mà bạn không biết nó thuộc chủng loại gì. Câu hỏi đầu tiên là: “Nó có lông không?”. Giả sử nó có lông, chúng ta đi tiếp sang nhánh bên phải. Câu hỏi tiếp theo là: “Nó cao bao nhiêu?”. Giả sử con vật của chúng ta chỉ cao 30cm. Điều này có nghĩa là chúng ta sẽ đi theo nhánh bên trái. Khi đó, vì chúng ta đã đi đến nút lá, chúng ta biết rằng con vật mà mình đang xét chính là con gà.

Bây giờ chắc bạn đã hiểu phần nào về cây quyết định, hãy trở lại với thuật toán Random Forest: Ý tưởng phía sau Random Forest khá đơn giản. Thuật toán này sinh một số cây quyết định (thường là vài trăm) và sử dụng chúng. Các câu hỏi của cây quyết định sẽ là câu hỏi về các thuộc tính. Ví dụ: “Cánh hoa có dài hơn 1.7cm hay không?”. Câu giá trị ở nút lá sẽ là các lớp (class). Sử dụng hàng trăm cây quyết định là bất khả thi với con người, nhưng máy tính có thể làm việc này tương đối dễ dàng.

Đến lúc này chúng ta đã tìm hiểu cách sử dụng một cây quyết định, nhưng vấn đề là làm thế nào để tạo ra nó.

Có hai giải pháp. Cách thứ nhất là hỏi chuyên gia (ví dụ như một nhà nhân chủng học với bài toán phân biệt chủng loại của con vật). Nghe có vẻ hấp dẫn, nhưng không phải khi nào bạn cũng có thể tiếp cận được với chuyên gia trong bài toán của mình. Hơn nữa, bạn có thể sẽ ngạc nhiên rằng ngay cả những chuyên gia giỏi nhất cũng gặp khó khăn trong việc viết ra những kiến thức của mình. Ngay cả khi bạn tìm được một chuyên gia có khả năng đó thì chắc chắn sẽ có những thứ mà họ không biết tới. Ví dụ, nhà nhân chủng học của chúng ta có thể quên mất rằng con đà điểu có thể nhỏ hơn 50kg.

Thay vì sử dụng chuyên gia, các nhà nghiên cứu sử dụng phương án thứ hai: tạo ra một thuật toán tự sinh cây quyết định. Điều kiện duy nhất là phải có vài ví dụ để máy tính có thể tham chiếu. Trong Iris dataset, những ví dụ này chính là những bông hoa mà chúng ta đã biết chủng loại.

Để tạo ra một cây quyết định, thuật toán Random Forest luôn bắt đầu bằng một cây rỗng. Một cây quyết định rỗng chỉ có một ô Start chỉ thẳng đến câu trả lời (ô xanh lá). Tiếp theo, thuật toán sẽ tìm câu hỏi đầu tiên và bắt đầu xây dựng cây quyết định (trong ví dụ trước, câu hỏi đó là “Nó có lông không?”). Mỗi lần thuật toán tìm được thêm một câu hỏi, nó tạo hai nhánh trên cây quyết định. Khi không còn câu hỏi nào nữa, thuật toán dừng lại và chúng ta có một cây quyết định hoàn chỉnh.

Làm thế nào để tìm ra những câu hỏi tốt nhất cho cây quyết định? Đây là một bước khá phức tạp nhưng ý tưởng đằng sau nó tương đối đơn giản: Ở thời điểm bắt đầu, thuật toán của chúng ta chưa biết phân biệt các chủng loại của các con vật. Nói cách khác, tất cả các con vật được cho chung vào một “cái túi”. Để tìm ra câu hỏi tốt nhất, thuật toán thử đưa ra tất cả các câu hỏi có thể (có khi là hàng triệu câu hỏi). Ví dụ: “Nó có bao nhiêu chân?”, “Nó có đuôi không?”,… Sau đó, với mỗi câu hỏi, thuật toán sẽ đánh giá mức độ hiệu quả mà câu hỏi này giúp phân biệt các chủng loại, hay các class. Câu hỏi được chọn không cần thiết phải hoàn hảo, nhưng nó phải tốt hơn những câu hỏi khác. Để tính toán mức độ hiệu quả của câu hỏi, chúng ta sử dụng một độ đo có tên là information gain. Chúng ta sẽ không bàn chi tiết về độ đo này, có thể hiểu nôm na nó như một cách để “cho điểm” các câu hỏi. Câu hỏi với information gain lớn nhất sẽ được chọn như là câu hỏi tốt nhất để xây dựng cây quyết định.

Hình ảnh phía dưới minh hoạ 4 bước để tạo một cây quyết định đơn giản. Quá trình này sẽ được lặp lại cho tất cả các cây.

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Sau khi thuật toán xây dựng xong các cây quyết định, những cây này sẽ được sử dụng để trả lời câu hỏi (hay phân loại). Trong bài toán về hoa diên vĩ, thuật toán sẽ trả lời câu hỏi: “Chủng loại của bông hoa bí ẩn là gì?”.

Nếu bạn theo dõi sát sao bài viết này, có thể bạn sẽ thấy một chút mâu thuẫn: chúng tôi nói với bạn rằng thuật toán Random Forest xây dựng nhiều cây quyết định. Tuy nhiên, chúng tôi mới chỉ giải thích cách dựng một cây quyết định mà thôi.

Random Forest coi mỗi cây quyết định như một cử tri bỏ phiếu độc lập (như một cuộc bầu cử thực sự). Ở cuối cuộc bầu cử, câu trả lời nhận được nhiều bầu chọn nhất từ các cây quyết định sẽ được lựa chọn.

Tuy nhiên, vẫn còn một vấn đề: Nếu như tất cả các cây được dựng theo cùng một cách, chúng sẽ cho những câu trả lời giống nhau. Như vậy chẳng khác gì chúng ta chỉ sử dụng một cây quyết định duy nhất cả. Ở đây, Random Forest có một cách làm rất hay: Để chắc chắn rằng không phải tất cả các cây quyết định cho cùng câu trả lời, thuật toán Random Forest chọn ngẫu nhiên các quan sát (observations). Chính xác hơn, Random Forest sẽ xoá một số quan sát và lặp lại một số khác một cách ngẫu nhiên. Xét toàn cục, những quan sát này vẫn rất gần với tập các quan sát ban đầu, nhưng những thay đổi nhỏ sẽ đảm bảo rằng mỗi cây quyết định sẽ có một chút khác biệt. Quá trình này gọi là bootstrapping

Thêm vào đó, để thực sự chắc chắn các cây quyết định là khác nhau, thuật toán Random Forest sẽ ngẫu nhiên bỏ qua một số câu hỏi khi xây dựng cây quyết định. Trong trường hợp này, nếu câu hỏi tốt nhất không được chọn, một câu hỏi kế tiếp sẽ được lựa chọn để dựng cây. Quá trình này được gọi là attribute sampling

Chắc rằng các bạn rất thắc mắc tại sao người ta lại tạo ra một thuật toán phức tạp như vậy: ngẫu nhiên thay đổi các quan sát và bỏ qua một số câu hỏi. Câu trả lời rất đơn giản: Có thể các mẫu thử mà chúng ta đang sử dụng chưa hoàn hảo. Ví dụ, có thể mẫu thử của chúng ta chỉ có những con mèo có lông đuôi. Trong trường hợp này những con mèo thuộc loài sphynx (mèo không lông) có thể được phân loại là con chuột. Tuy nhiên, nếu câu hỏi về đuôi không được hỏi (bởi vì sự thay đổi ngẫu nhiên), thuật toán có thể sử dụng câu hỏi các câu hỏi khác (ví dụ: Con vật đó có kích thước như thế nào?). Việc có nhiều câu hỏi đa dạng (có thể không hoàn hảo) là một ý tưởng không tồi: nó có thể là cứu tinh khi thuật toán tham chiếu đến một quan sát mà nó chưa từng thấy trước đây.

Và đó là tất cả những gì bạn cần biết về Random Forest.

Đây là bài viết cuối cùng trong chuỗi ba bài viết về Classification trong Machine Learning. Hi vọng bạn đã có được những hiểu biết ban đầu về bài toán phân loại, và quen thuộc với các khái niệm quan sát (observations) hay thuộc tính (attributes). Chúng tôi cũng đã trình bày hai thuật toán phân loại nổi tiếng, k-nearest neighbors và Random Forest, hi vọng bạn đã hiểu được phần nào về cách thức mà các thuật toán này hoạt động.

Bài viết tới mình sẽ viết về những hạn chế của Classification, bài tới nữa sẽ giới thiệu vệ Hồi Quy.

Trong bài viết trước (link), chúng ta đã cùng tìm hiểu về Classification. Chúng ta cũng đã đưa ra vài ví dụ về ứng dụng của nó và cũng đã làm quen với the Iris dataset. Nếu có thời gian, bạn nên đọc bài viết đó để có thể hiểu cặn kẽ những nội dung trong bài viết này.

Trở lại câu chuyện về hoa diên vĩ (Iris flower): Chúng ta có một danh sách các bông hoa diên vĩ được mô tả bằng độ dài và độ dày của đài hoa và cánh hoa (attributes). Chúng ta cũng đã biết chủng loại của tất cả các bông hoa trừ một cái duy nhất (chúng ta sẽ gọi nó là “bông diên vĩ bí ẩn”) và mục tiêu cuối cùng là tìm ra chủng loại của bông diên vĩ bí ẩn này. Với bài toán này, chúng ta giả sử rằng những thuộc tính trên là đặc trưng của chủng loại.

Giải pháp 1: Quan sát tương đồng (The same observation solution)

Giải pháp đầu tiên mà ta thường nghĩ đến trong trường hợp này là tìm kiếm một bông diên vĩ khác với độ dài và độ dày của đài hoa và cánh hoa giống với bông diên vĩ bí ẩn. Nếu có, nhiều khả năng chủng loại của bông hoa này cũng tương đồng với bông hoa bí ẩn. Không may mắn thay, rất hiếm khi chúng ta tìm được hai bông diên vĩ với những thông số giống hệt nhau. Trên thực tế, tìm kiếm một quan sát với các thuộc tính giống hệt hiếm khi là một giải pháp tốt, sẽ luôn có những sự khác biệt dù là rất nhỏ.

Giải pháp 2: Hàng xóm gần nhất (The 1-nearest neighbors solution)

Thay vì tìm kiếm một bông diên vĩ với các giá trị thuộc tính tương đồng, chúng ta sẽ tìm kiếm những bông hoa gần giống với bông hoa bí ẩn. Nếu hai bông diên vĩ có kích thước rất gần giống nhau, chúng trông sẽ rất giống nhau và vì vậy, có thể chúng thuộc cùng một chủng loại.

Tuy nhiên, cách này sẽ không hiệu quả nếu như có một vài bông diên vĩ thuộc các chủng loại khác nhau nhưng đều có giá trị thuộc tính gần giống với bông diên vĩ bí ẩn. Vì vậy, chúng ta chỉ tìm ra bông diên vĩ giống nhất với bông diên vĩ bí ẩn. Điều đó có nghĩa là chúng ta phải định nghĩa chính xác thế nào là hai bông diên vĩ giống nhau. Chúng ta cũng phải định nghĩa thế nào là một bông diên vĩ giống bông diên vĩ này hơn so với một bông khác.

Giải pháp được sử dụng bởi các nhà nghiên cứu là định nghĩa khoảng cách giữa hai bông diên vĩ. Khoảng cách giữa hai bông diên vĩ càng nhỏ, chúng càng giống nhau. Có rất nhiều cách để định nghĩa khoảng cách. Một trong những khoảng cách thường được sử dụng nhất trong Khoa học Máy tính là khoảng cách Euclide (the Euclidean distance). Nghe có vẻ nguy hiểm, nhưng thực ra khoảng cách Euclide chính là những gì bạn vẫn thường hiểu về khoảng cách hay đường chim bay.

Tuy nhiên, mặc dù khoảng cách Euclide giữa hai điểm trên bản đồ rất dễ hiểu, sẽ khó tưởng tượng hơn một chút khi bạn nói đến khoảng cách giữa hai bông diên vĩ.

Để tính khoảng cách Euclide, bạn phải tính tổng bình phương của hiệu các thuộc tính tương đương, rồi lấy căn bậc hai của tổng đó. Hãy áp dụng công thức đó cho hai bông hoa đầu tiên được biểu diễn trong bảng sau:

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Khoảng cách giữa hai bông diên vĩ đầu tiên là:(6.3−6.2)2+(2.3−3.4)2+(4.4−5.4)2+(1.3−2.3)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√\=1.79 %5E%7B2%7D%2B(2.3-3.4)%5E%7B2%7D%2B(4.4-5.4%5E%7B2%7D%2B(1.3-2.3)%5E%7B2%7D%7D) \= \= 3.90

Khoảng cách giữa bông hoa đầu tiên và bông hoa thứ ba là:

%5E%7B2%7D%2B(2.3-3.4)%5E%7B2%7D%2B(4.4-1.4)%5E%7B2%7D%2B(1.3-0.2)%5E%7B2%7D%7D%20%3D%203.70)

Giá trị đầu tiên nhỏ hơn (3.7 < 3.9), điều này có nghĩa là bông diên vĩ đầu tiên giống bông hoa thứ hai hơn so với bông hoa thứ ba.

Nhờ những bước tính toán và so sánh như trên, bạn có thể tìm ra bông hoa giống bông hoa bí ẩn nhất. Đơn giản là chúng ta chỉ cần tính khoảng cách giữa bông hoa bí ẩn với mỗi bông hoa khác, và tìm bông hoa có khoảng cách nhỏ nhất. Phương pháp tưởng chừng như đơn giản này thực ra lại được sử dụng bởi rất nhiều nhà nghiên cứu. Nó có tên là Hàng xóm gần nhất (The 1-nearest neighbors solution)

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Giải pháp 3: k-hàng xóm gần nhất (The k-nearest neighbors solution)

Thông thường, giải pháp hàng xóm gần nhất (The 1-nearest neighbors solution) cho kết quả tốt, nhưng trong nhiều trường hợp, vì nhiều nguyên nhân khác nhau mà giải pháp này cho kết quả thiếu chính xác. Một trong những nguyên nhân có thể là sự thiếu chính xác trong phép đo các thuộc tính. Điều này dẫn đến việc tính khoảng cách không đúng, và như vậy thuật toán không thể tìm ra lớp (class) đúng nhất.

Các nhà nghiên cứu đã tìm ra một giải pháp đơn giản cho vấn đề này: Thay vì tìm ra bông diên vĩ giống nhất, chúng ta sẽ tìm 5. Nói cách khác, chúng ta tìm 5 bông diên vĩ có khoảng cách nhỏ nhất so với bông diên vĩ bí ẩn. Nếu cả 5 bông diên vĩ thuộc cùng một chủng loại, vấn đề trở nên rất đơn giản: chủng loại (hay lớp) của bông diên vĩ bí ẩn chính là chủng loại của 5 bông diên vĩ đó.

Tuy nhiên, sẽ thế nào nếu 5 bông diên vĩ trên thuộc về các chủng loại khác nhau? Trong trường hợp này, chúng ta sẽ đếm số lượng các bông diên vĩ trong một chủng loại, và chủng loại với số bông diên vĩ lớn nhất sẽ được coi là chủng loại của bông diên vĩ bí ẩn. Ví dụ, nếu trong 5 bông diên vĩ giống nhất, có 1 bông thuộc loại Setosa, 1 thuộc Versicolour và 3 bông còn lại thuộc loại Viginica, chúng ta có thể khá chắc chắn khi kết luận rằng bông hoa bí ẩn thuộc loại Viginica (xem hình minh hoạ phía dưới).

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Giải thuật trên được gọi là 5-hàng xóm gần nhất (5-nearest neighbors)

Có thể bạn thắc mắc tại sao chúng ta lại tìm 5 hàng xóm gần nhất thay vì 2, 10 hay 50. Chọn ra k tốt nhất trong giải thuật k-hàng xóm gần nhất là một câu hỏi rất khó trả lời vì nó phụ thuộc vào rất nhiều vấn đề. Chúng ta sẽ không giải thích chi tiết ở đây, nhưng bạn nên biết rằng, trong thực tế, các nhà nghiên cứu thường thử rất nhiều trường hợp để tìm ra phương án tốt nhất.

Bài viết đến đây là hết. Hi vọng bạn đã có một hiểu biết sơ lược về thuật toán nổi tiếng k-hàng xóm gần nhất (hay k-nearest neighbors). Trong bài viết tiếp theo, tác giả sẽ giới thiệu một thuật toán mới hơn, phức tạp và rất mạnh gọi là Random Forest.

Hẹn gặp lại các bạn trong bài viết tới!

Có thể bạn đã nghe đến cụm từ Machine Learning (hay Data Mining, Big Data, Data Science,…) nhưng bạn chưa bao giờ hiểu ý nghĩa thực sự của chúng là gì. Có thể tất cả những gì bạn biết là “À! Đó là những thuật ngữ trong Toán học và Tin học”, và …thế là hết. Có thể bạn phải sử dụng những phần mềm dựa trên Machine Learning trong công việc nhưng với bạn, chúng hoạt động như là ma thuật vậy.

Nếu bạn vẫn đang còn tò mò, thì Machine Learning được dùng trong hầu hết mọi lĩnh vực. Ví dụ, Machine Learning được sử dụng bởi các ngân hàng để phát hiện gian lận và dự đoán rủi ro, được dùng bởi nhà quản lí email để phát hiện thư rác. Các bác sĩ dùng Machine Learning để hỗ trợ chẩn đoán, các nhà sinh học ứng dụng Machine Learning trong việc phân tích DNA. Chúng ta cũng đang tiếp xúc với nó hàng ngày khi Google/Bing/Yahoo đều sử dụng Machine Learning để xử lý mỗi khi bạn gõ lệnh tìm kiếm.

Mục tiêu của tác giả với chuỗi bài viết này là giúp các bạn có một hiểu biết sơ lược về Machine Learning và một cái nhìn trực quan về cách mà kỹ thuật này hoạt động. Thay vì nêu ra một đống lý thuyết, bài viết này sẽ chủ yếu dựa trên các ví dụ. Để đọc hiểu bài viết này, bạn không cần phải là một nhà khoa học máy tính; thậm chí, bạn không cần phải biết bất cứ điều gì liên quan đến máy tính và toán học.

Chuỗi bài viết trong chủ đề này gồm có 3 bài. Bài viết đầu tiên sẽ giới thiệu về một trong những nhiệm vụ chính của Machine Learning: Phân loại (Classification). Bài viết thứ hai trình bày và minh hoạ hai kỹ thuật quan trọng của Machine Learning được áp dụng trong bài toán phân loại: một trong số đó tuy rất đơn giản nhưng được sử dụng rộng rãi, cái còn lại là một kỹ thuật rất mới. Cuối cùng, bài viết thứ ba sẽ nói về cách các nhà khoa học máy tính đánh giá chất lượng của một kỹ thuật trong Machine Learning.

Định nghĩa


Thật sự không dễ để có thể đưa ra một định nghĩa chính xác của Machine Learning. Nói một cách nôm na, Machine Learning là các chương trình giúp đưa ra dự đoán hoặc giúp người dùng hiểu về các hiện tượng phức tạp.

Machine Learning là một chủ đề rộng lớn với rất nhiều chủ đề con. Thay vì cố gắng đưa ra những định nghĩa chung chung, bài viết sẽ chỉ tập trung vào một chủ đề duy nhất: Phân loại (Classification). Bài toán phân loại chỉ là một trong rất nhiều chủ đề của Machine Learning, nhưng là một trong những chủ đề quan trọng nhất. Khi người ta nói đến Machine Learning, thông thường họ nói đến bài toán phân loại (nếu họ không chỉ rõ chủ đề khác).

Phân loại (Classification)


Ý tưởng của bài toán phân loại bắt đầu như sau: Chúng ta có một danh sách các quan sát (observation). Một quan sát là một khái niệm chung chung. Với Machine Learning, một quan sát thường là sự mô tả một đối tượng trong một trạng thái nào đó. Để hiểu rõ hơn, hãy xét một ví dụ rất phổ biến trong Machine Learning: hoa diên vĩ (Iris flowers). Giả sử một quan sát là sự mô tả một bông hoa. Với mỗi bông hoa, chúng ta có bốn thông số: độ dày và chiều dài của đài hoa (sepal) và cánh hoa (petal). Trên thực tế, ví dụ về hoa diên vĩ nổi tiếng với cái tên the Iris dataset và đây là bộ dữ liệu được sử dụng rất rộng rãi trong giới nghiên cứu Machine Learning để tìm hiểu về các thuật toán phân loại.

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Bốn thông số của mỗi bông hoa được gọi là các thuộc tính (attributes). Trong Machine Learning, một quan sát đơn thuần chỉ là một danh sách các thuộc tính. Khi so sánh các quan sát, thực ra chúng ta so sánh các thuộc tính. Ví dụ: “Bông hoa này có cánh hoa dài hơn bông hoa kia”. Các thuộc tính có thể đại diện cho những thứ rất khác nhau. Ví dụ: độ dài của máy bay, thời gian của cơn bão, nhiệt độ của căn phòng, màu sắc của bức tường,… Nói chung, các thuộc tính thường được chia thành hai loại: thuộc tính dạng số (numbers) và thuộc tính dạng thể loại (categories). Sự khác biệt của hai loại thuộc tính này không quá nghiêm ngặt, nhưng thông thường, khi thuộc tính có thể so sánh được (> hoặc <), ta coi nó là thuộc tính dạng số (ví dụ như độ dài của cánh hoa diên vĩ), ngược lại chúng ta coi nó là thuộc tính dạng thể loại (ví dụ như màu sắc của một bông hoa hay chủng loại của một chú chó).

Ngoài ra, với mỗi quan sát (hay với mỗi bông hoa diên vĩ), chúng ta có một lớp (class). Một lớp là một thông tin bổ sung về một quan sát. Trong ví dụ về hoa diên vĩ, ta giả sử rằng lớp của một bông hoa diên vĩ chính là loài của nó. Trong ví dụ này, chúng ta chỉ quan tâm ba loài hoa diên vĩ: Setosa, Versicolour và Viginica.

Tóm lại, chúng ta có một tập hợp các quan sát (các bông hoa diên vĩ). Với mỗi quan sát, chúng ta có một số các thuộc tính và một lớp. Bảng dưới đây minh hoạ một tập hợp các quan sát trong ví dụ về hoa diên vĩ. Một bảng kiểu này thường được gọi là một dataset hay bộ dữ liệu.

Data mining-phân lớp hoa iris theo thuật toán bayesian năm 2024

Giả sử rằng chúng ta có 150 quan sát như vậy (tương ứng với 150 bông hoa diên vĩ). Tuy nhiên, với quan sát cuối cùng (hay bông hoa diên vĩ cuối cùng), chúng ta không biết lớp của nó là gì (hay không biết bông hoa thuộc loài gì). Chúng ta có thể tự hỏi: Liệu loài hoa có liên quan đến kích thước của cánh hoa và đài hoa không? Có chăng một loài hoa có cánh hoa dài hơn so với các loài diên vĩ khác? Nói cách khác, liệu chúng ta có thể sử dụng 149 bông hoa diên vĩ mà chúng ta đã biết lớp của nó, và tìm ra lớp của bông hoa cuối cùng không? Đó chính xác là bài toán phân loại. Diễn đạt theo cách khác, bài toán phân loại có thể mô tả như sau:

Giả sử chúng ta có một tập hợp các quan sát được đánh nhãn (hay các quan sát mà chúng ta đã biết lớp của nó) và một quan sát chưa được đánh nhãn. Làm thế nào để tìm ra lớp của quan sát đó?

Trong thực tế, dĩ nhiên các kỹ thuật phân loại không chỉ được dùng để phân loại hoa. Các ngân hàng sử dụng nó để phân loại khách hàng (ví dụ: liệu khách hàng có hoàn lại nợ tín dụng hay không?). Các bệnh viện ứng dụng nó để phân loại bệnh nhân, các công ty bảo hiểm dùng trong việc phân loại các thân chủ của mình… Phân loại còn có thể được sử dụng ở một mức độ sâu sắc hơn. Ví dụ, các loại camera hiện đại dùng classification để nhận diện khuôn mặt, dịch vụ bưu điện sử dụng nó trong việc nhận dạng địa chỉ viết tay. Các thương gia dự đoán thị trường bằng các thuật toán phân loại, trong khi những nhà khí tượng sử dụng nó để dự báo thời tiết.

Điểm khác biệt chính giữa những ví dụ trên chính là các thuộc tính. Với khách hàng của các ngân hàng, thuộc tính là thu nhập hàng tháng, điểm tín dụng, số lần sử dụng thẻ gần đây,… Với bệnh nhân thì thuộc tính là giới tính, nhịp tim, huyết áp,… Với các bức ảnh, thuộc tính chính là giá trị màu của từng điểm ảnh.

Trong bài viết tiếp theo, tác giả sẽ trình bày cách giải bài toán phân loại. Chính xác hơn, tác giả sẽ trình bày hai thuật toán phân loại được sử dụng rộng rãi mà bất cứ nhà nghiên cứu về Machine Learning nào cũng biết.

Nhân dịp TensorFlow vừa kỷ niệm 1 năm open source, mình viết bài này để kể lại 1 năm qua mình đã tự học Deep Learning như thế nào, vừa để tự tổng hợp kiến thức, vừa để cho các bạn nào quan tâm đến Machine Learning nói chung cũng như là Deep Learning nói riêng tham khảo.

Mình là 1 kỹ sư bên server-side, công việc chủ yếu dùng Rails, SQL và hoàn toàn không liên quan gì đến Deep Learning. Mình học hoàn toàn vì sở thích và vì cũng dự đoán được phần nào những kỹ năng về mảng này sẽ rất hữu ích về sau này. Hồi đại học mình cũng có 1 năm làm nghiên cứu về nhận dạng âm thanh nên nếu nói là không có 1 chút kiến thức nào thì cũng không phải, nhưng thú thật hồi đó chỉ làm qua loa cho tốt nghiệp. Năm vừa rồi khi mà các công ty lớn tung ra hàng loạt các framework về Deep Learning, mình thấy đã đến lúc phải quay lại học cẩn thận.

Bắt đầu từ cơ bản Machine Learning

Mình học Machine Learning qua khoá của thầy Andrew Ng trên Coursera. Link https://www.coursera.org/learn/machine-learning

Thầy Andrew Ng là 1 trong những người đầu ngành về cả Machine Learning và Deep Learning. Thầy Ng đã có thời gian dạy ở Stanford, 1 trong những người sáng lập Google Brain, và giờ làm Chief Scientist ở Baidu.

Khoá này thực sự rất hay cho người mới bắt đầu. Thầy Ng giảng cực kỳ chi tiết tất cả những khái niệm cần thiết, mở đầu bằng 1 ví dụ đơn giản như Linear Regression rồi đến những mô hình phức tạp hơn như Neural Network, SVM…

Qua khoá này mình đã nắm được cái lõi của Machine Learning, cũng như biết được nó có thể làm được những gì. Điều đáng tiếc 1 chút là bài tập được viết bằng Octave/Matlab – ngôn ngữ mà chủ yếu chỉ dùng trong nghiên cứu và ít khi được đưa vào các sản phẩm thực tiễn. Bạn có thể thấy khó khăn 1 chút khi học 1 ngôn ngữ hoàn toàn mới, nhưng yên tâm là Octave/Matlab khá dễ dùng và bài tập được thiết kế không quá khó.

Mình khuyên bạn nên học khoá này chung với vài người bạn, vừa để tạo động lực học, vừa để giúp đỡ nhau trong quá trình học. Thực tế là mình đã học cùng 1 vài người trong công ty và thay nhau giải thích đáp án của các bài tập: rất vui và hiệu quả.

Nếu bạn nào cảm thấy khó khăn trong việc giải các bài tập thì có thể tham khảo đáp án của mình đã được public trên GitHub.

Sẵn sàng cho Deep Learning

Học xong khoá Machine Learning trên chắc cũng mất khoảng 3 tháng. Sau đó mình nghỉ 1 thời gian rồi tiếp tục bước vào khoá thứ 2 về Deep Learning. Lần này mình chọn khoá Deep Learning trên Udacity do các kỹ sư của Google dạy. Link https://www.udacity.com/course/deep-learning–ud730

Vâng, vì là các kỹ sư dạy nên mình cảm nhận là khoá này không được chi tiết như khoá của thầy Ng. Tất cả các video đều rất ngắn, và chỉ giới thiệu qua loa về các mô hình Neural Network trong Deep Learning. Mình có thể hiểu hết những gì trong video nói nhưng đến khi làm bài tập thì mới vỡ lẽ ra là chẳng hiểu gì cả 😀

Cái hay của khoá này là các bài tập được thiết kế để dùng TensorFlow, rất hữu ích khi áp dụng vào thực tiễn. Nhưng nếu chỉ xem video rồi làm bài tập ngay thì mình nghĩ là khá khó để hoàn thành. Để làm được hết bài tập, mình phải làm các tutorial của TensorFlow, đọc thêm sách tham khảo, các luận văn liên quan. Nói chung là video thì chắc chỉ 2 tuần là xem hết, nhưng mà giải được hết bài tập thì cũng phải mất 3 tháng.

Đáp án mình cũng công khai hết trên GitHub.

Đào sâu thêm về Deep Learning

Nói chung là sau khoá trên thì mình cũng “hiểu na ná” CNN, RNN là gì rồi. Nhưng để áp dụng vào thực tế thì thấy vẫn còn khá khó khăn. Mình bắt đầu đọc sách mà được coi là sách giáo khoa của Deep Learning. Sách có thể đọc online tại http://www.deeplearningbook.org/

Sách này do Goodfellow, Bengio et al – những người đầu ngành về Deep Learning viết. Cuốn này khá dày nên mình đã in ra đóng thành sách giấy để đọc cho tiện. Chương 1 là kiến thức cơ bản về toán và Machine Learning. Chương này bổ sung rất tốt kiến thức cho khoá học Coursera, giúp mình hiểu rõ thêm về bản chất toán cũng như sự liên quan đến xác suất thống kê của các thuật toán đã học. Chương 2 là chương mình thích nhất. Chương này giải thích rất chi tiết về các Neural Network thường dùng như CNN, RNN, cũng như các ứng dụng của nó vào thực tế. Chương này thực sự giúp mình lấp lỗ hổng kiến thức sau khoá học trên Udacity. Chương cuối cùng là dành cho các nhà nghiên cứu. Rất khó để hiểu hết, nên hiện tại mình chỉ đọc với mục đích nhớ tên khái niệm là chính, hy vọng sau này có thể hiểu 😀

Song song với việc đọc sách giáo khoa về Deep Learning, mình còn xem video các bài giảng về Deep Learning của đại học Stanford. Có 2 khoá được công khai:

Khoá về xử lý hình ảnh: http://cs231n.stanford.edu/

Khoá về xử lý ngôn ngữ tự nhiên: http://cs224d.stanford.edu/

2 khoá này đều rất hay, nhưng thú thực là video dài quá và nhiều cái mình nghĩ đã hiểu đủ qua sách của Goodfellow nên mình không xem hết, mà chỉ tập trung những cái mà mình quan tâm thôi.

Bắt đầu tự viết ứng dụng

Sau khoảng 10 tháng để tiêu hoá hết chỗ trên, mình bắt đầu dùng TensorFlow để làm những ứng dụng chơi chơi đơn giản. Ứng dụng gần đây nhất là viết 1 con chatbot trên LINE có thể gửi trả 1 sticker phù hợp với nội dung tin nhắn. Ứng dụng vẫn đang trong quá trình phát triển vì vẫn còn hơi ít data nhưng mình đã phát biểu về nó tại 1 meetup cho engineer ở Nhật. Bạn nào hiểu tiếng Nhật có thể tham khảo tại http://www.slideshare.net/vanhuyz/tensorflowline-botaws-lambda

Hiện nay công ty mình bắt đầu có 1 vài dự án mới về AI, và những kiến thức mình thu được 1 năm qua chắc chắn sẽ giúp ích được rất nhiều.

Tóm lại

Deep Learning là 1 mảng khó, nên bạn không thể học hết trong 1 vài ngày. Nếu muốn làm việc về lĩnh vực này, bạn cần thời gian và cả 1 chút đam mê nữa. Hy vọng qua bài viết của mình, các bạn có thể tự tìm được phương pháp học tốt nhất cho mình!