Пользовательская функция оценки XGBoost, вызывающая «не может принудить замыкание типа к вектору типа» - PullRequest
1 голос
/ 22 апреля 2020

Я пробовал несколько разных вещей, но не могу избавиться от этого сообщения об ошибке. Не вижу, чем мой код отличается от многих других сценариев.

y_train = train$y
train$y = c()
train= as.matrix(train)

train = xgb.DMatrix(data = train, label = y_train)

MSE = function(yhat,train){

   y = getinfo(train, "label")
   err = mean((y-yhat)^2)
   return(list(metric = "RMSE", value = err))

}

params = list(
  eta = 0.1,
  max_depth = 3,
  tweedie_variance_power = 1.5,
  objective = "reg:tweedie",
  feval = MSE
)

model = xgb.cv(
  data = train,
  nfold = 3,
  params = params,
  nrounds = 2000
)

Я получаю следующую ошибку:

  Error in as.character(x) : 
  cannot coerce type 'closure' to vector of type 'character'

Я считаю трассировку немного странной (см. Ниже). Я использую пользовательские сгибы, и xgb.cv запускается, если я удаляю fevl и вместо этого использую встроенный nloglike eval metri c.

  > traceback()
  7: FUN(X[[i]], ...)
  6: lapply(p, function(x) as.character(x)[1])
  5: `xgb.parameters<-`(`*tmp*`, value = params)
  4: xgb.Booster.handle(params, list(dtrain, dtest))
  3: FUN(X[[i]], ...)
  2: lapply(seq_along(folds), function(k) {
   dtest <- slice(dall, folds[[k]])
   dtrain <- slice(dall, unlist(folds[-k]))
   handle <- xgb.Booster.handle(params, list(dtrain, dtest))
   list(dtrain = dtrain, bst = handle, watchlist = list(train = dtrain, 
       test = dtest), index = folds[[k]])
   })
  1: xgb.cv(data = train, folds = folds, params = params, nrounds = 2000)

Есть предложения?

1 Ответ

0 голосов
/ 22 апреля 2020

Для того, что вам нужно, передача в параметрах через metri c будет работать:

MSE = function(yhat,train){
   y = getinfo(train, "label")
   err = mean((y-yhat)^2)
   return(list(metric = "MSEerror", value = err))
}
params = list(
  eta = 0.1,
  max_depth = 3,
  tweedie_variance_power = 1.5,
  objective = "reg:tweedie",
eval_metric = MSE
)

Используя пример:

library(xgboost)
train = mtcars
colnames(train)[1] = "y"
y_train = train$y
train$y = c()
train= as.matrix(train)
train = xgb.DMatrix(data = train, label = y_train)

model = xgb.cv(
  data = train,
  nfold = 3,
  params = params,
  nrounds = 2000
)

head(model$evaluation_log)
   iter train_MSEerror_mean train_MSEerror_std test_MSEerror_mean
1:    1            415.5046           20.92919           416.7119
2:    2            410.6576           20.78001           411.8646
3:    3            404.9321           20.59901           406.1391
4:    4            398.2114           20.38003           399.4192
5:    5            390.3808           20.11609           391.5902
6:    6            381.3338           19.79950           382.5464
   test_MSEerror_std
1:          62.18317
2:          61.77277
3:          61.28819
4:          60.71951
5:          60.05671
6:          59.29019

Есть что-то странное в прохождении через него params (вы можете попробовать за пределами params, это будет работать), может обновить позже, когда я увижу, как это передается.

...