CatBoost精度不平衡类

时间:2019-01-30 09:51:07

标签: machine-learning scikit-learn catboost

我使用CatBoostClassifier,并且我的课程非常不平衡。我应用了scale_pos_weight参数来解决这个问题。在使用评估数据集(测试)进行训练时,CatBoost显示出测试的高精度。但是,当我使用预测方法对测试进行预测时,只能得到较低的精度得分(使用sklearn.metrics计算得出)。

我认为这可能与我应用的课程权重有关。但是,我不太了解精度分数如何受到影响。

params = frozendict({
    'task_type': 'CPU',
    'loss_function': 'Logloss',
    'eval_metric': 'F1', 
    'custom_metric': ['F1', 'Precision', 'Recall'],
    'iterations': 100,
    'random_seed': 20190128,
    'scale_pos_weight': 56.88657244809081,
    'learning_rate': 0.5412829495147387, 
    'depth': 7, 
    'l2_leaf_reg': 9.526905230698302
})

from catboost import CatBoostClassifier
model = cb.CatBoostClassifier(**params)
model.fit(
    X_train, y_train,
    cat_features=np.where(X_train.dtypes == np.object)[0],
    eval_set=(X_test, y_test),
    verbose=False,
    plot=True
)

model.get_best_score()
{'learn': {'Recall': 0.9243007537531925,
  'Logloss': 0.15892360013680026,
  'F1': 0.9416723809244181,
  'Precision': 0.9640191600545249},
 'validation_0': {'Recall': 0.914252301192093,
  'Logloss': 0.1714387314107052,
  'F1': 0.9357892623978286,
  'Precision': 0.9642642597943112}}

y_test_pred = model.predict(data=X_test)

from sklearn.metrics import balanced_accuracy_score, recall_score, precision_score, f1_score
print('Balanced accuracy: {:.2f}'.format(balanced_accuracy_score(y_test, y_test_pred)))
print('Precision: {:.2f}'.format(precision_score(y_test, y_test_pred)))
print('Recall: {:.2f}'.format(recall_score(y_test, y_test_pred)))
print('F1: {:.2f}'.format(f1_score(y_test, y_test_pred)))

Balanced accuracy: 0.94
Precision: 0.29
Recall: 0.91
F1: 0.44

我希望在训练时能达到与CatBoost相同的精度,但是事实并非如此。我在做什么错了?

2 个答案:

答案 0 :(得分:0)

预测函数使用标准阈值0.5将预测的概率转换为二进制值。当您处理不平衡问题时,阈值0.5并不总是最好的值,这就是为什么在测试集上精度会很差的原因。

为了找到更好的阈值,catboost提供了一些方法来帮助您做到这一点,例如get_roc_curve,get_fpr_curve,get_fnr_curve。这三种方法可以通过更改预测阈值来帮助您可视化真实的阳性,假阳性和假阴性率。

除了这些可视化方法外,catboost还具有一种名为select_threshold的方法,该方法可以优化一条曲线,从而为您提供最佳阈值。

您可以在他们的documentation上进行检查。

答案 1 :(得分:0)

默认 use_weights 设置为 True ,这意味着向评估指标添加权重,例如Precision:use_weights=True, 为了让你自己的精度计算器和他的一样,改成精度:use_weights=False

此外,get_best_score 给出了迭代的最高分数,您需要指定在预测中使用哪个迭代。您可以在 use_best_model=True 中设置 model.fit 以自动选择迭代。