如何在 CatBoostClassifier.fit() 之后获取评估指标?

How to fetch the evaluation metric after a CatBoostClassifier.fit()?

我训练了一个分类模型调用CatBoostClassifier.fit(),还提供了一个eval_set

现在,如何获取评估指标的最佳值,以及在训练期间达到的迭代次数?我可以通过在对 fit() 的调用中设置 plot=True 来绘制信息,但是如何将其分配给变量?

我可以在训练模型调用 cv() 时做到这一点,因为 cv() return 是想要的信息。但是 CatBoostClassifier.fit() 没有 return 任何东西,根据文档。

这里是我用来拟合模型的代码片段:

model = CatBoostClassifier(
                           random_seed=42,
                           logging_level='Silent',
                           eval_metric='Accuracy'
                          )

model.fit(X_train,
          y_train,
          cat_features=cat_features_idxs,
          eval_set=(X_val, y_val),
          plot=True
         )

如果我改用 cv(),这里是我设法获取所需信息的方法:

cv_data = cv(Pool(X, y, cat_features = cat_features_idxs),
             model.get_params(),
             fold_count = 5,
             plot=True)

print('Validation accuracy (best average among cross-validation folds) is {} obtained at step {}.'.format(np.max(cv_data['test-Accuracy-mean']), np.argmax(cv_data['test-Accuracy-mean'])))

1) 只需计算训练数据的分数:

model = CatBoostClassifier(
                       random_seed=42,
                       logging_level='Silent',
                       eval_metric='Accuracy'
                      )

model.fit(X_train,
          y_train,
          cat_features=cat_features_idxs,
          eval_set=(X_val, y_val),
          plot=True
         )

train_score = model.score(X_train, y_train) # train (learn) score

val_score = model.score(X_val, y_val) # val (test) score

另一种方法是访问输出文件:

model = CatBoostClassifier(
                       random_seed=42,
                       logging_level='Silent',
                       eval_metric='Accuracy',
                       allow_writing_files=True
                      )

model.fit(X_train,
      y_train,
      cat_features=cat_features_idxs,
      eval_set=(X_val, y_val),
      plot=True
     )

import pandas as pd
test_error = pd.read_csv('catboost_info/test_error.tsv', sep='\t')
val_score = test_error.loc[test_error['Accuracy'] == test_error['Accuracy'].max()]['Accuracy'].values[0]
best_iter = int(test_error.loc[test_error['Accuracy'] == test_error['Accuracy'].min()]['iter'].values[0])
train_score = learn_error.loc[learn_error['iter'] == best_iter]['Accuracy'].values[0]

2) 如果您安装了 pandas 添加 as_pandas=True 作为 cv 的参数,那么您可以将 cv_data 作为数据框访问。例如cv_data['test-Accuracy-mean'].max().

https://tech.yandex.com/catboost/doc/dg/concepts/python-reference_cv-docpage/

您也可以像上面那样访问输出文件,在这种情况下,每个折叠都会有一对文件夹。

希望对您有所帮助!