cv

cv函数用于执行交叉验证。交叉验证是一种评估机器学习模型性能的强大技术,它通过将数据集分成多个子集(folds),在部分数据上训练模型,并在剩余数据上评估模型来评估模型的泛化能力,从而避免过拟合。

官方文档

函数签名:

cv(pool=None, params=None, iterations=None, num_boost_round=None, fold_count=3, nfold=None, inverted=False, partition_random_seed=0, seed=None, shuffle=True, logging_level=None, stratified=None, as_pandas=True, metric_period=None, verbose=None, verbose_eval=None, plot=False, early_stopping_rounds=None, folds=None, type='Classical', return_models=False)

参数详解:

  • pool (或 dtrain): 用于交叉验证的输入数据集,通常是一个Pool对象。这是必需参数。
  • params: 一个字典,包含模型训练所需的所有参数。这是必需参数。需要注意的是,参数save_snapshot--snapshot-filesnapshot_interval在交叉验证模式下不被支持。
  • iterations (或 num_boost_roundn_estimatorsnum_trees): 模型训练的最大迭代次数(或树的数量)。默认为1000。
  • fold_count (或 nfold): 将数据集划分为的折数(folds)。默认为3。
  • inverted: 布尔值,指示是否进行反向交叉验证。如果为True,则在测试集上训练模型,在训练集上评估模型。默认为False
  • partition_random_seed (或 seed): 整数,用于控制数据集划分时的随机种子,确保结果的可重复性。默认为0。
  • shuffle: 布尔值,指示是否在划分数据集之前打乱数据顺序。默认为True
  • logging_level: 字符串,指定日志记录级别,控制输出信息的详细程度。
  • stratified: 布尔值,指示是否进行分层采样。如果为None,则根据损失函数自动决定。
  • as_pandas: 布尔值,指示是否将结果以pandas DataFrame的形式返回。默认为True
  • metric_period: 整数,指定计算和输出评估指标的频率(迭代次数)。
  • verbose (或 verbose_eval): 控制日志输出的频率和方式。
  • plot: 布尔值,指示是否在Jupyter Notebook环境中绘制指标曲线图。默认为False
  • early_stopping_rounds: 整数,指定提前停止训练的轮数,用于防止过拟合。
  • folds: 自定义的折叠索引,允许用户指定自定义的数据划分方式。
  • type: 字符串,指定交叉验证的类型,默认为'Classical'。
  • return_models: 布尔值,指示是否返回训练好的模型。默认为False

返回值:

如果as_pandasTrue,则返回一个pandas DataFrame,包含每次迭代的平均指标值和标准差。否则,返回一个字典,包含相同的信息。如果return_modelsTrue,则还会返回训练好的模型列表。

交叉验证过程:

cv函数将数据集分成fold_count个子集。对于每个子集,它使用其余子集训练模型,然后使用该子集评估模型性能。最后,它计算所有子集的平均性能指标和标准差,以提供模型性能的可靠估计。

示例:

from catboost import Pool, cv

cv_data = [["France", 1924, 44],
           ["USA", 1932, 37],
           ["Switzerland", 1928, 25],
           ["Norway", 1952, 30],
           ["Japan", 1972, 35],
           ["Mexico", 1968, 112]]

labels = [1, 1, 0, 0, 0, 1]

cat_features = [0]

cv_dataset = Pool(data=cv_data,
                  label=labels,
                  cat_features=cat_features)

params = {"iterations": 100,
          "depth": 2,
          "loss_function": "Logloss",
          "verbose": False}

scores = cv(cv_dataset,
            params,
            fold_count=2,
            plot="True")
from catboost import Pool, cv

cv_data = [["France", 1924, 44],
           ["USA", 1932, 37],
           ["Switzerland", 1928, 25],
           ["Norway", 1952, 30],
           ["Japan", 1972, 35],
           ["Mexico", 1968, 112]]

labels = [1, 1, 0, 0, 0, 1]

cv_dataset = Pool(data=cv_data,
                  label=labels,
                  cat_features=[0])

params = {"iterations": 100,
          "depth": 2,
          "loss_function": "Logloss",
          "verbose": False,
          "roc_file": "roc-file"}

scores = cv(cv_dataset,
            params,
            fold_count=2)