Tạo cây quyết định

Trong bài này, bạn sẽ sử dụng thư viện YDF (Rừng quyết định Yggdrasil) để huấn luyện và diễn giải cây quyết định.

Bài này được lấy cảm hứng từ hướng dẫn 🧭 Bắt đầu với YDF.

Đấu loại

Trước khi nghiên cứu tập dữ liệu, hãy làm như sau:

  1. Tạo một sổ tay Colab mới.
  2. Cài đặt thư viện YDF bằng cách đặt và thực thi dòng mã sau trong sổ tay Colab mới:
    !pip install ydf -U
  3. Nhập các thư viện sau:
    import ydf
    import numpy as np
    import pandas as pd

Tập dữ liệu về chim cánh cụt Palmer

Colab này sử dụng tập dữ liệu chim cánh cụt Palmer, chứa thông tin đo lường kích thước của 3 loài chim cánh cụt:

  • Dây đeo cằm
  • Gentoo
  • Adelie

Đây là một bài toán phân loại – mục tiêu là dự đoán loài chim cánh cụt dựa trên dữ liệu trong tập dữ liệu Chim cánh cụt của Palmer. Sau đây là những chú chim cánh cụt:

Ba loài chim cánh cụt khác nhau.

Hình 16. Ba loài chim cánh cụt khác nhau. Hình ảnh của @allisonhorst

 

Mã sau đây gọi hàm pandas để tải tập dữ liệu Palmer Penguins vào bộ nhớ:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

Bảng sau đây định dạng 3 ví dụ đầu tiên trong tập dữ liệu Palmer Penguins:

Bảng 3. 3 ví dụ đầu tiên trong Palmer Penguins

loài đảo bill_length_mm bill_depth_mm flipper_length_mm body_mass_g tình dục năm
0 Adelie Torgersen 39.1 18,7 181,0 3750 nam 2007
1 Adelie Torgersen 39,5 17,4 186,0 3800 nữ giới 2007
2 Adelie Torgersen 40,3 18.0 195,0 3250 nữ giới 2007

Tập dữ liệu đầy đủ chứa dữ liệu số (ví dụ: bill_depth_mm), dữ liệu phân loại (ví dụ: island) và các tính năng bị thiếu. Không giống như mạng nơron, rừng quyết định hỗ trợ tất cả các loại tính năng này ngay từ đầu, vì vậy, bạn không phải thực hiện việc mã hoá một nóng, chuẩn hoá hoặc tính năng is_present bổ sung.

Ô mã sau đây chia tập dữ liệu thành tập dữ liệu huấn luyện và tập dữ liệu kiểm thử:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

Huấn luyện cây quyết định bằng các tham số siêu dữ liệu mặc định

Bạn có thể huấn luyện cây quyết định đầu tiên bằng thuật toán học CART (Cây hồi quy và phân loại) (còn gọi là trình học) mà không cần chỉ định bất kỳ tham số siêu dữ liệu nào. Đó là do trình học ydf.CartLearner cung cấp các giá trị tham số siêu dữ liệu mặc định tốt. Bạn sẽ tìm hiểu thêm về cách hoạt động của loại mô hình này trong phần sau của khoá học.

model = ydf.CartLearner(label=label).train(train_dataset)

Lệnh gọi trước đó không chỉ định cột để sử dụng làm tính năng đầu vào. Do đó, mọi cột trong tập huấn luyện đều được sử dụng. Lệnh gọi này cũng không chỉ định ngữ nghĩa (ví dụ: số, danh mục, văn bản) của các đặc điểm đầu vào. Do đó, ngữ nghĩa của tính năng sẽ được tự động suy luận.

Gọi model.plot_tree() để hiển thị cây quyết định thu được:

model.plot_tree()

Trong Colab, bạn có thể sử dụng chuột để hiển thị thông tin chi tiết về các phần tử cụ thể, chẳng hạn như việc phân phối lớp trong mỗi nút.

Cây quyết định được huấn luyện bằng các tham số siêu dữ liệu mặc định.

Hình 17. Cây quyết định được huấn luyện bằng các tham số siêu dữ liệu mặc định.

Colab cho thấy điều kiện gốc chứa 243 ví dụ. Tuy nhiên, bạn có thể nhớ rằng tập dữ liệu huấn luyện chứa 272 ví dụ. 29 ví dụ còn lại đã được tự động đặt trước để xác thực và cắt tỉa cây.

Điều kiện đầu tiên kiểm tra giá trị của bill_depth_mm. Bảng 4 và 5 cho thấy khả năng xuất hiện của các loài khác nhau tuỳ thuộc vào kết quả của điều kiện đầu tiên.

Bảng 4. Xác suất có nhiều loài nếu bill_depth_mm ≥ 42.3

Loài Khả năng
Adelie (màu đỏ) 8%
Gentoo (xanh dương) 58%
Quai nón (xanh lục) 36%

 

Bảng 5. Xác suất có nhiều loài nếu bill_depth_mm < 42.3

Loài Khả năng
Adelie (màu đỏ) 97%
Gentoo (xanh dương) 2%
Quai nón (xanh lục) 0%

bill_depth_mm là một đặc điểm số. Do đó, giá trị 42,3 được tìm thấy bằng cách sử dụng thuật toán phân tách chính xác để phân loại nhị phân bằng các đặc điểm số.

