与使用自定义目标优化相比,针对 Brier 目标函数进行优化直接给出更差的 Brier 分数 - 它告诉我什么?

数据挖掘 xgboost 机器学习模型 优化 目标函数
2021-09-17 15:08:45

我正在训练一个 XGBoost 模型,因为我最关心的是结果概率,而不是分类本身,所以我选择了 Brier 分数作为我的模型的指标,以便对概率进行很好的校准。GridSearchCV我使用和brier_score_loss作为度量来调整我的超参数。以下是调整步骤的示例:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=123)

model = XGBClassifier(learning_rate=0.1, n_estimators=200, gamma=0, subsample=0.8, colsample_bytree=0.8, scale_pos_weight=1, verbosity=1, seed=0)
parameters = {'max_depth': [3, 5, 7], 
              'min_child_weight': [1, 3, 5]}
gs = GridSearchCV(model, parameters, scoring='brier_score_loss', n_jobs=1, cv=cv)
gs_results = gs.fit(X_train, y_train)

最后,我通过两种方式使用选择的超参数训练我的主模型:

优化自定义目标 -brier使用自定义brier_error函数作为指标

model = XGBClassifier(obj=brier, learning_rate=0.02, n_estimators=2000, max_depth=5, 
                      min_child_weight=1, gamma=0.3, reg_lambda=20, subsample=1, colsample_bytree=0.6, 
                          scale_pos_weight=1, seed=0, disable_default_eval_metric=1)
model1.fit(X_train, y_train, eval_metric=brier_error, eval_set=[(X_train, y_train), (X_test, y_train)],
          early_stopping_rounds=100)
y_proba1 = model1.predict_proba(X_test)[:, 1]
brier_score_loss(y_test, y_proba1) # 0.005439
roc_auc_score(y_test, y_proba1) # 0.8567

优化默认值binary:logisticauc作为评估指标

model2 = XGBClassifier(learning_rate=0.02, n_estimators=2000, max_depth=5, 
                      min_child_weight=1, gamma=0.3, reg_lambda=20, subsample=1, colsample_bytree=0.6, 
                          scale_pos_weight=1, seed=0, disable_default_eval_metric=1)
model2.fit(X_train, y_train, eval_metric='auc', eval_set=[(X_train, y_train), (X_test, y_train)],
          early_stopping_rounds=100)
y_proba2 = model2.predict_proba(X_test)[:, 1]
brier_score_loss(y_test, y_proba2) # 0.004914
roc_auc_score(y_test, y_proba2) # 0.8721

我希望 Brier 得分会更低,model1因为我们直接针对它进行了优化,但显然情况并非如此(见上面的结果)。它告诉我什么?优化荆棘是否更难?我应该使用更多的增强轮吗?(尽管这是使用带有brier_score_loss...的网格搜索找到的)它是否可以以某种方式解释但数据分布?(例如,如果课程不平衡或类似情况可能会出现这样的问题?)我不知道这种情况来自哪里,但可能是有原因的。

2个回答

Brier 评分对于非常罕见或非常频繁的事件具有已知的缺点。

二元逻辑回归目标函数在罕见或频繁事件发生率方面比 Brier 评分相对更稳健。

两个目标函数之间的性能差异可能是由于数据集中的事件频率造成的。

您可以尝试优化 Brier 分数的一件事,通常是在 Kaggle 比赛中完成。优化另一个损失并使用 Brier 分数提前停止。

一个例子是最小化经典的二元逻辑损失和每次迭代绘制 Brier 分数。

二元逻辑函数将继续最小化,但 Brier 不必如此。在某些时候,Brier 可能会开始增加,并且当您停止训练而不是基于二元分类结果时。

你可以使用不同的损失函数来执行这个实验,看看哪个表现更好。

这里有一些关于提前停止的链接:

https://ai.stackexchange.com/questions/16/what-is-early-stopping-in-machine-learning

https://www.kaggle.com/vincentf/early-stopping-for-xgboost-python

是否可以更改 Keras 中 Early Stopping 回调使用的指标?