ML-For-Beginners 分类器参数调优实战:以"菜系分类器 2"课程为核心的参数实验指南
【免费下载链接】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 开源课程第四部分"Classification"第 3 课(菜系分类器 2)及其课后作业Parameter Play为主体,系统讲解如何围绕 Linear SVC、K 近邻、SVC、随机森林与 AdaBoost 五类分类器开展参数调优实验,说明每个核心参数对模型质量的影响机理。读者学完后,将能基于仓库中的cleaned_cuisines.csv数据集独立构建一个"调参—复训—解释"三合一的 Notebook,并掌握用 VS Code Intellisense 与 scikit-learn 度量工具验证参数效果的方法。
作业任务解读:Parameter Play 到底要做什么
本课作业要求(原文见 translations/da/4-Classification/3-Classifiers-2/assignment.md,英文原版见 4-Classification/3-Classifiers-2/assignment.md)非常明确,可拆解为三个动作:
- 探索默认参数:这些分类器在实例化时内置了大量默认参数,利用 VS Code 的 Intellisense(自动补全与签名提示)逐层展开构造函数的参数列表;
- 选型复训:从本课(4-Classification/3-Classifiers-2/README.md)介绍的分类技术中选取一种,通过调整不同参数值重新训练模型;
- 解释差异:产出一个 Notebook,详细说明"为什么某些参数调整提升了模型质量,而另一些却使其退化"。
评分标准同样围绕这三件事展开:达到Exemplary(示范级)需要呈现一个完整构建的分类器、完成参数调整,并在文本框(Markdown Cell)中解释每处改动;仅部分呈现或解释不清属于Adequate(合格);存在错误或缺失则为Needs Improvement(需改进)。也就是说,这篇作业的考察重点不是"调出最高分",而是对参数与模型质量因果关系的理解深度。
前置条件与数据准备
作业建立在课程假设之上:已完成此前课程,并在data目录下备好清洗后的数据集cleaned_cuisines.csv(位于 4-Classification/data/cleaned_cuisines.csv)。本课的 notebook.ipynb 已加载该数据集,并完成 X/y 切分:
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列是分类标签(indian、chinese、japanese、korean、thai),其余 380 列是 0/1 编码的食材特征。随后导入分类所需库并按 70/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)注意cross_val_score与precision_recall_curve在导入列表中已经就位——它们是调参实验中验证"参数改动是否真的有效"的重要工具(见下文第六节)。
先用分类器选择地图定方向
调参之前先要回答"该调哪个模型"。本课引用了 scikit-learn 提供的算法选择"作弊表"(cheat sheet),它比之前课程中微软的速查表更细粒度,能帮助缩小估计器(estimator,即分类器的另一称谓)的选择范围:
结合本数据集的特征,可以沿着决策路径"走"到结论:
- 样本数 > 50;
- 目标是预测类别(分类任务);
- 数据有标签(监督学习);
- 样本数 < 100K;
- ✨ 因此首选Linear SVC;
- 若效果不佳,因数据为数值型:
- 尝试 ✨KNeighbors 分类器;
- 仍不理想,再尝试 ✨SVC与 ✨集成分类器(Ensemble Classifiers)。
这条路径本身就是参数实验的"实验设计":每走一步,都是在用一组默认/预设参数验证一个假设。课程与作业正是沿着这条路径逐个构建分类器并观察结果。
逐个分类器:核心参数与默认值全解析
在 4-Classification/3-Classifiers-2/README.md 中,五个分类器被放入同一个字典,通过统一循环完成训练、预测与报告输出。这一结构非常适合做参数实验——只需修改字典中某个分类器的构造参数,即可横向对比:
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))下面逐一说明每个分类器的参数含义、默认值及其对模型质量的潜在影响——这正是作业要求"在文本框里解释"的内容。
1. Linear SVC:kernel、C、probability 与 random_state
支持向量聚类(SVC)是支持向量机(SVM)家族用于分类任务的成员。本课在构造函数中显式设置了四个参数:
kernel='linear':决定如何对标签聚类。SVC 支持多种核函数(线性、多项式、RBF 等),这里显式指定linear,确保利用"线性 SVC"的优势;C=10:即正则化参数,调节特征对模型的影响程度。C 越大,模型越倾向严格拟合每个训练样本(可能过拟合);C 越小,则允许更多误分类以换取更平滑的决策边界(可能欠拟合)。课程源码中先定义C = 10再传入,正是为了方便后续调参——这是作业改动成本最低、解释价值最高的参数之一;probability=True:默认值为False,开启后模型会额外估计概率(内部需调用 Platt 缩放),代价是训练时间增加;课程将其设为True是为了获取概率估计,便于配合precision_recall_curve等概率依赖的评估工具;random_state=0:固定随机种子以打乱数据、保证概率估计与实验可复现。调参实验必须固定 random_state,否则结果差异无法归因于参数改动。
课程运行结果为 78.6% 准确率,chinese 与 thai 的召回率偏低(0.67/0.86),提示模型对这五类菜系的区分并非均衡——这是后续参数实验可瞄准的改进点。
2. KNN 分类器:KNeighborsClassifier(C)与 n_neighbors
K 近邻(K-Neighbors)属于 "neighbors" 方法家族,可用于监督与非监督学习。它创建预定数量的"点",将数据聚集在点周围,从而对数据预测泛化标签。
课程序列中 KNN 的写法是KNeighborsClassifier(C),把原本给 SVC 用的C=10直接当作位置参数传给了 KNN——它实际落到了 KNN 的第一个构造参数n_neighbors上(邻居数 k)。这一点极具教学价值:同一个数值10,在 SVC 里是正则化强度,在 KNN 里却是邻居数量,参数语义完全由模型决定。
n_neighbors(默认 5)决定分类时参考多少个近邻样本:k 过小,决策对噪声敏感、易过拟合;k 过大,边界过于平滑、易欠拟合。课程以C=10(即 k=10)得到的准确率为 73.8%,低于 Linear SVC 的 78.6%,其中 korean 的召回率仅 0.58、precision 却高达 0.94——典型的"少数近邻主导"失衡信号。作业中可尝试 k=3、5、15 等值并解释曲线变化。
3. SVC:全默认参数的价值与风险
SVC()完全不传参数,意味着 kernel 默认为'rbf'(径向基函数)、C 默认为 1.0、probability 默认为 False。RBF 核允许非线性决策边界,因此在数值特征空间里反而取得了 83.2% 的更好成绩,明显优于显式线性设置。
这也是作业里一个绝佳的对比实验:同一个模型族(SVC),仅 kernel 与 C 不同,准确率从 78.6%(linear, C=10)跃升到 83.2%(rbf, C=1.0)。这说明"默认参数"并非简单的最优解,而是与数据分布(本数据 380 维稀疏 0/1 特征)的匹配问题。SVM 的核心思想是"将训练样本映射到空间中,最大化两个类别之间的距离",再对新数据按其在空间中的位置预测类别:
4. 集成分类器:Random Forest 与 AdaBoost 的 n_estimators
课程走到路径终点,尝试两种集成分类器:
'RFST': RandomForestClassifier(n_estimators=100), 'ADA': AdaBoostClassifier(n_estimators=100)集成方法"组合多个基估计器的预测"来提升模型质量,但两者的机制截然不同:
- Random Forest(随机森林)属于平均法(averaging):构建一片由"决策树"组成的"森林",通过注入随机性避免过拟合。
n_estimators即树的数量——太少则方差大、不稳定,太多则边际收益递减且训练变慢。课程结果 84.5%,五类菜系的 precision/recall 都较为均衡,是五个分类器中的最佳表现; - AdaBoost属于提升法(boosting):先拟合一个分类器,再在同一数据集上拟合它的副本,并聚焦于被错误分类样本的权重,逐次调整下一次拟合以纠正前序错误。
n_estimators是迭代轮数。课程结果仅 72.4%,chinese 召回率跌到 0.49——提升法在噪声标签或类别重叠较多时可能放大错误,这解释了"为什么某些参数(这里是算法机制)会降低质量"。
从源码实现看,两个模型的n_estimators参数语义相似(都指"基学习器个数"),但对质量的影响路径完全不同,是作业中"对比解释"的优质素材。
基准结果汇总:调参前先有基线
课程与官方解决方案(solution/notebook.ipynb)给出了两组可复现的基线数据。由于train_test_split未固定 random_state,两次划分略有差异,但相对排序稳定:
| 分类器 | 关键参数 | 课程基线准确率 | 解决方案准确率 |
|---|---|---|---|
| Linear SVC | kernel=linear, C=10 | 78.6% | 76.4% |
| KNN | n_neighbors=10 | 73.8% | 70.7% |
| SVC | 默认(rbf, C=1.0) | 83.2% | 80.1% |
| Random Forest | n_estimators=100 | 84.5% | 82.8% |
| AdaBoost | n_estimators=100 | 72.4% | 71.1% |
两组数字的差异本身就是一个值得在作业中讨论的现象:划分随机性也会引入结果波动。这正是调参实验必须固定
random_state(在train_test_split与模型构造处)的原因,否则无法区分"参数改善"与"抽样运气"。
系统化调参的方法论:从 Intellisense 到交叉验证
要满足作业"详细解释"的要求,建议按以下步骤组织 Notebook:
- 用 Intellisense 做参数盘点:在 VS Code 中键入
SVC(、KNeighborsClassifier(等构造函数,悬停或触发补全即可看到全部参数签名、默认值与类型。例如SVC(C=1.0, kernel='rbf', degree=3, gamma='scale', ...)、KNeighborsClassifier(n_neighbors=5, weights='uniform', ...)、RandomForestClassifier(n_estimators=100, max_depth=None, ...)。把这些默认值抄录进 Markdown 文本框,就完成了"探索"环节; - 一次只改一个参数:保持其余参数与 random_state 不变,记录准确率、precision、recall、f1-score 的变化。例如把 Linear SVC 的 C 从 10 调成 1、0.1、100,观察准确率与过拟合倾向;把 KNN 的 n_neighbors 从 5 调到 3、10、20;
- 用度量工具解释"为什么":
classification_report按类别给出 precision/recall/f1,可定位"某个参数损害了哪个类别的识别";confusion_matrix可观察具体错分模式;precision_recall_curve配合probability=True可评估阈值敏感性;cross_val_score可检验参数改动在多次折切分下是否稳健,而不是单次划分的偶然; - 区分"提升"与"退化"的机理:结合每个参数的定义给出因果解释——C 影响正则化强度与过拟合、n_neighbors 影响决策平滑度、n_estimators 影响集成稳定性、probability 影响训练代价与概率可用性。解释得越具体,越接近 Exemplary 标准。
延伸:多语言与多框架的对照实验
本课还提供了 R 语言解决方案(4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb),使用 tidymodels 生态(kernlab、ranger、xgboost、kknn等包)完成同样的分类实验,并配有 R Markdown 版 lesson_12.Rmd 与 HTML 渲染 lesson_12.html。若作业希望做到"Exemplary",可以对照 Python 与 R 两套实现,验证同一批参数(如 k 近邻的 k、随机森林的树数)在不同框架下对模型质量的影响是否一致——这既加深了对参数语义的理解,也展示了跨语言迁移调参经验的能力。
结语
Parameter Play 作业的真正价值不在于找到"最优参数",而在于建立"参数—数据—模型质量"之间的因果直觉。借助本课的五个分类器、VS Code Intellisense 的参数盘点、classification_report与cross_val_score的量化验证,以及课程与解决方案中两组基线的对照,任何学习者都能产出一个结构完整、解释详尽的调参 Notebook,达到示范级评分标准。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考