0
0
Lập trình
Admin Team
Admin Teamtechmely

Boruta: Thuật Toán Hiệu Quả Cho Lựa Chọn Đặc Trưng Trong Machine Learning

Đăng vào 3 tuần trước

• 5 phút đọc

Giới Thiệu Về Lựa Chọn Đặc Trưng

Lựa chọn đặc trưng (Feature Selection) là một bước quan trọng trong quy trình học máy (Machine Learning). Đối với một tập hợp lớn các đặc trưng, công việc của chúng ta là xác định những đặc trưng quan trọng và loại bỏ những đặc trưng không cần thiết. Điều này giúp đơn giản hóa mô hình và giảm thiểu nhiễu trong quá trình dự đoán.

Hiểu Về Thuật Toán Boruta

Boruta là một thuật toán mạnh mẽ được thiết kế để thực hiện lựa chọn đặc trưng một cách tự động trên một tập dữ liệu. Thuật toán này ban đầu được phát triển trên ngôn ngữ lập trình R, sau đó đã có phiên bản cho Python để người dùng dễ dàng áp dụng.

Trong bài viết này, chúng ta sẽ tìm hiểu cách thức hoạt động của thuật toán Boruta và cách triển khai nó. Việc cài đặt lại từ đầu sẽ giúp chúng ta có cái nhìn sâu sắc hơn về cách Boruta hoạt động.

Bắt Đầu Với Dữ Liệu

Để minh họa cho cách thuật toán Boruta hoạt động, chúng ta sẽ sử dụng một bộ dữ liệu giả định với ba đặc trưng: tuổi (age), chiều cao (height) và cân nặng (weight), cùng với một biến mục tiêu là thu nhập (income). Bộ dữ liệu này có 5 mẫu.

python Copy
import pandas as pd

X = pd.DataFrame({'age': [25, 32, 47, 51, 62],
                  'height': [182, 176, 174, 168, 181],
                  'weight': [75, 71, 78, 72, 86]})
y = pd.Series([20, 32, 45, 55, 61], name='income')

Mục tiêu của chúng ta là dự đoán thu nhập của một người dựa vào tuổi, chiều cao và cân nặng. Mặc dù điều này có vẻ không hợp lý theo lý thuyết (trái ngược với thực tế nơi chiều cao có liên quan đến mức thu nhập), nhưng điều này giúp chúng ta đặt ra một bài toán thú vị.

Trong thực tế, chúng ta thường phải làm việc với hàng trăm đến hàng nghìn đặc trưng, do đó việc duyệt tay qua từng đặc trưng để quyết định giữ hay loại bỏ là điều không khả thi. Chúng ta cần một thuật toán có thể tự động xác định giá trị dự đoán của từng đặc trưng.

Tại Sao Chọn Boruta?

Một trong những phương pháp phổ biến cho lựa chọn đặc trưng là sklearn.feature_selection.SelectFromModel. Phương pháp này hoạt động bằng cách chọn một mô hình phù hợp với dữ liệu (ví dụ, Random Forest) và sau đó xác định mức độ quan trọng của từng đặc trưng. Tuy nhiên, một điểm yếu của phương pháp này là việc xác định ngưỡng (threshold) để lựa chọn đặc trưng.

Boruta giải quyết vấn đề này với hai ý tưởng chính:

1. Shadow Features

Trong Boruta, các đặc trưng sẽ không cạnh tranh với nhau mà thay vào đó, chúng cạnh tranh với phiên bản ngẫu nhiên của chính mình. Đầu tiên, chúng ta tạo ra một dataframe mới bằng cách xáo trộn các đặc trưng trong X. Các đặc trưng này được gọi là shadow feature. Sau khi tạo ra shadow feature, chúng ta sẽ gắn chúng vào dataframe ban đầu để có một dataframe mới (gọi là X_boruta) với số cột gấp đôi số cột trong X.

python Copy
import numpy as np

np.random.seed(42)
X_shadow = X.apply(np.random.permutation)
X_shadow.columns = ['shadow_' + feat for feat in X.columns]
X_boruta = pd.concat([X, X_shadow], axis=1)

