You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RandomizedSearchCV运行耗时过长,求优化解决方案

问题描述

我正在用RandomizedSearchCV做超参数调优,处理的数据共6244行。最初用GridSearchCV搭配11种估计器,耗时太长只能放弃;改用RandomizedSearchCV并缩减到6种估计器后,运行时间还是超标。另外,当base_estimator用GaussianNB、KNeighborsClassifier时,30秒左右就能跑完,但换成MLPClassifier(max_iter=10000)后,跑了2小时还没出结果。求缩短处理时间的方法。

我的代码如下:

#Tuning bagging here

distributions = dict(n_estimators = [10,20,50,100,150,200])
bagging_nb = BaggingClassifier(base_estimator=MLPClassifier(max_iter=10000), n_jobs=-1)
kfold = KFold(n_splits=fold, random_state=seed, shuffle=True)
grid = RandomizedSearchCV(estimator=bagging_nb, param_distributions=distributions, scoring=scoring, cv=kfold)
grid_result = grid.fit(X_train, y_train)
print('Best %f using %s' % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip (means, stds, params):
    print("%f (%f) with %r" % (mean, stdev, param))

优化方案

  • 给MLP加提前停止,降低迭代上限
    设置的max_iter=10000完全没必要,MLP通常几百次迭代就能收敛。给MLP加上早停机制,让模型收敛后自动停止训练,不用跑完所有迭代:

    MLPClassifier(max_iter=1000, early_stopping=True, n_iter_no_change=5)
    

    n_iter_no_change=5表示连续5次迭代得分没提升就停止,大幅减少无效训练时间。

  • 简化MLP的模型结构
    默认MLP的隐层单元数是100,可根据任务复杂度缩减,比如改成hidden_layer_sizes=(32,)或(64,),减少模型参数规模,加快单模型训练速度:

    MLPClassifier(hidden_layer_sizes=(32,), max_iter=1000, early_stopping=True)
    
  • 给RandomizedSearchCV开并行,减少搜索量
    你的BaggingClassifier开了n_jobs=-1,但RandomizedSearchCV本身也能设n_jobs=-1,让不同参数组合/交叉验证折并行运行。同时,你的参数列表只有6个值,RandomizedSearch和GridSearch效果一样,可缩减参数范围,比如只保留[10,50,100],或者设n_iter=3只搜3个值快速定位最优区间:

    grid = RandomizedSearchCV(estimator=bagging_nb, param_distributions=distributions, 
                              scoring=scoring, cv=kfold, n_jobs=-1, n_iter=3)
    
  • 对数据做标准化处理
    MLP对数据尺度极度敏感,未标准化的数据会大幅拖慢收敛速度。先对训练数据做标准化:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    # 后续用X_train_scaled替代X_train传入fit
    
  • 减少交叉验证折数
    如果你的数据分布相对均匀,可把KFold的n_splits从默认的5/10降到3,减少总训练次数,代价很小但能省不少时间。

  • 先单独调优MLP,再套Bagging
    先抛开Bagging,单独用RandomizedSearchCV调优MLP的超参数(迭代次数、隐层结构等),找到最优的MLP配置后,再作为base_estimator传入Bagging,避免在调Bagging参数时反复训练低效的MLP模型。

内容的提问来源于stack exchange,提问作者Nasi Padang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:10:14