2.7 超参数 (Hyperparameters) vs 参数 (Parameters) 本节摘要:超参数和参数都叫"参数",却是两码事。参数是模型训练后自己学出来的内部变量,比如线性回归的系数和截距,代表模型从数据里提炼的知识;超参数是训练前由人定下的外部旋钮,比如支持向量机的核函数和正则化强度,控制的是学习过程本身。区分二者是调参的第一步——参数你没法直接改,超参数才需要也才值得去搜。本节讲清两者界限,并给出网格搜索、随机搜索这套调参方法。
本节摘要:超参数和参数都叫"参数",却是两码事。参数是模型训练后自己学出来的内部变量,比如线性回归的系数和截距,代表模型从数据里提炼的知识;超参数是训练前由人定下的外部旋钮,比如支持向量机的核函数和正则化强度,控制的是学习过程本身。区分二者是调参的第一步——参数你没法直接改,超参数才需要也才值得去搜。本节讲清两者界限,并给出网格搜索、随机搜索这套调参方法。
阅读完本节,你应当能够:
"参数"这个词在机器学习里被用滥了。刚接触时,我们很容易以为所有能写进模型构造函数的数字都是同类。其实它们分属两个世界,用一个厨房的类比就能分清楚。
把训练模型比作炒一道菜。菜谱是超参数:火候大小、盐放几克、炖多久——这些由厨师在开火前定好,决定了这道菜怎么个做法。成品菜的味道是参数:出锅后这道菜实际的咸淡、软硬——这是烹饪过程"跑"出来的结果,厨师此时只能尝,不能直接改。
翻译回机器学习:超参数是开火前定的"怎么做",参数是训练跑完后产出的"学成了什么样"。线性回归里,fit_intercept 是超参数(要不要截距项,人定的),coef_ 是参数(系数,训练学出来的)。
这张图把闭环画全了:人调超参数,算法学出参数,参数决定预测,预测不好再回头改超参数。参数是结果,超参数是手段。
换个相机类比也成立。ISO、光圈、快门速度是超参数,你按拍摄场景提前定好;最终照片的亮度、景深是参数,是按下快门后"跑"出来的。想改照片,只能重新调参数再拍一张——和机器学习里换超参重训如出一辙。
参数是训练过程的产物,是模型从数据里提炼出来的"知识"。它们存在模型对象内部,训练完就能访问。scikit-learn 里有个很实用的约定:学出来的参数属性,名字都以单个下划线结尾,比如 coef_、intercept_、feature_importances_。反过来,构造函数里的那些不带下划线、由你传进去的,是超参数。
看一眼最直观的线性回归:
from sklearn.linear_model import LinearRegression import numpy as np X = np.array([[1], [2], [3], [4], [5]]) y = np.array([2, 4, 5, 4, 5]) model = LinearRegression() model.fit(X, y) print(model.coef_) # 学到的系数 print(model.intercept_) # 学到的截距
coef_ 和 intercept_ 是训练前不存在的,fit 之后才冒出来。它们合起来就是那条拟合直线。不同模型学出的参数形态各不相同:
| 模型 | 典型参数属性 | 含义 |
|---|---|---|
| 线性回归 / 逻辑回归 | coef_、intercept_ | 特征权重与截距 |
| 决策树 | feature_importances_ | 各特征的重要性 |
| 随机森林 | estimators_ | 组成森林的一棵棵树 |
| 支持向量机 | support_vectors_ | 决定边界的支持向量 |
这些属性是模型"学会了什么"的直接证据。你可以读它来理解模型、诊断问题、甚至做特征重要性分析,但你不能也没法手动去改它——改参数的唯一途径是换数据或换超参数重新训练。
想验证这条下划线约定,可以用 get_params 和属性做对照。get_params 列出的全是构造时能传的超参数,一个下划线属性都不含;而 coef_、intercept_ 这些属性,训练前访问会报错,训练后才存在。这个"训练前没有、训练后才冒出来"的特征,就是判断参数的最硬标准。
超参数是训练前由人设定的,控制的是"学习过程怎么进行"。同一个算法,超参数不同,学出来的参数就不同,性能可能天差地别。举个支持向量机的例子:
from sklearn.svm import SVC model = SVC(kernel="rbf", C=1.0, gamma="scale")
这里 kernel、C、gamma 都是超参数。kernel 选核函数,决定模型用直线还是曲线去分;C 是正则化强度,控制"容忍多少训练误差",调小就更倾向简单、抗过拟合;gamma 决定单个样本影响范围,调大就更容易抓住局部细节、也更容易过拟合。
常见算法的关键超参数,值得背下来当调参起点:
| 算法 | 关键超参数 | 它控制什么 |
|---|---|---|
| 决策树 | max_depth | 树的深度,越深越复杂越易过拟合 |
| 随机森林 | n_estimators | 树的数量,多了更稳但更慢 |
| K 近邻 | n_neighbors | 参考几个邻居,越小越敏感 |
| 逻辑回归 | C | 正则化强度,越小约束越强 |
| 支持向量机 | kernel、C、gamma | 核类型、容错、样本影响范围 |
你可能想问:既然超参数这么重要,能不能也交给算法自己学?理论上可以,这类做法叫"元学习"或"嵌套交叉验证"——外层搜超参数、内层做交叉验证。问题是计算量会爆炸,每个候选超参数都要完整跑一轮交叉验证。所以工程上仍是人定范围、搜索器来试。这也正是"超"字的含义:它站在参数之上,决定参数怎么学,却不从数据里直接给出答案。
超参数和参数的分界,用一句话就能记住:训练前你能写进构造函数的是超参数,训练后以下划线结尾、只读的是参数。 前者要搜,后者只能看。
| 维度 | 超参数 | 参数 |
|---|---|---|
| 谁决定 | 人,训练前设定 | 模型,训练中自己学 |
| 是否随训练变化 | 不变 | 会变 |
| 代表什么 | 学习过程的规则 | 学习结果的知识 |
| 怎么调 | 网格搜索、随机搜索 | 无法直接改,只能重训 |
| 访问方式 | 构造函数传入 | 下划线结尾的属性 |
| 例子 | 学习率、树的深度、核类型 | 系数、截距、支持向量 |
这张表是本节的地基。弄不清"这个数字是超参还是参数",调参就会瞎忙——你可能对着一个学出来的参数较劲,而它根本不由你直接控制。
既然只有超参数能调,调参就是"给超参数挑更好的取值"。上一节已经见过两个主力工具,这里从"超参数 vs 参数"的视角再补一句:搜索空间里放的,永远只能是超参数,因为搜索器要反复重训模型,每次换的必须是"规则",而不是"结果"。
from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC grid = {"C": [0.1, 1, 10], "gamma": ["scale", "auto"]} gs = GridSearchCV(SVC(), grid, cv=5) gs.fit(X_train, y_train) print(gs.best_params_) # 搜出来的最佳超参数
网格搜索穷举、随机搜索抽样,前者适合小范围精扫,后者适合大范围粗扫,两者常组合成"先粗后精"。更高级的贝叶斯优化会把"评估一次很贵"考虑进去,用已有结果聪明地选下一个要试的点,比盲搜更省,但实现和依赖都更重,一般等前面两招不够用再上。
调参还有个优先级问题:不是所有超参数都同样值钱。通常先调对模型影响最大的那一个——比如树模型的复杂度参数(深度、叶子样本数)——再调次要的。把有限的搜索预算压在最有杠杆的旋钮上,回报最高。默认值也不是摆设:很多库的默认参数是作者在大量数据集上调过的,先跑一遍当基线,才知道这一轮搜索到底值不值。
调参最大的隐性成本是组合爆炸。假设你给随机森林挑了三个超参数,每个给十个候选值,看起来不多,乘起来就是一千种组合;再乘上五折交叉验证,等于要训五千次模型。单次训练只要一秒,加起来也要一个半小时,而三个参数在真实调参里已经算克制了。网格搜索的好处是"不漏",代价是随参数个数和候选值个数指数级增长,稍一放权就训不起。
随机搜索的思路是用"少抽样"换"广覆盖":不穷举,而是在搜索空间里随机抽固定数量的组合。经验上,通常只有少数几个超参数真正起决定作用,其余参数在宽范围内怎么取都差不多,随机搜索用同样的预算能探到更多"决定性参数"的不同取值,性价比往往更高,所以常被拿来当大范围粗扫。贝叶斯优化的直觉更进一步:它不把每次训练当一次性买卖,而是记住"试过哪些点、各得多少分",据此猜哪里更可能有高分,专挑最值得试的点下手。训练越贵,它省得越多,代价是实现和依赖更重,一般等网格和随机都吃力了再上。
⚠️ 常见坑:把超参数和参数混为一谈。典型的错误是把学出来的
coef_当成能"设置"的东西,或反过来,搜参数时把coef_写进搜索空间。记住下划线约定,一眼就能分辨。
⚠️ 常见坑:调参时反复用同一个测试集看效果。超参数会因此"过拟合"到测试集上,搜出来的最优其实只是对这份测试数据最优。验证交给交叉验证,测试集只最后碰一次。
💡 关键直觉:调参是"用计算换精度"的买卖,不是越多越好。先跑默认参数拿基线,再决定要不要搜、搜多大范围——很多项目里,默认参数加一条干净的管道,已经能跑赢一半。
知道怎么搜,还要知道怎么搜才不白费力气。几条纪律值得记下:
scoring 挑最优的,指标选错了——比如不平衡数据还用准确率——搜出来的"最优"可能是个只会猜多数类的模型。这几条里,我最想强调第一条。指标选错,后面搜得再努力,都是在错误的赛道上狂奔。

至此,估计器、转换器、预测器、评估、选择、管道、超参与参数这七个核心概念已经串成一条完整链路。下一章我们把这些零件装起来,去看它们如何落地到分类、回归、聚类这些具体任务上。