首页 > 解决方案 > 使用 RandomizedSearchCV 在 sklearn 中调整超参数需要大量时间

问题描述

我正在处理一个包含 13 个特征和 550068 行的数据集。我进行了 k 折交叉验证并选择了k值为 10,然后选择了在我的情况下具有最小均方根误差的最佳模型,该模型是梯度提升回归器。然后我做了超参数调整,这是我的代码:

from sklearn.ensemble GradientBoostingRegressor
gradientboost = GradientBoostingRegressor(n_estimators = 300)
from sklearn.model_selection import RandomizedSearchCV
loss = ['ls', 'lad', 'huber']
n_estimators = [100, 500, 900, 1100, 1500]
max_depth = [2, 3, 5, 10, 15]
min_samples_leaf = [1, 2, 4, 6, 8] 
min_samples_split = [2, 4, 6, 10]
max_features = ['auto', 'sqrt', 'log2', None]

# Define the grid of hyperparameters to search
hyperparameter_grid = {'loss': loss,
    'n_estimators': n_estimators,
    'max_depth': max_depth,
    'min_samples_leaf': min_samples_leaf,
    'min_samples_split': min_samples_split,
    'max_features': max_features}

# Set up the random search with 4-fold cross validation
random_cv = RandomizedSearchCV(estimator=gradientboost,
            param_distributions=hyperparameter_grid,
            cv=4, n_iter=50,
            scoring = 'neg_mean_absolute_error',n_jobs = 4,
            verbose = 5, 
            return_train_score = True,
            random_state=42)
random_cv.fit(features,target)

它花费大量时间进行超参数调整,几乎花了 48 小时但尚未完成。我尝试了不同的 n_jobs 和 n_iters 以及 cv 值,但过程没有加快。在此处输入图像描述。我还将我的数据集分成 5 个相等的部分,并尝试对单个部分进行参数调整

dataframe_splits = np.array_split(dataframe, 5)
features = dataframe_splits[0].drop(columns= 
['Purchase','User_ID', 'Product_ID'])
target = dataframe_splits[0]['Purchase']

但它不起作用。单个部分也需要很多时间。我正在使用 windows10 操作系统和处理器 intel i5 第 7 代。任何人都可以帮我解决这个问题。提前致谢。

标签: pythonmachine-learningdata-sciencecross-validationhyperparameters

解决方案


这是几件事的结合:

  • 有半百万个样本,
  • 使用带有大量集成的梯度提升,
  • 通常有一个大的搜索网格
  • 做 10 倍 k 验证。

在本地机器上训练这样的东西不会让你走得太远。如果您不是在训练生产级模型(但更像是一个侧面或大学项目),请尝试以下操作:

  • 使您的样本更小(例如 10k 个样本),
  • 尝试很好地理解每个超参数的作用以及梯度提升的工作原理。例如,在您的网格中,您使用的损失函数不会产生如此巨大的差异,而您缺少一个非常重要的参数“learning_rate”。'max_features' 也是如此 - 'auto' 和 'none' 本质上做同样的事情,尝试在那里尝试一些浮动是个好主意。
  • 调整更少的参数。目前,您从 3 * 5 * 5 * 5 * 4 * 4 = 6000 种可能的组合中抽取 50 种。您可以从较小的网格开始(比如 100/200 种可能的组合)并采样较少的组合,看看哪些参数会产生最大的变化,然后尝试微调它们,一次几个,但不是一次全部。最昂贵的参数是“n_estimators”,因为它将“n_estimators”树组合在一起形成一个完整的模型。首先找到处于“偏差/方差”权衡边缘的估计量,然后将其放入网格中将是一个好的开始。
  • 将 k 的数量减少到 8 甚至 5,这应该会立即大幅减少运行时间。

如果您正在为生产规模做这件事并且想要使用整个数据集,您将需要获得一些额外强大的计算资源,例如虚拟机和/或使用不同的包来训练梯度提升树,例如xgboost光GBM。两者都应该支持 GPU 训练,所以如果你有一个 CUDA GPU,你也可以使用它。


推荐阅读