2016-12-19 21 views
5

Trong this section các tài liệu trên dốc thúc đẩy, nó nóiScikitlearn thực hiện tìm kiếm dòng như thế nào?

Gradient Đẩy mạnh nỗ lực để giải quyết vấn đề giảm thiểu này bằng số qua gốc nhanh nhất: Hướng gốc nhanh nhất là gradient tiêu cực của hàm tổn thất đánh giá ở các mô hình hiện tại F_ {m-1} có thể được tính toán cho bất kỳ chức năng mất khả vi:

enter image description here

đâu bước lengt h \ gamma_m được chọn sử dụng tìm kiếm dòng:

enter image description here

tôi hiểu mục đích của việc tìm kiếm dòng, nhưng tôi không hiểu các thuật toán riêng của mình. Tôi đọc qua số source code nhưng vẫn không nhấp. Một lời giải thích sẽ được nhiều đánh giá cao.

+0

Câu hỏi của bạn là nhiều hơn về chính thuật toán Tăng cường Gradient hoặc triển khai sklearn? Bạn có thể xem phần giới thiệu wekipedia (https://en.wikipedia.org/wiki/Gradient_boosting) để biết thêm chi tiết về thuật toán. – hsc

+1

@hsc Sẽ hữu ích hơn nếu bạn đã tham khảo [bài viết wikipedia trên Tìm kiếm dòng] (https://en.wikipedia.org/wiki/Line_search). Tôi đã đọc cả hai bài báo nhiều lần. (Tôi thực sự có một nắm bắt khá tốt về tăng cường gradient vào thời điểm này với tìm kiếm dòng là mảnh duy nhất thoát khỏi tôi.) – Ben

+1

Có lẽ http://stats.stackexchange.com là phù hợp hơn cho câu hỏi này – Sentry

Trả lời

0

Việc triển khai tùy thuộc vào chức năng mất mà bạn chọn khi khởi tạo trường hợp GradientBoostingClassifier (sử dụng ví dụ này, phần hồi quy phải giống nhau). Hàm mất mát mặc định là 'deviance' và thuật toán tối ưu hóa tương ứng được triển khai here. Trong hàm _update_terminal_region, một phép lặp Newton đơn giản được thực hiện chỉ với một bước.

Đây có phải là câu trả lời bạn muốn không?

0

Tôi nghi ngờ điều bạn thấy khó hiểu là: bạn có thể thấy nơi scikit-learn tính toán độ dốc âm của hàm mất và khớp với một ước lượng cơ sở cho gradient âm đó. Dường như phương pháp _update_terminal_region có trách nhiệm tìm ra kích thước bước, nhưng bạn không thể thấy bất kỳ nơi nào có thể giải quyết vấn đề giảm thiểu tìm kiếm dòng như được viết trong tài liệu.

Lý do bạn không thể tìm thấy một tuyến tìm kiếm xảy ra là, đối với trường hợp đặc biệt của các biến hồi quy cây quyết định, đó chỉ là các hàm hằng số piecewise, giải pháp tối ưu thường được biết. Ví dụ, nếu bạn nhìn vào phương pháp _update_terminal_region của hàm mất LeastAbsoluteError, bạn thấy rằng các lá của cây được cho giá trị của trung bình trọng số của sự khác biệt giữa y và giá trị được dự đoán cho các ví dụ mà lá đó có liên quan . Trung bình này là giải pháp tối ưu đã biết.

Để tóm tắt những gì đang xảy ra, đối với mỗi gradient descent lặp các bước sau đây được thực hiện:

  1. Tính gradient tiêu cực của hàm tổn thất tại các dự đoán hiện nay.

  2. Phù hợp với DecisionTreeRegressor với độ dốc âm. Phụ kiện này tạo ra một cây có phân chia tốt để giảm tổn thất.

  3. Thay thế giá trị tại các lá của DecisionTreeRegressor bằng các giá trị giảm thiểu tổn thất. Chúng thường được tính từ một số công thức đơn giản đã biết, lợi dụng thực tế là cây quyết định chỉ là một hàm hằng số piecewise.

Phương pháp này ít nhất phải được mô tả trong tài liệu, nhưng tôi nghĩ trong một số trường hợp có thể không giống với nó.

0

Từ nhận xét của bạn có vẻ như thuật toán chính nó không rõ ràng và không phải là cách scikitlearn thực hiện nó.

Ký hiệu trong bài viết wikipedia hơi cẩu thả, không đơn giản là phân biệt bởi hàm được đánh giá tại một điểm. Một khi bạn thay thế F_{m-1}(x_i) với \hat{y_i} và thay thế đạo hàm riêng với một đạo hàm riêng đánh giá ở \hat{y}=F_{m-1}(x) mọi thứ trở nên rõ ràng hơn:

enter image description here

Điều này cũng sẽ loại bỏ x_{i} (loại) từ vấn đề giảm thiểu và cho thấy mục đích tìm kiếm dòng - để tối ưu hóa tùy thuộc vào dự đoán hiện tại và không phụ thuộc vào tập huấn luyện. Bây giờ, hãy chú ý rằng:

enter image description here

Do đó bạn chỉ cần giảm thiểu:

enter image description here

Vì vậy, tìm kiếm dòng đơn giản tối ưu hóa một mức độ tự do bạn đã (một khi bạn đã tìm thấy gradient đúng hướng) - kích thước bước.

Các vấn đề liên quan