Sau đó, chúng ta sẽ tiến hành fit mô hình Random Forest vào X_borutay. Thông qua đây, chúng ta có thể so sánh mức độ quan trọng của các đặc trưng gốc với các shadow feature, từ đó xác định những đặc trưng nào có giá trị dự đoán vượt qua ngưỡng của các shadow feature.

2. Phân Phối Nhị Thức (Binomial Distribution)

Để tăng độ tin cậy của kết quả, chúng ta có thể lặp lại các thử nghiệm nhiều lần. Mỗi thử nghiệm độc lập với kết quả nhị phân (hit hoặc không hit) sẽ giúp tạo ra độ tin cậy cao hơn cho việc giữ lại các đặc trưng.

python Copy
hits = np.zeros((len(X.columns)))
for iter_ in range(20):
   np.random.seed(iter_)
   X_shadow = X.apply(np.random.permutation)
   X_boruta = pd.concat([X, X_shadow], axis=1)
   forest = RandomForestRegressor(max_depth=5, random_state=42)
   forest.fit(X_boruta, y)
   feat_imp_X = forest.feature_importances_[:len(X.columns)]
   feat_imp_shadow = forest.feature_importances_[len(X.columns):]
   hits += (feat_imp_X > feat_imp_shadow.max())

Chúng ta có thể sử dụng phân phối nhị thức để xác định xác suất giữ lại các đặc trưng. Thông qua đó, Boruta chia ra làm ba vùng:

  • Vùng từ chối: Các đặc trưng này được xem là nhiễu và nên loại bỏ.
  • Vùng thăm dò: Boruta không chắc chắn về các đặc trưng này.
  • Vùng chấp nhận: Các đặc trưng này được coi là hữu ích và nên giữ lại.

Sau 20 lần lặp lại, chúng ta có thể đưa ra quyết định dựa trên cơ sở thống kê:

  • Để dự đoán thu nhập, đặc trưng tuổi là quan trọng và cần được giữ lại, trong khi cân nặng chỉ là nhiễu và nên loại bỏ.
  • Boruta không rõ ràng về đặc trưng chiều cao, nên việc giữ hay loại bỏ tùy thuộc vào quan điểm và mục đích của người dùng.

Sử Dụng Boruta Trong Python

Để sử dụng thuật toán Boruta trong Python, bạn chỉ cần cài đặt thư viện thông qua pip:

bash Copy
!pip install boruta

Một đoạn mã mẫu để sử dụng thư viện Boruta là như sau:

python Copy
from boruta import BorutaPy
from sklearn.ensemble import RandomForestRegressor
import numpy as np

forest = RandomForestRegressor(n_jobs=-1, max_depth=5)
boruta = BorutaPy(estimator=forest, n_estimators='auto', max_iter=100)
boruta.fit(np.array(X), np.array(y))

green_area = X.columns[boruta.support_].to_list()
blue_area = X.columns[boruta.support_weak_].to_list()
print('Các đặc trưng trong vùng chấp nhận:', green_area)
print('Các đặc trưng trong vùng thăm dò:', blue_area)

Các đặc trưng được lưu trong boruta.support_ là những đặc trưng đáng tin cậy và có thể sử dụng trong mô hình. Những đặc trưng trong boruta.support_weak_ là những đặc trưng không rõ ràng và nên cân nhắc kỹ trước khi đưa vào mô hình.

Kết Luận

Lựa chọn đặc trưng là một phần không thể thiếu trong quy trình học máy. Sự thận trọng trong việc lựa chọn có thể dẫn đến việc giữ lại các đặc trưng không cần thiết, trong khi sự lạc quan có thể khiến chúng ta loại bỏ những thông tin có giá trị. Bài viết này đã trình bày cách sử dụng thuật toán Boruta để thực hiện lựa chọn đặc trưng một cách mạnh mẽ và có cơ sở thống kê trên tập dữ liệu, từ đó giúp bạn cải thiện hiệu suất của các mô hình dự đoán trong thực tế.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào