自定义错误指标不更改预测XGBoost R

时间:2019-03-08 04:39:53

标签: python r xgboost

我创建了一个自定义错误度量标准,该度量标准在运行XGBoost xgb.train时显示,但实际上对输出没有任何影响。据我所知,它只是为该回合打印自定义错误度量,而没有使用它来确定准确性。

我认为这是因为预测输出与使用默认误差度量时的输出完全相同。我还尝试将错误输出硬编码为静态1,以便输出应该是随机的,但结果完全相同。

我需要创建一个自定义目标函数以使自定义错误度量有效吗?

谢谢!

我的代码:

# xgboost fitting with arbitrary parameters
xgb_params_1 = list(
  objective = "reg:linear",                                               
  eta = 0.2,                                                       
  max.depth = 6,                                                      
  booster =  "gbtree"   
)


evalerror <- function(preds, dtrain) {
  labels <- getinfo(dtrain, "label")


  score <- as.numeric((sum(preds[1:1000]) - sum(labels[1:1000] )) / sum(labels[1:1000]) ) 

  return(list(metric="custom_error",value=1))

}


myWatch <- list(val=dvalid,train=dtrain)
# fit the model with the arbitrary parameters specified above
xgb_1 = xgb.train(data = dtrain,
                params = xgb_params_1,
                nrounds = 150,                                            
                nthread = 6,
                verbose = T,                                         
                print_every_n = 50,
                watchlist = myWatch,
                early_stop_round = 1000,                                                    
                eval_metric = evalerror,
                disable_default_eval_metric = 1

)

# Perform a prediction
pred <- predict(xgb_1, dvalid)
results <- cbind(as.data.table(pred), as.data.table(data[year > trainEndDate,"total_installs"]))


#Compute test RMSE
sqrt(mean((results$pred - results$total_installs)**2))

打印的错误指标:

enter image description here

1 个答案:

答案 0 :(得分:1)

自定义eval_metric仅用于评估目的。它在每个回合中显示(使用手表时),对调整增强回合数很有用,并且在进行交叉验证以调整参数以最大化/最小化指标时可以使用它。我特别用它来调整学习速度,以使模型收敛更快,并减少回合。

自定义目标函数是完全不同的野兽,它与评估指标不同。它更像是模型的一种,例如分类,回归等。它推动了模型的收敛。如果您仍然需要,这里是xgboost regression objective的示例。