如何使用catboost过度拟合探测器

时间:2017-08-06 14:48:56

标签: catboost

我正在尝试了解catboost过度拟合探测器。这里描述:

https://tech.yandex.com/catboost/doc/dg/concepts/overfitting-detector-docpage/#overfitting-detector

其他梯度增强包如lightgbm和xgboost使用一个名为early_stopping_rounds的参数,这个参数很容易理解(一旦验证错误在early_stopping_round步骤中没有减少,它就会停止训练。)

但是我很难理解catboost使用的p_value方法。任何人都可以解释这个过度拟合探测器是如何工作的以及何时停止训练?

3 个答案:

答案 0 :(得分:5)

它没有在Yandex网站或github存储库中记录,但如果仔细查看发布到github的python代码(特别是here),您将看到通过设置“od_type激活过度拟合检测器“在参数中。回顾最近在github上的提交,catboost开发人员最近还实现了一个类似于lightGBM和xgboost使用的“early_stopping_rounds”参数的工具,称为“Iter”。 要设置在停止之前等待的最新最佳迭代之后的回合数,请在“od_wait”参数中提供数值。

例如:

fit_param <- list(
  iterations = 500,
  thread_count = 10,
  loss_function = "Logloss",
  depth = 6,
  learning_rate = 0.03,
  od_type = "Iter",
  od_wait = 100
)

我正在使用带有R 3.4.1的catboost库。我发现在fit_param列表中设置“od_type”和“od_wait”参数非常适合我的目的。

我意识到这并没有回答你关于使用由catboost开发人员实现的p_value方法的方法的问题;不幸的是我无法帮助你。希望其他人可以向我们双方解释这个设置。

答案 1 :(得分:4)

Catboost现在支持early_stopping_roundsfit method parameters

将过拟合检测器类型设置为Iter并停止训练 从指定的迭代次数开始 最佳指标值。

这非常类似于xgboost中的early_stopping_rounds

这里是一个例子:

from catboost import CatBoostRegressor, Pool

from sklearn.model_selection import train_test_split
import numpy as np 

y = np.random.normal(0, 1, 1000)
X = np.random.normal(0, 1, (1000, 1))
X[:, 0] += y * 2

X_train, X_eval, y_train, y_eval = train_test_split(X, y, test_size=0.1)

train_pool = Pool(X, y)
eval_pool = Pool(X_eval, y_eval)

model = CatBoostRegressor(iterations=1000, learning_rate=0.1)

model.fit(X, y, eval_set=eval_pool, early_stopping_rounds=10)

结果应该是这样的:

522:    learn: 0.3994718        test: 0.4294720 best: 0.4292901 (514)   total: 957ms    remaining: 873ms
523:    learn: 0.3994580        test: 0.4294614 best: 0.4292901 (514)   total: 958ms    remaining: 870ms
524:    learn: 0.3994495        test: 0.4294806 best: 0.4292901 (514)   total: 959ms    remaining: 867ms
Stopped by overfitting detector  (10 iterations wait)

bestTest = 0.4292900745
bestIteration = 514

Shrink model to first 515 iterations.

答案 2 :(得分:0)

early_stopping_rounds 考虑了 od_type='Iter' 和 od_wait 参数。 od_type 和 od_wait 不需要单独设置,只需要设置 early_stopping_rounds 参数即可。