implementar la función objective personalizada XGboost

Estoy tratando de implementar una función objective personalizada utilizando XGboost (en R, pero también uso python, por lo que cualquier comentario sobre python también es bueno).

Creé una función que devuelve gradiente y arpillera (funciona correctamente), pero cuando bash ejecutar xgb.train, entonces no está funcionando. Entonces decidí imprimir para cada ronda las predicciones, gradiente y arpillera en este orden específico. Esta es la salida (se repite mientras lo dejo correr):

[1] 0 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] puntuación de tren: 0 puntuación de val: 0

[1] 0 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] puntuación de tren: 0 puntuación de val: 0

Podemos ver que incluso si el gradiente y la arpillera parecen estar bien, ¡las predicciones en cada ronda no cambian! No entiendo por qué ese es el caso. Si alguien se encontró con el mismo problema o tiene una idea, por favor comparta.

El código que uso es el siguiente, pero no creo que sea muy útil:

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))