Python 与CatBoostRegressor的交叉验证永不停止

Python 与CatBoostRegressor的交叉验证永不停止,python,scikit-learn,catboost,Python,Scikit Learn,Catboost,我使用这段代码对catboost进行交叉验证。但是,已经10个小时了,控制台仍然输出,交叉验证显然超过了5轮。 有什么问题 import pandas as pd from sklearn.model_selection import train_test_split import catboost # from sklearn.model_selection import KFold from sklearn.feature_selection import RFECV train_data

我使用这段代码对catboost进行交叉验证。但是,已经10个小时了,控制台仍然输出,交叉验证显然超过了5轮。
有什么问题

import pandas as pd
from sklearn.model_selection import train_test_split
import catboost
# from sklearn.model_selection import KFold
from sklearn.feature_selection import RFECV

train_data = pd.read_csv('train.txt',sep='\t')
test_data = pd.read_csv('test.txt',sep='\t')
X = train_data.iloc[:,:-1]
y = train_data['target']
model = catboost.CatBoostRegressor(
                           loss_function="RMSE",
                           eval_metric="RMSE",
                           task_type="GPU",
                           learning_rate=0.01,
                           iterations=10000,
                           random_seed=42,
                           od_type="Iter",
                           depth=10,
                           early_stopping_rounds=50
                          )
rfecv = RFECV(estimator = model,cv = 5,scoring = 'neg_mean_squared_error')
rfecv.fit(X, y)
df = pd.DataFrame(rfecv.predict(test_data))
df.to_csv("my.txt", index=False, header=False)
然后我停止了程序,当我把迭代次数改为100次时,我发现控制台总共迭代了161次并停止了。我认为应该在5次交叉验证后停止,但实际上在5次之后它没有停止。

为什么会这样?

解决这个问题有几个简单的步骤:

  • 迭代次数
    减少到更有意义的1000次,如果仍然存在时间问题,甚至可以减少300次
  • cv
    减少到3 eg
  • 如果数据在合理的时间内完成,请使用较小的数据子集进行检查。然后使用整个数据集进行估计——假设算法将“线性”缩放——如果您对时间感到满意的话

  • 请注意,
    RFECV
    是一种贪婪的算法,一次修剪一个最弱的特征,如果达到局部最小值,这可能会导致问题。

    RFECV(cv=5)
    ,这种书写方式误导我,交叉验证将在5次之后停止。不,停止标准从文档中不清楚(如果在达到局部极小值或在搜索所有特征子集以获得全局特征子集后停止),但这绝对不是在拟合5次之后。它将拟合所有特征子集的5次折叠,直到达到停止标准。此外,运行10000个增强迭代器可能是不必要的。实际上,我首先问你的原因是向你展示,暴力测试所有可能的组合可能会产生更好的结果then递归消除,这可能是次优的。请参阅。但对于较大的数据集,这可能在计算上是禁止的。在这种情况下,数据清理和功能工程会产生更好的结果。这对我有很大帮助。