ML-For-Beginners 分类器参数调优实战:基于菜系数据集探究超参数对模型质量的影响
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
本文以 ML-For-Beginners 课程第 4 章「菜系分类」系列实验(4-Classification/3-Classifiers-2)为背景,系统讲解 Linear SVC、K-Neighbors、SVC、Random Forest 与 AdaBoost 五类分类器在 Scikit-learn 中的参数配置、默认值来源与调优思路,并完整呈现课程作业「Parameter Play(参数游戏)」的实验设计、评分标准与 notebook 写法。读完本文,你将掌握如何借助 VS Code Intellisense 挖掘分类器参数、如何通过逐个调整参数值重训模型并解释模型质量升降的原因,从而建立一套可复用的超参数实验方法论。
作业背景:什么是「参数游戏」
在完成 4-Classification/3-Classifiers-2/README.md 的课程正文后,学员会面对名为Parameter Play(参数游戏)的课后作业。该作业在西班牙语翻译版 translations/es/4-Classification/3-Classifiers-2/assignment.md 中的指令是:
使用这些分类器时,有大量参数默认配置好。VS Code 中的 Intellisense 可以帮助你深入探索它们。选取本课中的一种机器学习分类技术,通过调整不同的参数值重新训练模型。创建一个 notebook,详细解释为什么某些参数改动会提升模型质量,而另一些改动会使其劣化。
作业的核心意图不在于「跑出一个更高准确率」,而在于训练学员理解每个超参数对模型行为的因果影响。评分维度只有一列(见下表),满分标准是「一个完全构建好的分类器、其参数被调整过,且改动原因在文本框中得到解释」,这明确要求 notebook 必须同时包含代码与解释性文本:
| 标准 | 卓越 | 合格 | 需改进 |
|---|---|---|---|
| 评分 | 提交的 notebook 包含一个完全构建好的分类器,参数经过调整,且改动在文本框中解释清楚 | notebook 部分完成或解释不佳 | notebook 存在 bug 或缺陷 |
因此,本文后续将围绕五类分类器逐一展开其关键参数语义、默认值、调优方向与实验证据,这正是完成该作业所需的全部素材。
前置准备:数据与基线代码
作业建立在课程正文的基础上。在 4-Classification/3-Classifiers-2/notebook.ipynb 中,数据来自清洗后的菜系数据集4-Classification/data/cleaned_cuisines.csv:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_label_df = cuisines_df['cuisine'] # 标签列 cuisines_features_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) # 380 个食材特征列数据集每一行是一条菜谱,cuisine列是类别标签(chinese / indian / japanese / korean / thai),其余 380 列是食材的 0/1 出现标记。随后按 30% 比例切分训练与测试集,并导入全部所需的分类器与评估工具:
from sklearn.neighbors import KNeighborsClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import accuracy_score, precision_score, confusion_matrix, classification_report, precision_recall_curve import numpy as np X_train, X_test, y_train, y_test = train_test_split( cuisines_features_df, cuisines_label_df, test_size=0.3 )课程正文推荐了一条「分类器选择路径」:样本数 >50、预测类别、有标签、样本 <100K 时,先尝试 Linear SVC;若效果不佳再尝试 KNeighbors,最后是 SVC 与集成分类器。Scikit-learn 提供的分类器选择地图(ML Map)正是这条路径的可视化依据:
参考实现位于 4-Classification/3-Classifiers-2/solution/notebook.ipynb,其中一次性构建了五个分类器并以循环统一训练评估:
C = 10 classifiers = { 'Linear SVC': SVC(kernel='linear', C=C, probability=True, random_state=0), 'KNN classifier': KNeighborsClassifier(C), 'SVC': SVC(), 'RFST': RandomForestClassifier(n_estimators=100), 'ADA': AdaBoostClassifier(n_estimators=100) } for index, (name, classifier) in enumerate(classifiers.items()): classifier.fit(X_train, np.ravel(y_train)) y_pred = classifier.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100)) print(classification_report(y_test, y_pred))需要特别指出:KNeighborsClassifier(C)这种写法其实把正则化常数C=10传给了n_neighbors参数(KNN 的第一个位置参数),这是课程正文为了演示「参数误用」而保留的代码,恰恰是「Parameter Play」作业值得探究的起点之一——它印证了理解每个参数位置语义的必要性。
Linear SVC:kernel、C 与 probability 三参数的调优实验
支持向量分类器(SVC)属于支持向量机(SVM)家族。其核心参数语义如下:
- kernel(核函数):决定如何将样本映射到高维空间以聚类标签。可选项包括
linear、poly、rbf、sigmoid等。本课设为linear,即利用线性 SVC 处理数值型稀疏特征。 - C(正则化参数):调节「参数的影响力」,控制误分类惩罚与决策边界复杂度的权衡。C 越大,模型越倾向拟合每一个训练样本,边界越复杂,越容易过拟合;C 越小,边界越平滑,可能欠拟合。
- probability:默认
False,置为True时启用 Platt 缩放以输出概率估计(本课需要概率用于后续可视化)。 - random_state:设为
0固定随机种子,保证实验可复现。
基线代码与结果(来自课程正文 4-Classification/3-Classifiers-2/README.md):
C = 10 classifiers = { 'Linear SVC': SVC(kernel='linear', C=C, probability=True, random_state=0) }Accuracy (train) for Linear SVC: 78.6% precision recall f1-score support chinese 0.71 0.67 0.69 242 indian 0.88 0.86 0.87 234 japanese 0.79 0.74 0.76 254 korean 0.85 0.81 0.83 242 thai 0.71 0.86 0.78 227 accuracy 0.79 1199调参实验建议(可直接写入 notebook 的文本框):
- 将
C从 10 分别降到 1、0.1、0.01,观察准确率与类别均衡度变化。通常 C 过小(如 0.001)会让决策边界过于简单,thai / chinese 等易混淆类别 recall 明显下滑。 - 将
kernel改为rbf,对比线性核与径向基核在 380 维稀疏特征上的表现差异——rbf 核计算代价更高,且在小样本下更易过拟合。 - 将
probability=False,验证概率估计开关是否影响predict结果(不影响类别预测,只影响predict_proba),借此说明该参数属于「推理期行为」而非「拟合期行为」。
K-Neighbors:n_neighbors 与距离度量的敏感性实验
K 近邻(K-Neighbors)属于「neighbors」家族,既可监督也可无监督。其思想是:为每个待预测点划定预定义数量的邻近点,数据围绕这些点聚集,从而预测泛化标签。
课程正文中基线代码是'KNN classifier': KNeighborsClassifier(C),即n_neighbors=10,结果为:
Accuracy (train) for KNN classifier: 73.8% precision recall f1-score support chinese 0.64 0.67 0.66 242 indian 0.86 0.78 0.82 234 japanese 0.66 0.83 0.74 254 korean 0.94 0.58 0.72 242 thai 0.71 0.82 0.76 227 accuracy 0.74 1199调参实验建议:
- n_neighbors(邻居数,默认 5):分别尝试 3、5、10、20、50。k 越小,决策边界越崎岖、方差越大;k 越大,边界越平滑但可能丢失局部结构。本任务中 k 从 10 降到 5 或升到 20,korean 类的 recall 波动会非常明显(基线中 korean recall 仅 0.58,说明该类别在特征空间中边界分散)。
- weights(默认
uniform):改为distance,让近邻按距离加权投票,通常能小幅提升精度,但更容易被噪声点带偏。 - metric(距离度量,默认
minkowski):可尝试manhattan(即 p=1),对 380 维 0/1 稀疏特征而言,曼哈顿距离往往比欧氏距离更稳健——这是本数据集上值得记录的一个「正向调参」案例。
默认 SVC:观察默认参数下的表现差异
课程正文紧接着加入'SVC': SVC(),即完全使用默认参数(RBF 核、C=1、gamma='scale'),结果反而优于显式配置的 Linear SVC:
Accuracy (train) for SVC: 83.2% precision recall f1-score support chinese 0.79 0.74 0.76 242 indian 0.88 0.90 0.89 234 japanese 0.87 0.81 0.84 254 korean 0.91 0.82 0.86 242 thai 0.74 0.90 0.81 227 accuracy 0.83 1199SVM 的原理是把训练样本映射到空间中并最大化两类之间的间隔,之后新数据被映射进同一空间完成预测(原理示意见下):
调参实验建议:SVC 默认参数中值得逐一验证的有gamma(RBF 核宽度,默认'scale',可改0.1、0.01)、C(默认 1,可改 0.1、10、100)、degree(多项式核次数)。在 notebook 中记录「为什么默认 RBF 核在这个数据上超过线性核」——一个合理的解释方向是:菜系特征存在非线性交互,RBF 核能隐式捕捉这些交互,而线性核只能给出超平面分割。
集成分类器:Random Forest 与 AdaBoost 的参数对比
课程正文沿选择路径走到终点,加入两个集成分类器:
'RFST': RandomForestClassifier(n_estimators=100), 'ADA': AdaBoostClassifier(n_estimators=100)Accuracy (train) for RFST: 84.5% Accuracy (train) for ADA: 72.4%集成方法「组合多个基学习器的预测」来提升模型质量。二者机理不同:
- Random Forest(随机森林):一种平均(averaging)方法,构建充满随机性的「决策树森林」以避免过拟合。
n_estimators即树的数量——树越多,方差越小,但训练成本线性上升;对 1199 条测试样本,100 棵树已足够,继续加到 500 收益甚微。 - AdaBoost:先拟合一个分类器,再在同一数据集上拟合其副本,并聚焦于被分错样本的权重,逐步修正下一个分类器。默认基学习器是决策树桩(max_depth=1)。
调参实验建议:
- Random Forest:调节
n_estimators(10/50/100/300)、max_depth(默认 None,可设 5/10/20)、max_features(默认'sqrt',可改'log2'或整数)、min_samples_split。记录「为什么增大 max_depth 会同时提升训练准确率并加剧过拟合风险」。 - AdaBoost:调节
n_estimators与learning_rate(默认 1.0,可降为 0.5、0.1)。学习率越小,每轮步长越小,通常需要更多轮数;在 baseline 中 ADA 准确率仅 72.4%,一个值得探究的实验是「降低 learning_rate 并同步增大 n_estimators,能否挽回精度」。 - 注意
random_state:对森林类模型,固定随机种子才能让两次实验具备可比性,这也是作业要求「解释参数改动原因」的前提。
完成作业的 notebook 结构建议
对照评分标准「分类器完整构建 + 参数调整 + 文本框解释改动原因」,推荐按以下结构组织提交的 notebook:
- 数据准备 cell:加载
cleaned_cuisines.csv,切分 X/y 与训练测试集(可直接复用 4-Classification/3-Classifiers-2/notebook.ipynb 前三步)。 - 基线 cell:用默认参数训练选定分类器,输出
classification_report。 - 参数扫描 cell(3~5 组):每次只改一个参数(如
C、n_neighbors、n_estimators、learning_rate、max_depth),固定其他参数与随机种子,重训并输出指标。 - 解释文本框:每组改动后紧跟 Markdown 文本框,说明「这个参数控制什么 → 改动后指标如何变化 → 为什么」。例如:「将 C 从 10 降到 0.01,准确率从 78.6% 降到 71.2%,因为 C 是误分类惩罚权重,C 过小使决策边界过于平滑,模型欠拟合」。
- 结论 cell:汇总一张对比表(参数 / 取值 / 准确率 / f1-macro / 原因分析),呼应评分标准中「详细作答」的要求。
调参实验的通用方法论
从上述五个分类器的实验中可以提炼出三条普适原则,这也是作业希望学员内化的能力:
- 一次只改一个参数:多参数同时变动无法归因,也就无法在文本框中解释「哪个改动起了作用」。
- 理解每个参数的物理含义再动手:
C是正则化强度、n_neighbors是投票范围、n_estimators是基学习器数量、learning_rate是步长、max_depth是树深——参数之间往往此消彼长(如 AdaBoost 的learning_rate与n_estimators)。 - 用指标而非直觉判断:至少同时观察
accuracy与classification_report中的 macro avg / weighted avg,因为某些改动会牺牲少数类(如本数据集的 thai)来换取整体准确率,单看 accuracy 会被误导。
课程正文的 4-Classification/3-Classifiers-2/README.md 在文末的 Challenge 中给出了同样的建议:逐一调研每个算法的默认参数,并思考调整它们对模型质量意味着什么——这正是「Parameter Play」作业与课程正文相互呼应的设计。参考实现可对照 4-Classification/3-Classifiers-2/solution/notebook.ipynb 查看五分类器的完整训练输出,R 语言版本见 4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb,可作为跨语言对照。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考