sklearn中的超参数调整使用RandomizedSearchCV花费大量时间

时间:2018-06-03 08:13:57

标签: 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 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值,但是这个过程并没有加速。enter image description here。我也分了我的将数据集分成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 os和处理器intel i5第7代。任何人都可以帮我弄清楚这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是几件事的组合:

  • 有五十万个样本,
  • 使用渐变提升与很多合奏,
  • 通常有一个大搜索网格
  • 做10倍k验证。

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

  • 使您的样本更小(比如10k样本),
  • 尝试深入了解每个超级用户的作用以及梯度提升的工作原理。例如,在您的网格中,您使用的损失函数不会产生如此巨大的差异,而您缺少一个非常重要的参数' learning_rate'。同样适用于' max_features' - ' auto'并且没有'从根本上做同样的事情,尝试在那里试验一些花车是一个好主意。
  • 调整较少的参数。目前,您正在抽取3 * 5 * 5 * 5 * 4 * 4 = 6000种可能组合中的50种。您可以从较小的网格(比如100/200可能的组合)开始,并采用较少的组合,查看哪些参数进行了最大的更改,然后尝试对它们进行微调,一次一对,但不能同时进行。最昂贵的参数是' n_estimators',因为它放了' n_estimators'树木融为一体,形成一个完整的模型。查找位于“偏差/方差”边缘的大量估算器。首先进行权衡,然后将其放入网格将是一个良好的开端。
  • 将k的数量减少到8甚至5,这样可以大大减少运行时间。

如果您正在为生产规模进行操作并想要使用整个数据集,则需要获得一些额外的强大计算资源,例如虚拟机和/或使用不同的包来训练渐变增强树,例如为xgboostLightGBM。这两个都应该支持GPU培训,所以如果你有一个CUDA GPU,你也可以使用它。

答案 1 :(得分:0)

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

  1. verbose =5。请删除此内容,因为这会花费大量时间。它所做的只是打印每棵树的性能。您实际上是否需要所有这些视觉干扰?
  2. return_train_score = True。您真的需要保留训练成绩吗?可能不会。您可以删除它以节省时间。
  3. huber损失比ls花费更长的时间,因为它是lslad的组合。如果您的数据没有异常值,请使用默认损失。如果必须使用Huber损失,请先在较小的样本上尝试。

顺便说一句,在sklearn GradientBoostingRegressor中, max_features = 'auto'None含义相同。