【问题标题】:How to fetch the evaluation metric after a CatBoostClassifier.fit()?如何在 CatBoostClassifier.fit() 之后获取评估指标?
【发布时间】:2018-11-05 03:25:48
【问题描述】:

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

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

当我训练模型调用cv() 时,我可以做到这一点,因为cv() 返回所需的信息。但是根据文档,CatBoostClassifier.fit() 没有返回任何内容。

这里是我用来拟合模型的代码的 sn-p:

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'])))

【问题讨论】:

    标签: catboost


    【解决方案1】:

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

    https://stackoverflow.com/a/17954831

    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 作为 Dataframe 访问。例如cv_data['test-Accuracy-mean'].max().

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多