我正在训练一个 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:logistic
并auc
作为评估指标
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
...的网格搜索找到的)它是否可以以某种方式解释但数据分布?(例如,如果课程不平衡或类似情况可能会出现这样的问题?)我不知道这种情况来自哪里,但可能是有原因的。