2.7 超参数 (Hyperparameters) vs 参数 (Parameters)


文档摘要

2.7 超参数 (Hyperparameters) vs 参数 (Parameters) 本节摘要:超参数和参数都叫"参数",却是两码事。参数是模型训练后自己学出来的内部变量,比如线性回归的系数和截距,代表模型从数据里提炼的知识;超参数是训练前由人定下的外部旋钮,比如支持向量机的核函数和正则化强度,控制的是学习过程本身。区分二者是调参的第一步——参数你没法直接改,超参数才需要也才值得去搜。本节讲清两者界限,并给出网格搜索、随机搜索这套调参方法。

2.7 超参数 (Hyperparameters) vs 参数 (Parameters)

本节摘要:超参数和参数都叫"参数",却是两码事。参数是模型训练后自己学出来的内部变量,比如线性回归的系数和截距,代表模型从数据里提炼的知识;超参数是训练前由人定下的外部旋钮,比如支持向量机的核函数和正则化强度,控制的是学习过程本身。区分二者是调参的第一步——参数你没法直接改,超参数才需要也才值得去搜。本节讲清两者界限,并给出网格搜索、随机搜索这套调参方法。

本节导航

阅读完本节,你应当能够:

  1. 一句话说清超参数和参数的根本区别
  2. 指出谁在学习中变化、谁由人事先设定
  3. 用代码访问模型学到的参数属性
  4. 说清常见算法的关键超参数各控制什么
  5. 用网格搜索或随机搜索找出更好的超参数组合
  6. 避开"把超参数当参数""测试集反复调参"两个坑

一、两个"参数",先拆开

"参数"这个词在机器学习里被用滥了。刚接触时,我们很容易以为所有能写进模型构造函数的数字都是同类。其实它们分属两个世界,用一个厨房的类比就能分清楚。

把训练模型比作炒一道菜。菜谱是超参数:火候大小、盐放几克、炖多久——这些由厨师在开火前定好,决定了这道菜怎么个做法。成品菜的味道是参数:出锅后这道菜实际的咸淡、软硬——这是烹饪过程"跑"出来的结果,厨师此时只能尝,不能直接改。

翻译回机器学习:超参数是开火前定的"怎么做",参数是训练跑完后产出的"学成了什么样"。线性回归里,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")

这里 kernelCgamma 都是超参数。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 挑最优的,指标选错了——比如不平衡数据还用准确率——搜出来的"最优"可能是个只会猜多数类的模型。
  • 用交叉验证兜底:每个候选组合都用交叉验证打分,而不是在单份验证集上比,分数才稳。
  • 范围要合理:参考模型文档和经验值,别拍脑袋。太宽浪费算力,太窄可能把最优解挡在边界外。
  • 迭代逼近:先粗搜定方向,再精搜定落点,别想一步到位。
  • 算成本账:组合数会随参数数量乘法式增长,训练慢的模型尤其要控制范围,或改用随机搜索、贝叶斯优化降成本。

这几条里,我最想强调第一条。指标选错,后面搜得再努力,都是在错误的赛道上狂奔。

图标题:超参数与参数对比

图标题:超参数与参数对比

要点速记

  • 参数是学出来的知识:训练后由模型自己产出,代表它从数据里提炼的规律。
  • 超参数是人定的规则:训练前写进构造函数,控制学习过程怎么走。
  • 下划线约定是分水岭:学出的属性以下划线结尾、只读;构造函数入参是超参数。
  • 参数不能直接改:想改参数,只能换数据或换超参数重训。
  • 超参数才值得搜:搜索空间里放的一定是超参数,不是参数。
  • 调参用计算换精度:先粗后精,网格精扫、随机粗扫,贝叶斯优化更省。
  • 测试集只碰一次:反复拿测试集调超参,会过拟合到测试集上。

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


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U