Nếu bill_depth_mm ≥ 42.3 là True, hãy kiểm thử thêm xem liệu flipper_length_mm ≥ 207.5 có thể phân tách gần như hoàn hảo Gentoo và Gentoos+Adelie hay không.

Mã sau đây cung cấp độ chính xác của quá trình huấn luyện và kiểm thử của mô hình:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

Rất hiếm khi, nhưng có thể xảy ra trường hợp độ chính xác của kiểm thử cao hơn độ chính xác của quá trình huấn luyện. Trong trường hợp đó, tập dữ liệu kiểm thử có thể khác với tập dữ liệu huấn luyện. Tuy nhiên, đây không phải là trường hợp ở đây vì dữ liệu huấn luyện và dữ liệu kiểm thử được phân tách ngẫu nhiên. Một cách giải thích có khả năng hơn là tập dữ liệu kiểm thử rất nhỏ (chỉ có 72 ví dụ), vì vậy, độ chính xác ước tính sẽ không chính xác.

Trong thực tế, đối với một tập dữ liệu nhỏ như vậy, bạn nên sử dụng phương pháp xác thực chéo vì phương pháp này sẽ tính toán các giá trị chỉ số đánh giá chính xác hơn. Tuy nhiên, trong ví dụ này, chúng ta sẽ tiếp tục với việc đào tạo và kiểm thử để đơn giản hoá.

Cải thiện các tham số siêu dữ liệu của mô hình

Mô hình này là một cây quyết định đơn được huấn luyện bằng các giá trị tham số siêu dữ liệu mặc định. Để nhận được kết quả dự đoán chính xác hơn, bạn có thể:

  1. Sử dụng một trình học mạnh mẽ hơn, chẳng hạn như mô hình rừng ngẫu nhiên hoặc cây tăng cường theo độ dốc. Các thuật toán học đó sẽ được giải thích trong trang tiếp theo.

  2. Tối ưu hoá tham số siêu dữ liệu bằng cách sử dụng các quan sát và trực giác của bạn. Bạn có thể tham khảo hướng dẫn cải thiện mô hình.

  3. Sử dụng tính năng điều chỉnh tham số siêu dữ liệu để tự động kiểm thử một lượng lớn tham số siêu dữ liệu có thể có.

Vì chúng ta chưa thấy thuật toán rừng ngẫu nhiên và cây tăng cường theo độ dốc, đồng thời số lượng ví dụ quá nhỏ để tự động điều chỉnh tham số siêu dữ liệu, nên bạn sẽ cải thiện mô hình theo cách thủ công.

Cây quyết định hiển thị ở trên có kích thước nhỏ và lá có 61 ví dụ chứa hỗn hợp các nhãn Adelie và Chinstrap. Tại sao thuật toán không phân chia thêm lá này? Có hai lý do có thể xảy ra:

  • Có thể bạn đã đạt đến số lượng mẫu tối thiểu trên mỗi lá (min_examples=5 theo mặc định).
  • Cây có thể đã được chia rồi cắt bớt để tránh tình trạng phù hợp quá mức.

Giảm số lượng ví dụ tối thiểu xuống còn 1 và xem kết quả:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

Một cây quyết định được huấn luyện với
min_examples=1.

Hình 18. Cây quyết định được huấn luyện với min_examples=1.

 

Nút lá chứa 61 ví dụ đã được chia nhiều lần.

Để xem việc phân chia thêm nút có giá trị hay không, chúng ta đánh giá chất lượng của mô hình mới này trên tập dữ liệu kiểm thử:

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

Chất lượng của mô hình đã tăng lên với độ chính xác kiểm thử từ 0,9167 lên 0,97222. Đây là một ý tưởng hay về việc thay đổi tham số siêu dữ liệu.

Trước đây của rừng quyết định

Bằng cách tiếp tục cải thiện các tham số siêu dữ liệu, chúng ta có thể đạt được độ chính xác hoàn hảo. Tuy nhiên, thay vì quy trình thủ công này, chúng ta có thể huấn luyện một mô hình mạnh mẽ hơn, chẳng hạn như rừng ngẫu nhiên, và xem liệu mô hình đó có hoạt động hiệu quả hơn hay không.

model = ydf.RandomForestLearner(label=label).train(train_dataset)
print("Test accuracy: ", model.evaluate(test_dataset).accuracy)
# >> Test accuracy: 0.986111

Độ chính xác của rừng ngẫu nhiên tốt hơn cây đơn giản của chúng ta. Bạn sẽ tìm hiểu lý do trong các trang tiếp theo.

Cách sử dụng và giới hạn

Như đã đề cập trước đó, một cây quyết định thường có chất lượng thấp hơn so với các phương pháp học máy hiện đại như rừng ngẫu nhiên, cây tăng cường độ dốc và mạng nơron. Tuy nhiên, cây quyết định vẫn hữu ích trong các trường hợp sau:

  • Là một đường cơ sở đơn giản và không tốn kém để đánh giá các phương pháp phức tạp hơn.
  • Khi có sự đánh đổi giữa chất lượng mô hình và khả năng diễn giải.
  • Là một proxy cho việc diễn giải mô hình rừng quyết định mà khoá học sẽ khám phá sau.