Tầm quan trọng của biến tương đối cho việc tăng tốc


33

Tôi đang tìm kiếm một lời giải thích về tầm quan trọng của biến tương đối được tính toán trong Gradient Boosted Tree không quá chung chung / đơn giản như:

Các biện pháp dựa trên số lần một biến được chọn để phân tách, được cân bằng bởi sự cải thiện bình phương cho mô hình do kết quả của mỗi lần phân tách và tính trung bình trên tất cả các cây . [ Elith et al. 2008, Hướng dẫn làm việc để tăng cường cây hồi quy ]

Và đó là ít trừu tượng hơn:

tôij2^(T)= =Σt= =1J-1tôit2^1(vt= =j)

Trong đó phép tính tổng nằm trên các nút nonterminal của cây nút J -terminal T , v t là biến phân tách được liên kết với nút t^ i 2 t là sự cải thiện theo kinh nghiệm tương ứng trong lỗi bình phương do kết quả của sự phân tách, được xác định như tôi 2 ( R l , R r ) = w l w rtJTvtttôit2^, nơilà trái và bên phải phương tiện phản ứng con gái tương ứng, vàlà các tổng tương ứng của các trọng số. tôi2(Rtôi,Rr)= =wtôiwrwtôi+wr(ytôi¯-yr¯)2 wl,wrytôi¯,yr¯wtôi,wr[Friedman 2001, xấp xỉ chức năng tham lam: một máy tăng cường độ dốc]

Cuối cùng, tôi không thấy các yếu tố của học thống kê (Hastie et al. 2008) là một phần rất hữu ích được đọc ở đây, vì phần có liên quan (10.13.1 trang 367) có vị rất giống với tài liệu tham khảo thứ hai ở trên (có thể được giải thích bởi thực tế rằng Friedman là đồng tác giả của cuốn sách).

PS: Tôi biết các biện pháp quan trọng của biến tương đối được đưa ra bởi tóm tắt.gbm trong gói gbm R. Tôi đã cố gắng khám phá mã nguồn, nhưng dường như tôi không thể tìm thấy nơi tính toán thực sự diễn ra.

Điểm Brownie: Tôi đang tự hỏi làm thế nào để có được những mảnh đất này trong R.


Tôi vừa thêm một câu trả lời mới cho câu hỏi được liên kết về cách sắp xếp mức độ quan trọng của biến theo lớp có thể hữu ích stackoverflow.com/a/51952918/3277050
see24

Câu trả lời:


55

Tôi sẽ sử dụng mã sklearn , vì nó thường sạch hơn Rmã.

Đây là việc triển khai thuộc tính Feature_importances của GradientBoostingClassifier (Tôi đã xóa một số dòng mã cản trở các công cụ khái niệm)

def feature_importances_(self):
    total_sum = np.zeros((self.n_features, ), dtype=np.float64)
    for stage in self.estimators_:
        stage_sum = sum(tree.feature_importances_
                        for tree in stage) / len(stage)
        total_sum += stage_sum

    importances = total_sum / len(self.estimators_)
    return importances

Điều này là khá dễ hiểu. self.estimators_là một mảng chứa các cây riêng lẻ trong booster, vì vậy vòng lặp for đang lặp trên các cây riêng lẻ. Có một cú hích với

stage_sum = sum(tree.feature_importances_
                for tree in stage) / len(stage)

đây là chăm sóc của trường hợp phản ứng không nhị phân. Ở đây chúng tôi phù hợp với nhiều cây trong mỗi giai đoạn theo cách một đấu một. Về mặt khái niệm đơn giản nhất của nó là tập trung vào trường hợp nhị phân, trong đó tổng có một triệu và đây chỉ là một tree.feature_importances_. Vì vậy, trong trường hợp nhị phân, chúng ta có thể viết lại tất cả như

def feature_importances_(self):
    total_sum = np.zeros((self.n_features, ), dtype=np.float64)
    for tree in self.estimators_:
        total_sum += tree.feature_importances_ 
    importances = total_sum / len(self.estimators_)
    return importances

