Pertanyaan mengimplementasikan fungsi tujuan kustom XGboost


Saya mencoba menerapkan fungsi tujuan kustom menggunakan XGboost (di R tapi saya juga menggunakan python sehingga umpan balik tentang python juga bagus).

Saya membuat fungsi yang meludahkan kembali gradien dan hessian (berfungsi dengan benar), tetapi ketika saya mencoba menjalankan xgb.train maka itu tidak berfungsi. Saya kemudian memutuskan untuk mencetak untuk setiap putaran prediksi, gradien dan hessian dalam urutan khusus ini. Ini adalah output (terus berulang sepanjang saya membiarkannya berjalan):

[1] 0 0 0 0 0 0 0 0 0 0

[1] -0.034106908 -0.017049339 -0.034106908 -0.034106908 -0.034106908   -0.034106908 -0.034106908 -0.004256162 -0.034106908 -0.008520554

[1] 0,003836107 0,004272548 0,003836107 0,003836107 0,003836107   0,003836107 0,003836107 0,004408935 0,003836107 0,004381658

[0] skor-kereta: 0 skor-val: 0

[1] 0 0 0 0 0 0 0 0 0 0

[1] -0.034106908 -0.017049339 -0.034106908 -0.034106908 -0.034106908   -0.034106908 -0.034106908 -0.004256162 -0.034106908 -0.008520554

[1] 0,003836107 0,004272548 0,003836107 0,003836107 0,003836107   0,003836107 0,003836107 0,004408935 0,003836107 0,004381658

[1] skor-kereta: 0 skor-val: 0

Kita dapat melihat bahwa bahkan jika gradien dan hessian tampak baik-baik saja, prediksi di setiap putaran tidak berubah !! Saya tidak mengerti mengapa itu terjadi. Jika ada yang mengalami masalah yang sama atau memiliki ide, silakan bagikan.

Kode yang saya gunakan adalah yang berikut tetapi saya tidak berpikir itu sangat membantu:

reg <- xgb.train(data        = xgb.DMatrix(data.matrix(train[1:10,feature.names]),label=train$Response[1:10]),
             nrounds     = 1000,
             obj = custom_obj,
             feval = evalerror,
             early.stop.round = 20,
             maximize = TRUE,
             watchlist = list(train = xgb.DMatrix(data.matrix(train[1:10,feature.names]),label=train$Response[1:10]),
                               val = xgb.DMatrix(data.matrix(cv[,feature.names]),label=cv$Response)),
             param = list(eta         = 0.5,
                          max_depth   = 10,
                          colsample_bytree=0.7,
                          min_child_weight=50,
                          subsample=0.7,
                          base_score = 4))

5
2018-01-17 16:57


asal


Jawaban: