class 不平衡的交叉验证
Cross-validation with class imbalance
我正在尝试在二元分类设置中训练 XGBOOST,正例与负例的比例为 1:5。我的数据与癌症检测类似,即 FN 比 FP 昂贵得多。经过大量阅读,我仍然对以下内容感到困惑:
首先,我是否有必要通过过度采样来平衡 类?我的数据大小约为 160,000,其中许多条目的某些列包含 NaN。特别是关于 XGBOOST,我知道调整 scale_pos_weight
很常见,但文档 (https://xgboost.readthedocs.io/en/latest/tutorials/param_tuning.html) 指出这主要是为了整体 AUC 性能。我关心的主要指标是召回率,但也有一定程度的准确性。
其次,我应该在超参数调整中尝试最大化什么指标?
感谢您的帮助。
FNs are much more costly than FPs
您可以根据对假阴性和假阳性成本的一些估计来创建自己的 objective 函数。文档是here,这里是你可以得到启发的例子:
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
。
是的,请根据 dtrain
.
中 类 的比率对 类 和 scale_pos_weight
进行调整
我正在尝试在二元分类设置中训练 XGBOOST,正例与负例的比例为 1:5。我的数据与癌症检测类似,即 FN 比 FP 昂贵得多。经过大量阅读,我仍然对以下内容感到困惑:
首先,我是否有必要通过过度采样来平衡 类?我的数据大小约为 160,000,其中许多条目的某些列包含 NaN。特别是关于 XGBOOST,我知道调整 scale_pos_weight
很常见,但文档 (https://xgboost.readthedocs.io/en/latest/tutorials/param_tuning.html) 指出这主要是为了整体 AUC 性能。我关心的主要指标是召回率,但也有一定程度的准确性。
其次,我应该在超参数调整中尝试最大化什么指标?
感谢您的帮助。
FNs are much more costly than FPs
您可以根据对假阴性和假阳性成本的一些估计来创建自己的 objective 函数。文档是here,这里是你可以得到启发的例子:
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
。
是的,请根据 dtrain
.
scale_pos_weight
进行调整