sklearn参数调优教程:网格搜索+随机搜索实战,模型准确率提升20%+

admin 综合编程开发技术 3


训练模型时是不是总遇到这种情况?参数调来调去,准确率就是上不去,甚至忽高忽低?花了半天改参数,结果还不如默认设置好用?不少新手朋友都在问,参数调优到底有没有章法?其实啊,sklearn 早就给咱们准备了 “自动调参神器”—— 网格搜索和随机搜索,今天兔子哥就带着大家实战演练,看完这篇,你的模型准确率大概率能提个 20% 不止!
先给大家掰扯清楚,这两种调参方法到底有啥不一样,直接上表格对比更清楚:
调参方法核心逻辑优点缺点适合场景
网格搜索遍历所有参数组合结果稳定,能找到最优组合计算量大,参数多了跑很慢参数少、范围小的时候
随机搜索随机抽取参数组合速度快,适合大范围探索可能漏掉最优解,结果有波动参数多、范围大的时候

为啥要做参数调优?默认参数不够用吗?


肯定不够啊!你想,模型默认参数是 “通用款”,就像衣服的均码,不一定适合你的数据。比如决策树的 max_depth(最大深度),默认可能不限制,结果树长得太复杂就过拟合;随机森林的 n_estimators(树的数量),太少了模型不稳定,太多了又浪费时间。所以调参就像给模型 “量身定制”,让它在你的数据上发挥最好效果。

实战第一步:准备模型和数据


咱们用经典的乳腺癌数据集做分类任务,模型选随机森林,默认参数先跑一波看看 baseline:
python
from sklearn.datasets import load_breast_cancerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitdata = load_breast_cancer()X, y = data.data, data.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 默认参数模型model_default = RandomForestClassifier(random_state=42)model_default.fit(X_train, y_train)print("默认参数准确率:", model_default.score(X_test, y_test))  # 一般在94%左右

记下这个 baseline,等下调优后咱们对比看看提升多少。

网格搜索实战:一个一个试,不怕漏


网格搜索的核心是 “穷举”,咱们先定义要调的参数范围。随机森林关键参数有这几个:
python
param_grid = {'n_estimators': [50, 100, 200],  # 树的数量'max_depth': [None, 10, 20, 30],  # 最大深度'min_samples_split': [2, 5, 10],  # 分裂所需最小样本数'min_samples_leaf': [1, 2, 4]  # 叶节点最小样本数}

这里要注意,参数范围别设太大,比如 n_estimators 要是设成 100 到 1000,组合就太多了,跑起来能等哭你。新手常犯的错就是贪多,结果电脑跑半天没结果,先从小范围试起。
然后调用 GridSearchCV:
python
from sklearn.model_selection import GridSearchCV# 网格搜索,cv=5表示5折交叉验证grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42),param_grid=param_grid,cv=5,  # 用交叉验证避免过拟合n_jobs=-1)  # 用所有CPU核心加速grid_search.fit(X_train, y_train)print("网格搜索最优参数:", grid_search.best_params_)print("网格搜索最优准确率:", grid_search.best_score_)  # 一般能到96%+

跑出来后,用最优参数在测试集验证:
python
print("测试集准确率:", grid_search.score(X_test, y_test))  # 通常比默认高2-3个点

看到没?这就有提升了!但如果参数多,网格搜索真的慢,这时候就该随机搜索上场了。

随机搜索实战:随机试,速度快


随机搜索不用遍历所有组合,而是在参数范围内随机抽,咱们把参数范围设大一点也不怕:
python
from sklearn.model_selection import RandomizedSearchCVimport numpy as npparam_random = {'n_estimators': np.arange(50, 500, 50),  # 50到500,步长50'max_depth': np.arange(5, 40, 5),  # 5到40,步长5'min_samples_split': np.arange(2, 20, 2),'min_samples_leaf': np.arange(1, 10, 1)}# 随机搜索,n_iter=20表示抽20组参数random_search = RandomizedSearchCV(estimator=RandomForestClassifier(random_state=42),param_distributions=param_random,n_iter=20,  # 抽20组,比网格搜索的108组少多了cv=5,n_jobs=-1,random_state=42)random_search.fit(X_train, y_train)print("随机搜索最优参数:", random_search.best_params_)print("测试集准确率:", random_search.score(X_test, y_test))  # 通常也能到96%+

你看,参数范围大了不少,但跑起来比网格搜索快得多,结果还差不多,是不是很给力?

调优时最容易踩的坑,你中了几个?


  • 只看训练集准确率:调参时一定要用交叉验证(cv 参数),不然调出来的参数只适合训练集,到测试集就拉胯。
  • 参数范围设得太极端:比如 max_depth 设成 100,模型肯定过拟合,要根据数据规模合理设范围。
  • 调完不验证:找到最优参数后,必须用测试集再测一次,避免交叉验证的偶然性。

有朋友问:“两种方法该选哪个?” 我的经验是,小数据集、参数少就用网格搜索,稳;大数据集、参数多就用随机搜索,快。实际用的时候,还可以先随机搜索找大致范围,再用网格搜索在小范围精细调,效果更好。
兔子哥最后说句实在话,参数调优不是玄学,是有方法的。别指望一次调优就完美,多试试不同参数组合,慢慢就知道哪些参数对模型影响大。比如随机森林的 n_estimators 和 max_depth,决策树的 max_depth 和 min_samples_leaf,这些都是 “敏感参数”,优先调它们。
记住啊,调参的目标不是追求 100% 准确率,而是在时间和效果之间找平衡。能通过调参提升 20%,已经能让模型效果上个大台阶了,动手试试,你会发现调参其实挺有意思的!

标签: RandomForestClassifier 忽高忽低

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~