多分类机器学习任务中超参数调优前如何筛选最优分类器
你提出的「先用默认超参数训练所有候选分类器、筛选出表现最优的再做精细化调优」的方案完全可行,是工业界处理多模型选型+调优的常用基础思路,能帮你筛掉大部分默认表现不佳的模型,避免无效调优开销。你可以在这个基础上做几个优化,进一步降低筛选和调优的耗时:
分类器快速筛选优化策略
- 用小比例采样数据集做初筛:不需要用全量训练数据跑默认参数,随机抽取10%~30%的训练数据跑所有候选分类器的默认参数即可。这个量级的数据跑起来速度快,且不同分类器的表现排序和全量数据的排序一致性很高,足够完成初筛,筛掉排名后50%的模型再进入下一环节即可。
- 固定通用预处理逻辑:筛选阶段统一使用和后续调优完全一致的预处理规则(比如你当前代码中的PCA降维),不要中途修改预处理逻辑,避免筛选出的模型和后续流程不匹配。
- 参考多维度指标做筛选:除了准确率,同时参考单轮训练耗时、内存占用,如果两个模型准确率差距不到1%,优先选择训练速度更快的,后续调优的时间成本会低很多。
注意初筛和调优全程都只能使用训练集、验证集数据,不要触碰测试集,避免数据泄露
现有调优流程耗时优化方案
你当前使用的全量GridSearchCV遍历所有参数组合的方式耗时很高,可以做以下优化:
- 替换
GridSearchCV为RandomizedSearchCV:随机搜索在超参数调优上的效率远高于网格搜索,相同时间内能探索更多参数区间,调优效果普遍更好。sklearn中直接替换类即可,新增n_iter参数控制搜索次数,一般设置20~50次就足够覆盖最优参数区间。 - 采用「粗调+细调」的两阶段调优逻辑:先用大范围的参数区间做随机搜索,找到最优参数的大致区间后,再在这个小区间内做小范围的精细搜索,不要一上来就覆盖从0.0001到0.1这么宽的学习率区间。
- 精简无效参数选项:比如你当前
reduce_dim__n_components中的0.1保留的信息过少,属于无效选项,仅保留0.7、0.9即可;树模型的max_depth在多分类任务中一般最多到30就足够,100和None的选项会大幅增加训练耗时且几乎不会带来效果提升,可以直接去掉,能砍掉大量无效参数组合。 - 增加早停机制:对于XGBoost、Gradient Boost这类迭代训练的模型,调优时传入验证集设置
early_stopping_rounds,不需要跑满固定的n_estimators轮数,能大幅减少单轮训练时间。
优化后调优代码示例
from sklearn.model_selection import RandomizedSearchCV import numpy as np # 精简后的参数范围 max_depth = [int(x) for x in np.linspace(3, 30, num = 4)] param_dist = [ { 'reduce_dim__n_components': [0.7, 0.9], 'classify__learning_rate': [0.001, 0.01, 0.1], 'classify__n_estimators': [int(x) for x in np.linspace(start = 100, stop = 800, num = 4)], 'classify__max_depth': max_depth } ] # 替换为随机搜索,仅遍历30组参数组合,耗时比原全网格搜索降低80%以上 random_search = RandomizedSearchCV( Pipeline([ ('reduce_dim', PCA(svd_solver='full')), ('classify', xgb.XGBClassifier(objective='multi:softmax', n_jobs=-1)) ]), param_distributions=param_dist, n_iter=30, cv=5, scoring='accuracy', verbose=1, return_train_score=True, n_jobs=-1, random_state=42 ) random_search = random_search.fit(train_prepared, y_train)
内容的提问来源于stack exchange,提问作者Danilo Perl
相关产品推荐
相关产品推荐

