Độ lệch Poisson (xgboost vs gbm vs hồi quy)


7

Tôi muốn biết đó là biểu thức sai lệch trong hồi quy poisson bằng xgboostcông cụ (tăng cường độ dốc cực độ).

Theo mã nguồn, chức năng đánh giá là:

struct EvalPoissonNegLogLik : public EvalEWiseBase {

const char *Name() const override {

return "poisson-nloglik";

}

inline bst_float EvalRow(bst_float y, bst_float py) const {

const bst_float eps = 1e-16f;

if (py < eps) py = eps;

return common::LogGamma(y + 1.0f) + py - std::log(py) * y;

}

}

Vì vậy, độ lệch (trong R) phải là một cái gì đó như:

poisson_deviance <- function(y, py, eps) {

mean(LogGamma(y + 1.0f) + pmax(py, eps) - log(pmax(py, eps)) * y);

}

Tôi có hai câu hỏi ở đây:

1) Làm thế nào LogGammađể dịch sang R?. Tôi đã tìm thấy một số liên kết googling 'loggamma' và dường như mỗi ngôn ngữ hiểu các biểu thức khác nhau cho thuật ngữ này.

2) Làm gì với phơi sáng? Tôi biết chúng ta cần đặt thành xgbMatrix bằng cách sử dụng:

setinfo(xgbMatrix, "base_margin", log(exposure))

Nhưng trong mã của EvalPoissonNegLogLiktôi không bao giờ thấy phần bù nữa, vì vậy điều tôi trừ là điều duy nhất chúng ta cần là thêm phần log(exposure)dự đoán:

poisson_deviance <- function(y, py, exposure, eps) {

mean(LogGamma(y + 1.0f) + pmax(py + log(exposure), eps) - log(pmax(py + 

log(exposure), eps)) * y);

}

Công thức lệch được sử dụng bởi gbmgói R tăng cường độ dốc cho hồi quy poisson là:

poisson_deviance <- function(y, py) {mean(y*py - exp(py))}

(giới hạn pyepsquá)

Như bạn có thể thấy trong trang cuối của tài liệu này :

Được gbmxgboostsử dụng cùng một lỗi cho hồi quy poisson? Biểu hiện của sự lệch lạc này có vẻ khác với những gì được sử dụng trong xgboost.

Cuối cùng, công thức sai lệch trong hồi quy poisson theo B.5.3 ở đây phải là:

2 * mean(y * log(y / py) - (y - py))

đó là công thức khác nhau.

Tôi sẽ đánh giá cao bất kỳ trợ giúp để hiểu lý do tại sao cả hai gbmxgboostsử dụng công thức lệch lạc khác.

Câu trả lời:


9

Nó không được ghi chép tốt, nhưng tôi đã kiểm tra mã nguồn cho xgboost và tôi đã xác định các mục sau cho mục tiêu đếm: poisson:

  1. Nó sử dụng khả năng Poisson với một liên kết nhật ký.
  2. Các base_margintham số là trên quy mô tuyến tính, không phải là quy mô đáp ứng. Khi các vòng tăng tiến triển, cây mới cũng được thêm vào trên quy mô tuyến tính.
  3. Công thức khả năng ghi nhật ký âm xgboost Poisson là chính xác, nhưng nó hơi khác so với độ lệch Poisson. Tuy nhiên, khả năng và sai lệch của bản ghi âm rất gần nhau và không có triệu chứng tương đương với hệ số 2.
  4. Thiết base_marginđể log(exposure)tương đương với trong đó có một log(exposure)hạn bù đắp.

Chi tiết hơn một chút về những điểm này:

LogGamma là logarit của hàm gamma, là phần mở rộng liên tục của giai thừa. Đặc biệt,Γ(n)=(n1)! cho số nguyên n. Như vậy , LogGamma(y + 1) = factorial(y). Thuật ngữ LogGamma đại diện cholog(y!)thuật ngữ trong khả năng đăng nhập Poisson đầy đủ. (Thuật ngữ này thường được bỏ qua từ biểu thức khả năng đăng nhập, vì nó không ảnh hưởng đến việc tối ưu hóa.)

Theo xấp xỉ của Stirling, log(y!)ylog(y)y. Thay thế LogGamma bằng phép tính gần đúng này và thay thế py=exp(p)(tức là thay thế bộ dự báo tuyến tính bằng giá trị trung bình thông qua liên kết nhật ký) y * log(y / py) - (y - py). Đây gần như là độ lệch Poisson tiêu chuẩn, ngoại trừ việc thiếu yếu tố 2.

Công thức bạn tìm thấy cho GBM không phải là độ lệch Poisson tiêu chuẩn, mặc dù nó giống với hằng số phụ gia (phụ thuộc y). Một cách khó hiểu, pytrong công thức GBM của bạn thực sự là dự đoán tỷ lệ tuyến tính, không phải thang đo phản hồi, trong khi trong các công thức khác pylà phản hồi, giá trị trung bình dự đoán của y.

Bạn không cần thêm log(exposure)vào công thức khách quan. Tất cả bạn cần làm là thiết lập base_margin=log(exposure). Điều này đảm bảo rằng thuật ngữ tổng đầu tiên trong chuỗi tăng là log(exposure). Các vòng tăng sau đó thêm nhiều điều khoản hơn nhưng phần bù ban đầu không bao giờ bị xóa hoặc thay đổi.

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.