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

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

Bài này lấy cảm hứng từ hướng dẫn 🧭 Bắt đầu 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 Pamer, trong đó có chứa các thông tin đo lường kích thước của 3 loài chim cánh cụt:

  • Quai nón
  • Gentoo
  • Adelie

Đây là bài toán phân loại — mục tiêu là để dự đoán các loài chim cánh cụt dựa trên dữ liệu trong tập dữ liệu về Chim cánh cụt Palmer. Đâ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. Ảnh của @allisonhorst

 

Mã sau đây gọi hàm gấu trúc để tải tập dữ liệu Palmer birds 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 birds:

Bảng 3. 3 ví dụ đầu tiên về Chim cánh cụt Palmer

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

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

Ô chứa mã sau đây chia tập dữ liệu thành một bộ huấn luyện và tập 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

Đào tạo cây quyết định bằng siêu tham số mặc định

Bạn có thể huấn luyện cây quyết định đầu tiên của mình bằng thuật toán học CarT (Cây phân loại và hồi quy) (còn gọi là người học) mà không cần chỉ định bất kỳ siêu tham số nào. Đó là vì trình học ydf.CartLearner cung cấp các giá trị siêu tham số 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 này.

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

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

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

model.plot_tree()

Trong Colab, bạn có thể 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ư phân phối lớp ở mỗi nút.

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

Hình 17. Cây quyết định được huấn luyện bằng các siêu tham số 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 thử giá trị của bill_depth_mm. Bảng 4 và 5 cho thấy khả năng xuất hiện 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. Khả năng các loài khác nhau nếu bill_depth_mm ≥ 42.3

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

 

Bảng 5. Khả năng các loài khác nhau nếu bill_depth_mm < 42.3

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

bill_depth_mm là một tính năng dạng 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 tính năng số.

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

Đoạn mã sau đây cung cấp chương trình huấn luyện và kiểm tra độ chính xác 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

Tuy hiếm khi xảy ra nhưng có thể xảy ra trường hợp độ chính xác của hoạt động 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 hợp kiểm thử có thể khác với tập hợp huấn luyện. Tuy nhiên, đây không phải là trường hợp như vậy ở đây vì chuyến tàu và hoạt động kiểm thử được phân chia ngẫu nhiên. Một lời giải thích có thể xảy ra hơn là tập dữ liệu kiểm thử rất nhỏ (chỉ 72 ví dụ), vì vậy, việc ước tính độ chính xác không bị nhiễu.

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 tính năng xác thực chéo để 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 tôi sẽ tiếp tục huấn luyện và kiểm thử để đơn giản hoá.

Cải thiện siêu tham số 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ị siêu tham số mặc định. Để có được thông tin dự đoán chính xác hơn, bạn có thể:

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

  2. Hãy tối ưu hoá siêu tham số bằng cách sử dụng dữ liệu quan sát và tham chiếu của bạn. Hướng dẫn cải thiện mô hình có thể hữu ích cho bạn.

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

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

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

  • Có thể đã đạt đến số lượng mẫu tối thiểu cho mỗi lá (min_examples=5 theo mặc định).
  • Cây có thể đã được chia cắt và sau đó đã được cắt tỉa để tránh hiện tượng quá rộng.

Hãy 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()

Cây quyết định được huấn luyện bằng
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 thêm nhiều lần.

Để xem việc chia thêm nút có giá trị hay không, chúng tôi sẽ đá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 của phép kiểm thử thay đổi từ 0,9167 lên 0,97222. Bạn nên thay đổi siêu tham số này.

Rừng quyết định trước đây

Bằng cách tiếp tục cải thiện các siêu tham số, chúng tôi 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 hơn, chẳng hạn như một khu rừng ngẫu nhiên để xem mô hình đó có hoạt động tốt hơn hay không.

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

Khu rừng ngẫu nhiên có độ chính xác tốt hơn cái cây đơn giản của chúng ta. Bạn sẽ tìm hiểu lý do tại sao ở 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 đơn lẻ 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 độ 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à ít 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.
  • Dưới dạng đại diện cho việc diễn giải mô hình rừng quyết định mà khoá học này sẽ tìm hiểu ở phần sau.