Cho đến bây giờ chúng ta đã học về linear regression, hồi quy logistic và chúng khá khó hiểu. Bây giờ chúng ta hãy bắt đầu với Decision Tree và tôi đảm bảo với bạn rằng đây có lẽ là thuật toán dễ nhất trong Machine learning. Không có nhiều toán học liên quan ở đây. Đây có lẽ là phương pháp đơn giản nhất lúc bắt đầu học machine learning.
Decision Tree là gì?
Nó là một công cụ có các ứng dụng bao gồm nhiều lĩnh vực khác nhau. Decision Tree có thể được sử dụng để phân loại cũng như các bài toán hồi quy. Bản thân cái tên gợi ý rằng nó sử dụng một sơ đồ giống như cấu trúc cây để hiển thị các dự đoán là kết quả của một loạt các phân tách dựa trên tính năng. Nó bắt đầu với một Root Nodes và kết thúc bằng một quyết định của các lá.
Trước khi tìm hiểu thêm về Decision Tree, chúng ta hãy làm quen với một số thuật ngữ.
Root Nodes – Nó là nút hiện diện ở đầu Decision Tree từ nút này, quần thể bắt đầu phân chia theo các đặc điểm khác nhau.
Các Decision Nodes – các nút chúng ta nhận được sau khi tách các Root Nodes được gọi là Decision Nodes
Leaf Nodes – các nút không thể tách thêm được gọi là Leaf Nodes hoặc nút đầu cuối
Sub-tree – giống như một phần nhỏ của đồ thị được gọi là đồ thị con, tương tự như vậy một phần con của Decision Tree này được gọi là Sub-tree.
Pruning – không có gì khác ngoài việc cắt giảm một số nút để ngừng trang bị quá mức.
Xem thêm Decision Coverage Testing trong kiểm thử phần mềm
Các ứng dụng của cây quyết định là gì?
Cây quyết định được sử dụng để xử lý các tập dữ liệu phi tuyến tính một cách hiệu quả. Công cụ cây quyết định được sử dụng trong cuộc sống thực trong nhiều lĩnh vực, chẳng hạn như kỹ thuật, quy hoạch dân dụng, luật và kinh doanh. Cây quyết định có thể được chia thành hai loại; cây quyết định biến phân loại và biến liên tục.
Hãy hiểu Decision Tree với sự trợ giúp của ví dụ.
Ví dụ Decision Tree
Decision Tree lộn ngược có nghĩa là gốc ở trên cùng và sau đó gốc này được chia thành nhiều nút khác nhau. Decision Tree không là gì ngoài một loạt các câu lệnh if-else theo thuật ngữ của giáo dân. Nó kiểm tra xem điều kiện có đúng không và nếu đúng thì nó sẽ chuyển đến nút tiếp theo được đính kèm với quyết định đó.
Trong sơ đồ dưới đây, đầu tiên cây sẽ hỏi thời tiết là gì? Trời nắng, mây, hay mưa? Nếu có thì sẽ chuyển sang tính năng tiếp theo là độ ẩm và gió. Nó sẽ kiểm tra lại xem có gió mạnh hay yếu, nếu gió yếu và trời mưa thì người đó có thể đi chơi.
Bạn có nhận thấy điều gì trong sơ đồ trên không? Chúng tôi thấy rằng nếu thời tiết nhiều mây thì chúng tôi phải đi chơi. Tại sao nó không tách ra nhiều hơn? Tại sao nó dừng lại ở đó?
Để trả lời câu hỏi này, chúng ta cần biết thêm một số khái niệm như entropy, information gain và Gini index. Nhưng nói một cách dễ hiểu, tôi có thể nói ở đây rằng kết quả đầu ra cho tập dữ liệu đào tạo luôn là có đối với thời tiết nhiều mây, vì không có sự lộn xộn ở đây, chúng tôi không cần phải chia nút thêm nữa.
Mục tiêu của Machine learning là giảm sự không chắc chắn hoặc rối loạn từ tập dữ liệu và để làm được điều này, chúng tôi sử dụng Decision Tree.
Bây giờ bạn phải nghĩ làm thế nào để tôi biết những gì nên là Root Nodes? Decision Nodes nên là gì? khi nào tôi nên ngừng chia nhỏ? Để quyết định điều này, có một số liệu được gọi là “Entropy”, là lượng không chắc chắn trong tập dữ liệu.
Xem thêm Decision Trees trong R-tìm hiểu và cách sử dụng
Thuật toán cây quyết định
Cây quyết định hay Decision Tree là một thuật toán đơn giản. Thuật toán này nhằm mục tiêu xây dựng các quy tắc hay luật lệ quyết định dựa theo cấu trúc cây với mỗi bộ luật tương ứng với nhánh lá của cây. Dữ liệu đầu vào có thể là dữ liệu missing không cần qua quá trình chuẩn hóa và tạo biến giả
Entropy
Entropy không là gì khác ngoài sự không chắc chắn trong tập dữ liệu hoặc thước đo sự rối loạn của chúng tôi. Hãy để tôi cố gắng giải thích điều này với sự trợ giúp của một ví dụ.
Giả sử bạn có một nhóm bạn quyết định họ có thể xem bộ phim nào cùng nhau vào Chủ nhật. Có 2 sự lựa chọn cho phim, một là “Lucy” và thứ hai là “Titanic” và bây giờ mọi người phải đưa ra lựa chọn của mình. Sau khi mọi người đưa ra câu trả lời của họ, chúng tôi thấy rằng “Lucy” được 4 phiếu bầu và “Titanic” được 5 phiếu bầu. Bây giờ chúng ta xem bộ phim nào? Bây giờ không khó để chọn 1 phim vì lượt bình chọn cho cả hai phim đều ngang nhau.
Đây chính xác là những gì chúng tôi gọi là rối loạn, có một số phiếu bầu bằng nhau cho cả hai bộ phim và chúng tôi thực sự không thể quyết định bộ phim nào chúng tôi nên xem. Sẽ dễ dàng hơn nhiều nếu số phiếu bầu cho “Lucy” là 8 và cho “Titanic” là 2. Ở đây chúng ta có thể dễ dàng nói rằng đa số phiếu bầu dành cho “Lucy” do đó mọi người sẽ xem bộ phim này.
Trong Decision Tree, đầu ra chủ yếu là “có” hoặc “không”
Công thức cho Entropy được hiển thị bên dưới:
- Ở đây p + là xác suất của lớp dương
- p– là xác suất của lớp phủ định
S là tập con của ví dụ huấn luyện
Làm thế nào để Decision Tree sử dụng Entropy?
Bây giờ chúng ta biết entropy là gì và công thức của nó là gì, Tiếp theo, chúng ta cần biết rằng nó hoạt động chính xác như thế nào trong thuật toán này.
Về cơ bản, Entropy đo độ tạp chất của một nút. Tạp chất là mức độ ngẫu nhiên; nó cho biết dữ liệu của chúng ta ngẫu nhiên như thế nào. Một phân tách con thuần túy có nghĩa là bạn sẽ nhận được “có” hoặc bạn sẽ nhận được “không”.
Giả sử ban đầu một đối tượng có 8 “có” và 4 “không”, sau lần phân chia đầu tiên, nút bên trái nhận được 5 ‘yes ’và 2″ no “trong khi nút bên phải nhận được 3” yes “và 2” no “.
Chúng ta thấy ở đây sự phân chia không trong sáng, tại sao vậy? Bởi vì chúng ta vẫn có thể thấy một số lớp phủ định trong cả hai nút. Để tạo một Decision Tree, chúng ta cần tính tạp chất của mỗi lần tách, và khi độ tinh khiết là 100%, chúng ta làm cho nó như một Leaf Nodes.
Xem thêm BlockChain: xây dựng ứng dụng DApp với Ethereum
Để kiểm tra tạp chất của đặc điểm 2 và đặc điểm 3, chúng tôi sẽ thực hiện trợ giúp cho công thức Entropy.
Chúng ta có thể thấy rõ ràng từ bản thân cây rằng nút bên trái có entropy thấp hoặc độ tinh khiết hơn nút bên phải vì nút bên trái có số lượng “có” nhiều hơn và rất dễ dàng để quyết định ở đây.
Luôn nhớ rằng Entropy càng cao thì độ tinh khiết càng thấp và tạp chất càng cao.
Như đã đề cập trước đó, mục tiêu của Machine learning là giảm độ không chắc chắn hoặc tạp chất trong tập dữ liệu, ở đây bằng cách sử dụng entropy, chúng ta đang nhận được tạp chất của một nút cụ thể, chúng ta không biết là entropy cha hay entropy của một nút cụ thể có giảm hay không.
Đối với điều này, chúng tôi mang đến một số liệu mới có tên là “Mức tăng thông tin” cho chúng tôi biết entropy mẹ đã giảm bao nhiêu sau khi tách nó bằng một số tính năng.
Xem thêm R graphical Models, cách sử dụng
Information Gain
Information Gain đo lường việc giảm độ không đảm bảo do một số đặc điểm và nó cũng là yếu tố quyết định thuộc tính nào nên được chọn làm Decision Nodes hoặc Root Nodes.
Nó chỉ là entropy của tập dữ liệu đầy đủ – entropy của tập dữ liệu được cung cấp một số tính năng.
Để hiểu rõ hơn điều này, chúng ta hãy xem xét một ví dụ:
Giả sử toàn bộ dân số của chúng ta có tổng cộng 30 trường hợp. Bộ dữ liệu là để dự đoán liệu người đó có đi đến phòng tập thể dục hay không. Giả sử 16 người đến phòng tập thể dục và 14 người không đi
Bây giờ chúng ta có hai tính năng để dự đoán liệu anh ấy / cô ấy có đi đến phòng tập thể dục hay không.
Xét thuộc tính là “Energy” nhận hai giá trị “high” và “low”
Thuộc tính 2 là “Motivation” có 3 giá trị “No motivation”, “Neutral” và “Highly motivated”.
Hãy xem Decision Tree của chúng ta sẽ được thực hiện như thế nào khi sử dụng 2 tính năng này. Chúng tôi sẽ sử dụng thu thập thông tin để quyết định tính năng nào nên là Root Nodes và tính năng nào sẽ được đặt sau khi tách.
Hãy tính toán entropy:
Để xem trung bình có trọng số của entropy của mỗi nút, chúng ta sẽ làm như sau:
Bây giờ chúng ta có giá trị của E (Parent) và E (Parent | Energy), Information Gain sẽ là:
Entropy parent của chúng tôi là gần 0,99 và sau khi xem xét giá trị thu được thông tin này, chúng ta có thể nói rằng entropy của tập dữ liệu sẽ giảm 0,37 nếu chúng ta đặt “energy” làm Root Nodes.
Tương tự, chúng tôi sẽ thực hiện điều này với tính năng khác “Motivation” và tính toán mức tăng thông tin của nó.
Hãy tính toán entropy ở đây:
Để xem trung bình có trọng số của entropy của mỗi nút, chúng ta sẽ làm như sau:
Bây giờ chúng ta có giá trị của E (Parent) và E (Parent | Motivation), Information Gain sẽ là:
Bây giờ chúng tôi thấy rằng tính năng “energy” giảm nhiều hơn, là 0,37 so với tính năng “Motivation”. Do đó, chúng tôi sẽ chọn đối tượng địa lý có mức tăng thông tin cao nhất và sau đó tách nút dựa trên đối tượng địa lý đó.
Trong ví dụ này, “energy” sẽ là Root Nodes của chúng ta và chúng ta sẽ làm tương tự đối với các nút phụ. Ở đây chúng ta có thể thấy rằng khi energy “cao” thì entropy thấp và do đó chúng ta có thể nói một người chắc chắn sẽ đến phòng tập thể dục nếu anh ta có energy cao, nhưng nếu energy thấp thì sao? Một lần nữa chúng tôi sẽ chia nút dựa trên tính năng mới là “Motivation”.
Khi nào thì ngừng chia nhỏ?
Chắc hẳn bạn đang tự hỏi mình câu hỏi này rằng khi nào thì chúng ta ngừng phát triển cây của mình? Thông thường, các bộ dữ liệu trong thế giới thực có một số lượng lớn các tính năng, điều này sẽ dẫn đến một số lượng lớn các phân tách, do đó tạo ra một cây khổng lồ. Những cây như vậy cần nhiều thời gian để xây dựng và có thể dẫn đến tình trạng quá sung. Điều đó có nghĩa là cây sẽ cho độ chính xác rất tốt trên tập dữ liệu huấn luyện nhưng sẽ cho độ chính xác kém trong dữ liệu thử nghiệm.
Có nhiều cách để giải quyết vấn đề này thông qua điều chỉnh siêu tham số. Chúng ta có thể đặt độ sâu tối đa cho Decision Tree của mình bằng cách sử dụng tham số max_depth. Giá trị của max_depth càng nhiều thì cây của bạn càng phức tạp. Lỗi đào tạo sẽ giảm đi nếu chúng ta tăng giá trị max_depth nhưng khi dữ liệu thử nghiệm của chúng ta hiển thị trên hình ảnh, chúng ta sẽ nhận được độ chính xác rất kém. Do đó, bạn cần một giá trị sẽ không trang bị quá mức cũng như không trang bị đầy đủ cho dữ liệu của chúng tôi và đối với điều này, bạn có thể sử dụng GridSearchCV.
Một cách khác là đặt số lượng mẫu tối thiểu cho mỗi lần đổ. Nó được ký hiệu là min_samples_split. Ở đây chúng tôi chỉ định số lượng mẫu tối thiểu cần thiết để thực hiện đổ. Ví dụ: chúng tôi có thể sử dụng tối thiểu 10 mẫu để đi đến quyết định. Điều đó có nghĩa là nếu một nút có ít hơn 10 mẫu
sau đó sử dụng tham số này, chúng ta có thể dừng việc chia nhỏ thêm nút này và biến nó thành một Leaf Nodes.
Có nhiều siêu tham số hơn như:
- min_samples_leaf – đại diện cho số lượng mẫu tối thiểu cần thiết để có trong Leaf Nodes. Bạn càng tăng số lượng, càng có nhiều khả năng trang bị quá mức.
- max_features – nó giúp chúng tôi quyết định số lượng tính năng cần xem xét khi tìm kiếm sự phân tách tốt nhất.
Pruning
Đó là một phương pháp khác có thể giúp chúng ta tránh overfitting. Nó giúp cải thiện hiệu suất của cây bằng cách cắt các nút hoặc nút con không quan trọng. Nó loại bỏ các nhánh có tầm quan trọng rất thấp.
Chủ yếu có 2 cách để Pruning:
- Pre-pruning – chúng ta có thể ngừng phát triển cây sớm hơn, có nghĩa là chúng ta có thể tỉa / loại bỏ / cắt một nút nếu nó có tầm quan trọng thấp trong khi phát triển cây.
- Post-pruning – khi cây của chúng ta đã được xây dựng đến độ sâu của nó, chúng ta có thể bắt đầu tỉa các nút dựa trên ý nghĩa của chúng.
Chú thích
Tóm lại, trong bài này chúng ta đã tìm hiểu về Decision Tree. Trên cơ sở nào cây phân chia các nút và làm thế nào để có thể ngừng trang bị quá mức. tại sao linear regression không hoạt động trong trường hợp các vấn đề phân loại.
Sử dụng Decision Trees trong R
Cài đặt R và RStudio
Trước khi bắt đầu làm việc với Decision Trees trong R, bạn cần cài đặt R và RStudio – một môi trường phát triển tích hợp (IDE) dành cho R. R là một ngôn ngữ lập trình mạnh mẽ được sử dụng rộng rãi trong thống kê và khoa học dữ liệu, trong khi RStudio cung cấp một giao diện người dùng thân thiện để làm việc với R.
Bước 1: Cài Đặt R
- Truy cập trang web CRAN và tải xuống phiên bản R mới nhất cho hệ điều hành của bạn (Windows, MacOS hoặc Linux).
- Chạy file cài đặt và làm theo hướng dẫn để hoàn tất quá trình cài đặt.
Bước 2: Cài Đặt RStudio
- Sau khi cài đặt R, hãy đến trang web của RStudio và tải xuống phiên bản RStudio Desktop miễn phí phù hợp với hệ điều hành của bạn.
- Chạy file cài đặt và làm theo các bước được chỉ định để hoàn thành việc cài đặt.
Bước 3: Cài Đặt Các Gói Cần Thiết
Decision Trees trong R sử dụng các gói như rpart
, party
, và randomForest
. Để cài đặt các gói này, bạn có thể sử dụng giao diện dòng lệnh trong RStudio:
install.packages("rpart") install.packages("party") install.packages("randomForest")
Sau khi cài đặt, bạn có thể tải các gói này vào phiên làm việc R của mình sử dụng lệnh library()
:
library(rpart) library(party) library(randomForest)
Sau khi hoàn thành các bước trên, bạn đã sẵn sàng để bắt đầu làm việc với Decision Trees trong R. Các gói rpart
, party
, và randomForest
cung cấp các công cụ mạnh mẽ để xây dựng, đánh giá và tối ưu hóa các mô hình Decision Tree và Random Forest, giúp bạn giải quyết nhiều vấn đề phức tạp trong phân tích dữ liệu và học máy.
Xử lý dữ liệu ban đầu
Làm Sạch và Chuẩn Bị Dữ Liệu
- Xử Lý Giá Trị Thiếu: Dữ liệu thực tế thường chứa giá trị thiếu. Có nhiều phương pháp để xử lý vấn đề này, bao gồm việc loại bỏ dòng hoặc cột chứa giá trị thiếu, hoặc thay thế giá trị thiếu bằng giá trị trung bình, trung vị, hoặc một giá trị đặc biệt nào đó của cột đó.
dữ_liệu$số_lượng <- ifelse(is.na(dữ_liệu$số_lượng), ave(dữ_liệu$số_lượng, FUN = function(x) mean(x, na.rm = TRUE)), dữ_liệu$số_lượng)
- Chuyển Đổi Biến Danh Mục: Nhiều mô hình học máy yêu cầu tất cả dữ liệu đầu vào phải ở dạng số. Do đó, biến danh mục cần được chuyển đổi thành dạng số, sử dụng phương pháp mã hóa như One-hot Encoding.
dữ_liệu <- model.matrix(~loại - 1, data = dữ_liệu)
Phân Chia Dữ Liệu
- Tách Bộ Dữ Liệu: Một khi dữ liệu đã sẵn sàng, bạn cần tách nó thành bộ dữ liệu huấn luyện và kiểm tra. Điều này cho phép đánh giá mô hình trên dữ liệu chưa từng thấy, giúp kiểm tra khả năng tổng quát hóa của mô hình.
set.seed(123) # Đặt seed cho tính nhất quán chỉ_số <- sample(1:nrow(dữ_liệu), size = floor(0.75 * nrow(dữ_liệu))) dữ_liệu_huấn_luyện <- dữ_liệu[chỉ_số, ] dữ_liệu_kiểm_tra <- dữ_liệu[-chỉ_số, ]
Trong ví dụ trên, dữ_liệu
là dataframe chứa dữ liệu của bạn. Chúng ta chọn 75% dữ liệu cho việc huấn luyện và phần còn lại cho việc kiểm tra. Lưu ý rằng trước khi chạy mã, bạn cần thay thế dữ_liệu
, số_lượng
, và loại
bằng tên thực của dataframe và các cột trong dữ liệu của bạn.
Chuẩn bị dữ liệu đúng cách không chỉ giúp tăng cường chất lượng mô hình của bạn mà còn đảm bảo rằng kết quả đánh giá mô hình là chính xác và có ý nghĩa.
Xây dựng mô hình Decision Tree
Xây dựng mô hình Decision Tree trong R sử dụng gói rpart
là một cách tiếp cận mạnh mẽ để phân loại hoặc dự đoán kết quả dựa trên dữ liệu của bạn. Dưới đây là các bước để tạo và hiểu một mô hình Decision Tree.
Sử Dụng Gói rpart
Gói rpart
(Recursive Partitioning and Regression Trees) trong R cung cấp một phương tiện hiệu quả để xây dựng các mô hình Decision Tree.
Đầu tiên, bạn cần cài đặt và gọi gói này trong phiên làm việc R của bạn:
install.packages("rpart") library(rpart)
Thiết Lập Các Tham Số Cho Mô Hình
Khi sử dụng rpart
, có thể điều chỉnh nhiều tham số để cải thiện mô hình của bạn. Một số tham số quan trọng bao gồm:
method
: Chọn “class” cho phân loại hoặc “anova” cho hồi quy.minsplit
: Số lượng quan sát tối thiểu cần thiết trước khi một nút được tách.cp
: Độ phức tạp tối thiểu cần thiết cho một sự phân chia mới.
Ví dụ, để xây dựng một mô hình Decision Tree phân loại:
mô_hình <- rpart(class ~ ., data=dữ_liệu_huấn_luyện, method="class", minsplit=20, cp=0.01)
Trong đó class
là tên cột chứa biến mục tiêu và .
đại diện cho tất cả các biến khác trong dataframe dữ_liệu_huấn_luyện
được sử dụng làm biến dự đoán.
Vẽ Cây Quyết Định
Sau khi xây dựng mô hình, bạn có thể vẽ cây quyết định để trực quan hóa nó:
install.packages("rpart.plot") library(rpart.plot) rpart.plot(mô_hình)
Cây quyết định sẽ hiển thị cách dữ liệu được tách ra tại mỗi nút dựa trên các thuộc tính, giúp bạn hiểu cách mô hình đưa ra quyết định.
Giải Thích Cách Đọc Cây
- Mỗi nút trong cây thể hiện một quyết định dựa trên một thuộc tính của dữ liệu.
- Cành dẫn xuống từ nút thể hiện kết quả của quyết định đó.
- Nút lá (nút không có cành phân nhánh khác) thể hiện kết quả cuối cùng (phân loại hoặc giá trị dự đoán).
Xây dựng và hiểu một mô hình Decision Tree sẽ giúp bạn nhận ra cách các thuộc tính dữ liệu ảnh hưởng đến kết quả, cung cấp cái nhìn sâu sắc vào quyết định mô hình và hỗ trợ trong việc đưa ra quyết định dựa trên dữ liệu.
Cải thiện hiệu suất của mô hình Decision Tree
Cải thiện hiệu suất của mô hình Decision Tree không chỉ giúp tăng độ chính xác mà còn giúp mô hình có khả năng tổng quát hóa tốt hơn khi áp dụng trên dữ liệu mới. Dưới đây là một số kỹ thuật quan trọng nhất để cải tiến mô hình Decision Tree.
Pruning (Tỉa Cây)
Pruning là quá trình loại bỏ các phần của cây quyết định để ngăn chặn việc mô hình hóa quá mức (overfitting). Mục tiêu là giảm kích thước của cây quyết định bằng cách loại bỏ các nút con của một nút quyết định nếu việc loại bỏ đó không làm tăng đáng kể lỗi kiểm tra. Pruning giúp tăng cường khả năng tổng quát hóa của mô hình trên dữ liệu chưa từng thấy.
mô_hình_pruned <- prune(mô_hình, cp = mô_hình$cptable[which.min(mô_hình$cptable[, "xerror"]), "CP"])
Trong đó, cp
là độ phức tạp tối thiểu cần thiết cho một sự phân chia mới.
Random Forest
Random Forest là một ensemble của nhiều cây quyết định, mỗi cây được xây dựng trên một tập con ngẫu nhiên của dữ liệu với việc lấy mẫu có hoàn lại (bootstrap sampling). Mô hình cuối cùng là kết quả trung bình của các cây, giúp giảm overfitting và tăng độ chính xác.
Sử dụng gói randomForest
để xây dựng và đánh giá mô hình Random Forest:
install.packages("randomForest") library(randomForest) mô_hình_RF <- randomForest(class ~ ., data=dữ_liệu_huấn_luyện, ntree=500, mtry=3)
Trong đó ntree
là số lượng cây trong rừng và mtry
là số lượng biến được xem xét tại mỗi phân chia.
Đánh Giá Random Forest
Sau khi xây dựng mô hình Random Forest, bạn nên đánh giá hiệu suất của nó trên tập dữ liệu kiểm tra:
dự_đoán <- predict(mô_hình_RF, dữ_liệu_kiểm_tra) confusionMatrix(dự_đoán, dữ_liệu_kiểm_tra$class)
Các kỹ thuật như pruning và việc sử dụng ensemble model như Random Forest không chỉ cải thiện độ chính xác mà còn giúp mô hình có khả năng tổng quát hóa tốt hơn, đồng thời giảm thiểu nguy cơ overfitting.