是什么导致 Catboost.select_features 图中显示的指标与拟合最终模型的实际预测之间存在差异?

What is causing this discrepancy between the metric displayed at Catboost.select_features's plot and the actual predictions of the fitted final model?

我正在使用 Catbost 执行特征选择。这是训练代码:

# Parameter grid
params = {
            'auto_class_weights': 'Balanced',
            'boosting_type': 'Ordered',
            'thread_count': -1,
            'random_seed': 24,
            'loss_function': 'MultiClass',
            'eval_metric': 'TotalF1:average=Macro',
            'verbose': 0,
            'classes_count': 3,
            'num_boost_round':500,
            'early_stopping_rounds': EARLY_STOPPING_ROUNDS
          }

# Datasets 
train_pool = Pool(train, y_train)
test_pool = Pool(test, y_test)
# Model Constructor
ctb_model = ctb.CatBoostClassifier(**params)
# Run feature selection
summary = ctb_model.select_features(
    train_pool,
    eval_set=test_pool,
    features_for_select='0-{0}'.format(train.shape[1]-1),
    num_features_to_select=10,
    steps=1,
    algorithm=EFeaturesSelectionAlgorithm.RecursiveByShapValues,
    shap_calc_type=EShapCalcType.Exact,
    train_final_model=True,
    logging_level='Silent',
    plot=True
)

运行结束后,显示如下图:

很明显,根据该图,评估指标为 TotalF1,平均值为 macro,模型的最佳迭代达到 0.6153 作为该指标的最佳分数。根据 documentation,当 train_final_model 参数设置为 True 时,最终使用在特征选择过程中为指定评估指标给出最佳分数的所选特征拟合模型,因此当使用拟合模型进行预测和评估时,人们会期望得到相同的结果。然而,事实并非如此。

当运行宁:

from sklearn.metrics import f1_score
predictions = ctb_model.predict(test[summary['selected_features_names']], prediction_type='Class')
f1_score(y_test, predictions, average='macro')

我得到的结果是:

0.41210319323424227

差异很大,我不知道是什么导致了这种差异。

如何解决这个问题?

可以在以下位置找到此问题的解决方案:CatBoost precision imbalanced classes

设置 sklearn f1_score() 的参数 sample_weights 后,我得到了与 Catboost 相同的 F1 分数。