Vì vậy, trong các từ, tổng hợp các tính năng quan trọng của từng cây, sau đó chia cho tổng số cây . Vẫn còn để xem làm thế nào để tính toán các tính năng quan trọng cho một cây.

Tính toán quan trọng của một cây được thực hiện ở cấp độ cython , nhưng nó vẫn tuân theo. Đây là phiên bản đã được dọn sạch của mã

cpdef compute_feature_importances(self, normalize=True):
    """Computes the importance of each feature (aka variable)."""

    while node != end_node:
        if node.left_child != _TREE_LEAF:
            # ... and node.right_child != _TREE_LEAF:
            left = &nodes[node.left_child]
            right = &nodes[node.right_child]

            importance_data[node.feature] += (
                node.weighted_n_node_samples * node.impurity -
                left.weighted_n_node_samples * left.impurity -
                right.weighted_n_node_samples * right.impurity)
        node += 1

    importances /= nodes[0].weighted_n_node_samples

    return importances

Điều này khá đơn giản. Lặp lại thông qua các nút của cây. Miễn là bạn không ở một nút lá, hãy tính mức giảm độ tinh khiết của nút từ phần tách tại nút này và gán nó cho tính năng được tách trên

importance_data[node.feature] += (
    node.weighted_n_node_samples * node.impurity -
    left.weighted_n_node_samples * left.impurity -
    right.weighted_n_node_samples * right.impurity)

Sau đó, khi hoàn tất, chia tất cả cho tổng trọng lượng của dữ liệu (trong hầu hết các trường hợp, số lượng quan sát)

importances /= nodes[0].weighted_n_node_samples

Cần nhắc lại rằng tạp chất là tên gọi chung cho số liệu sử dụng khi xác định phân chia để tạo ra khi trồng cây. Trong ánh sáng đó, chúng tôi chỉ đơn giản là tóm tắt mức độ phân chia trên mỗi tính năng cho phép chúng tôi giảm tạp chất trên tất cả các phần tách trong cây.

Trong bối cảnh tăng cường độ dốc, các cây này luôn là các cây hồi quy (giảm thiểu lỗi bình phương tham lam) phù hợp với độ dốc của hàm mất.


Cảm ơn rất nhiều cho câu trả lời rất chi tiết này. Hãy để tôi có thời gian cẩn thận đi qua nó trước khi tôi chấp nhận nó.
Antoine

4
Mặc dù dường như các tiêu chí tạp chất khác nhau có thể được sử dụng, chỉ số Gini không phải là tiêu chí được Friedman sử dụng. Như đã đề cập trong câu hỏi của tôi và dòng 878 của liên kết thứ ba của bạn, Friedman đã sử dụng tiêu chí tạp chất lỗi bình phương trung bình với điểm số cải thiện . Nếu bạn có thể cập nhật phần này trong câu trả lời của bạn, điều đó sẽ rất tuyệt. Và vâng, bạn nói đúng, dường như các trọng số thực sự là số lượng quan sát.
Antoine

3
hoặc có thể nó sẽ làm cho câu trả lời của bạn tốt hơn nữa để giữ cả hai phần về chỉ số Gini và tiêu chí ban đầu của Friedman, nhấn mạnh rằng cái đầu tiên được sử dụng để phân loại và thứ hai là hồi quy?
Antoine

Antoine, cảm ơn vì bản cập nhật này. Thật sự hữu ích khi biết rằng lỗi bình phương trung bình là tiêu chí cải tiến được sử dụng cho cây hồi quy. Không rõ ràng làm thế nào mà nó sẽ được sử dụng để phân loại. Tuy nhiên, ngay cả trong việc tăng cường độ dốc để phân loại, tôi nghĩ rằng cây hồi quy vẫn đang được sử dụng, trái ngược với cây phân loại. Ít nhất là trong python, phân tích hồi quy đang được thực hiện đối với lỗi hiện tại ở mỗi giai đoạn tăng.
Khá Nerdy

Các bạn là chính xác về cây hồi quy.
Matthew Drury
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.