我使用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相同的精度,但是事实并非如此。我在做什么错了?
答案 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
以自动选择迭代。