Python 使用RandomizedSearchCV在sklearn中进行超参数调整需要花费大量时间

Python 使用RandomizedSearchCV在sklearn中进行超参数调整需要花费大量时间,python,machine-learning,data-science,cross-validation,hyperparameters,Python,Machine Learning,Data Science,Cross Validation,Hyperparameters,我处理的数据集由13个特征和550068行组成。我进行了k次交叉验证,选择k值为10,然后选择了均方根误差最小的最佳模型。在我的例子中,该模型是梯度推进回归模型。然后我进行了超参数调优,下面是我的代码: from sklearn.ensemble GradientBoostingRegressor gradientboost = GradientBoostingRegressor(n_estimators = 300) from sklearn.model_selection import Ra

我处理的数据集由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_作业、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操作系统和英特尔第七代i5处理器。有人能帮我解决这个问题吗。提前感谢。

这是两件事的结合:

  • 拥有50万个样本
  • 使用梯度增强和大量集成
  • 通常有一个大的搜索网格
  • 进行10倍k验证
在本地机器上训练这样的东西不会让你走得很远。如果您没有培训生产级模型(但更像是一个侧面或大学项目),请尝试以下方法:

  • 使您的样品更小(比如10k样品)
  • 试着对每一个超帕计的功能以及梯度增强是如何工作的有一个很好的理解。例如,在您的网格中,您使用的损失函数不会产生如此巨大的差异,而您缺少一个非常重要的参数“学习率”。“max_特性”也是一样——“auto”和“none”本质上做相同的事情,尝试在那里使用一些浮动是个好主意
  • 调整较少的参数。目前,您正在从3*5*5*5*4*4=6000种可能的组合中抽取50种。你可以从一个更小的网格(比如100/200个可能的组合)开始,少采样组合,看看哪些参数变化最大,然后尝试微调它们,一次耦合,但不是一次全部。最昂贵的参数是‘n_估计量’,因为它将‘n_估计量’树放在一起形成一个整体模型。首先找到接近“偏差/方差”权衡边缘的估计数,然后将其放入网格将是一个良好的开端
  • 将k的数量减少到8甚至5,这将立即大大缩短运行时间

如果您是为了生产规模而这样做的,并且希望使用整个数据集,那么您需要获得一些额外强大的计算资源,例如虚拟机和/或使用不同的包来训练梯度增强的树,例如或。这两者都应该支持GPU培训,因此如果您有CUDA GPU,您也可以使用它。

查看您的参数网格,您可以更改一些内容,这些内容将立即减少运行时间,而无需付出太多牺牲:

  • verbose=5
    。请删除此项,因为这需要大量时间。它所做的只是打印每棵树的性能。你真的需要那些视觉上的干扰吗
  • return\u train\u score=True
    。你真的需要保留训练成绩吗?可能不会。您可以删除它以节省时间
  • huber丢失所需时间比
    ls
    长得多,因为它是
    ls
    lad
    的组合。如果您的数据没有不合理的异常值,请使用默认损失。如果必须使用huber损耗,请先在较小的样本上试用
  • 顺便说一下,在sklearn GradientBoosting回归器中,
    max\u features='auto'
    None
    的含义相同

    还请注意,上述两个GBM包都允许提前停车进行训练,这将允许您从参数搜索中删除
    n_估计值