我试图在二进制分类设置中训练XGBOOST,以1:5的比例对正负实例进行训练。我的数据与癌症检测类似,即FNs比FPs昂贵得多。经过相当多的阅读,我仍然对以下几点感到困惑:
首先,我有必要通过过度抽样来平衡班级吗?我的数据大小约为160,000,许多条目包含特定列的NaN。特别是关于XGBOOST,我知道调整scale_pos_weight是很常见的,但是文档(tuning.html)指出,这主要是为了整体的AUC性能。我关心的主要指标是回忆,但在一定程度上也是准确的。
第二,在超参数调优中,我应该尝试最大限度地利用什么度量?
谢谢你的帮助。
发布于 2021-08-03 12:43:44
FNs比FPs贵得多。
您可以根据对假阴性和假阳性成本的估算来创建自己的目标函数。文档是这里,下面是您可以从中获得灵感的示例:
from sklearn.metrics import confusion_matrix
def your_objective(predt: np.ndarray, dtrain: xgb.DMatrix) -> Tuple[str, float]:
y = (dtrain.get_label() > 0.5) * 1
tn, fp, fn, tp = confusion_matrix(y, predt).ravel()
your_gain = true_positive_cost * tp - false_positive_cost * fp
max_gain = true_positive_cost * (fn + tp)
result = your_gain / max_gain
return 'your_objective', result
xgb.train(your_params,
dtrain=dtrain,
num_boost_round=10,
obj='binary:hinge',
feval=your_objective,
evals=[(dtrain, 'dtrain'), (dtest, 'dtest')],
evals_result=results)您只需要定义true_positive_cost和false_positive_cost。是的,根据scale_pos_weight中类的比例,使用dtrain执行类的调整。
https://stackoverflow.com/questions/68627235
复制相似问题