Làm thế nào để sử dụng gốc quyết định như người học yếu trong Adaboost?


11

Tôi muốn triển khai Adaboost bằng Quyết định gốc. Có đúng không khi đưa ra nhiều quyết định như các tính năng của tập dữ liệu của chúng tôi trong mỗi lần lặp của Adaboost?

Ví dụ: nếu tôi có một tập dữ liệu với 24 tính năng, tôi có nên có 24 trình phân loại gốc quyết định trong mỗi lần lặp không? Hoặc tôi nên chọn ngẫu nhiên một số tính năng và tạo phân loại trên chúng thay vì tất cả các tính năng?

Câu trả lời:


11

Cách điển hình để huấn luyện Cây quyết định (1 cấp) là tìm một thuộc tính như vậy mang lại sự phân chia thuần túy nhất. Tức là nếu chúng tôi chia tập dữ liệu của chúng tôi thành hai tập con, chúng tôi muốn các nhãn bên trong các tập hợp con này càng đồng nhất càng tốt. Vì vậy, nó cũng có thể được xem là xây dựng nhiều cây - một cây cho mỗi thuộc tính - và sau đó chọn cây tạo ra sự phân chia tốt nhất.

Trong một số trường hợp, cũng có ý nghĩa khi chọn một tập hợp con các thuộc tính và sau đó huấn luyện cây trên tập hợp con. Ví dụ, điều này được sử dụng trong Rừng ngẫu nhiên để giảm mối tương quan giữa các cây riêng lẻ.

Nhưng khi nói đến AdaBoost, thông thường là đủ để đảm bảo rằng trình phân loại cơ sở có thể được đào tạo về các điểm dữ liệu được cân nhắc và việc lựa chọn tính năng ngẫu nhiên ít quan trọng hơn. Cây quyết định có thể xử lý trọng lượng (xem ví dụ ở đây hoặc ở đây ). Nó có thể được thực hiện bằng cách đánh giá sự đóng góp của từng điểm dữ liệu vào tổng tạp chất của tập hợp con.

Để tham khảo, tôi cũng sẽ thêm triển khai AdaBoost của mình bằng python bằng cách sử dụng numpy và sklearnDecisionTreeClassifier với max_depth=1:

# input: dataset X and labels y (in {+1, -1})
hypotheses = []
hypothesis_weights = []

N, _ = X.shape
d = np.ones(N) / N

for t in range(num_iterations):
    h = DecisionTreeClassifier(max_depth=1)

    h.fit(X, y, sample_weight=d)
    pred = h.predict(X)

    eps = d.dot(pred != y)
    alpha = (np.log(1 - eps) - np.log(eps)) / 2

    d = d * np.exp(- alpha * y * pred)
    d = d / d.sum()

    hypotheses.append(h)
    hypothesis_weights.append(alpha)

Để dự đoán các nhãn:

# X input, y output
y = np.zeros(N)
for (h, alpha) in zip(hypotheses, hypotheses_weight):
    y = y + alpha * h.predict(X)
y = np.sign(y)

Cảm ơn. Là gốc cây quyết định được sử dụng như một phần (như một thuật toán cây quyết định) với độ sâu tối đa 1? Ý tôi là tôi nên chọn một thuộc tính ngẫu nhiên hay cây nên phân chia dựa trên một tiêu chí cụ thể như Chỉ số Gini? @AlexeyGrigorev
Pegah

Stump gốc = 1-rule = cây quyết định có một nút (với độ sâu tối đa 1). Bạn nên chọn phân chia dựa trên một số biện pháp tạp chất, ví dụ, dựa trên chỉ số Gini.
Alexey Grigorev

Cảm ơn câu trả lời chi tiết này!
xsari3x
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.