自定义 Objective 优化 Fscore 的函数 - XGBOOST
Custom Objective Function to optimize Fscore - XGBOOST
我正在尝试对具有不平衡 类(1% 的 1 和 99% 的零)的分类数据实施 xgboost
。
我正在使用 binary:logistic
作为分类的 objective 函数。
根据我对 xgboost
的了解 - 当提升开始构建树时,objective 函数会迭代优化,最终在所有树组合时实现最佳性能。
在我的数据中,由于 类 的不平衡,我面临 Accuracy Paradox 的问题。在模型的最后,我能够取得很好的 accuracy
但 很差 precision
和 recall
我想要一个可以优化模型的自定义 objective 函数和 return 具有最佳 f-score
的最终 xgboost 模型。或者我可以使用任何其他 objective 函数可以 return 最好 f-score
吗?
Where F-Score = (2 * Precision * Recall)/(Precision + Recall)
我不是这方面的专家,但我认为这个评估指标应该可以胜任:
f1score_eval <- function(preds, dtrain) {
labels <- getinfo(dtrain, "label")
e_TP <- sum( (labels==1) & (preds >= 0.5) )
e_FP <- sum( (labels==0) & (preds >= 0.5) )
e_FN <- sum( (labels==1) & (preds < 0.5) )
e_TN <- sum( (labels==0) & (preds < 0.5) )
e_precision <- e_TP / (e_TP+e_FP)
e_recall <- e_TP / (e_TP+e_FN)
e_f1 <- 2*(e_precision*e_recall)/(e_precision+e_recall)
return(list(metric = "f1-score", value = e_f1))
}
参考文献:
我正在尝试对具有不平衡 类(1% 的 1 和 99% 的零)的分类数据实施 xgboost
。
我正在使用 binary:logistic
作为分类的 objective 函数。
根据我对 xgboost
的了解 - 当提升开始构建树时,objective 函数会迭代优化,最终在所有树组合时实现最佳性能。
在我的数据中,由于 类 的不平衡,我面临 Accuracy Paradox 的问题。在模型的最后,我能够取得很好的 accuracy
但 很差 precision
和 recall
我想要一个可以优化模型的自定义 objective 函数和 return 具有最佳 f-score
的最终 xgboost 模型。或者我可以使用任何其他 objective 函数可以 return 最好 f-score
吗?
Where F-Score = (2 * Precision * Recall)/(Precision + Recall)
我不是这方面的专家,但我认为这个评估指标应该可以胜任:
f1score_eval <- function(preds, dtrain) {
labels <- getinfo(dtrain, "label")
e_TP <- sum( (labels==1) & (preds >= 0.5) )
e_FP <- sum( (labels==0) & (preds >= 0.5) )
e_FN <- sum( (labels==1) & (preds < 0.5) )
e_TN <- sum( (labels==0) & (preds < 0.5) )
e_precision <- e_TP / (e_TP+e_FP)
e_recall <- e_TP / (e_TP+e_FN)
e_f1 <- 2*(e_precision*e_recall)/(e_precision+e_recall)
return(list(metric = "f1-score", value = e_f1))
}
参考文献: