ML-For-Beginners 系列实战:用 Scikit-learn 多分类器识别亚洲菜系(Linear SVC、KNN、SVC 与集成分类器对比) 📅 发布时间:2026/9/10 21:27:56 👁 浏览次数: ML-For-Beginners 系列实战用 Scikit-learn 多分类器识别亚洲菜系Linear SVC、KNN、SVC 与集成分类器对比【免费下载链接】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」单元第三节Cuisine classifiers 2的技术指南聚焦于在已清洗的cleaned_cuisines.csv菜谱数据集上按 Scikit-learn 官方「机器学习选择地图」的决策路径依次训练 Linear SVC、K-Neighbors、SVC、Random Forest 与 AdaBoost 五种分类器并用精度accuracy与分类报告classification report横向对比选择哪个分类器、放弃哪个分类器的后果。读完本文你将掌握一套可复用的多分类器快速筛选流程并理解每个核心超参数C、kernel、n_neighbors、n_estimators对模型质量的真实影响。前置条件与数据准备本节课程建立在前面两课的基础上上一课Cuisine classifiers 1已经完成了数据清洗并示范了 Logistic Regression 作为基准分类器。本课的前提是已完成前面的课程data目录下存在清洗后的数据集 cleaned_cuisines.csv位于 4-Classification 四课共享的 data 根目录在 notebook.ipynb 中已加载数据并拆分出特征矩阵 X 与标签向量 y。数据形态notebook 中的实际加载逻辑课程 notebook 前三步展示了数据如何从 CSV 变成可训练的结构完整代码见 notebook.ipynbimport pandas as pd cuisines_df pd.read_csv(../data/cleaned_cuisines.csv) cuisines_df.head()该数据集每行对应一份菜谱样本cuisine列为标签indian / chinese / japanese / korean / thai其余数百列是二值化的配料特征1 表示使用该配料cuisines_label_df cuisines_df[cuisine] # 标签 cuisines_features_df cuisines_df.drop([Unnamed: 0, cuisine], axis1) # 特征380 列一张分类选择地图沿路径做决策在上一课你接触过 Microsoft 的算法速查表Algorithm Cheat Sheet。Scikit-learn 提供了粒度更细的官方「机器学习地图」上文的配图即 scikit-learn 文档中的 machine learning map它通过一系列分支条件帮你收窄估计器estimator即分类器的选择范围。沿地图路径行走可以得到本课数据集对应的决策链样本数 50目标是预测类别分类问题拥有带标签的数据监督学习样本数 100K✨ 首选Linear SVC若效果不佳由于数据是数值型的尝试KNeighbors Classifier仍不理想再尝试SVC与Ensemble集成分类器这套由简到繁、逐步升级的路线正是本课实验的主线我们最终会把这些分类器逐一加入一个字典统一训练、统一评估。第一步导入库并拆分数据按地图路径先导入本课需要的全部库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然后按 70% / 30% 划分训练集与测试集X_train, X_test, y_train, y_test train_test_split(cuisines_features_df, cuisines_label_df, test_size0.3)test_size0.3表示 30% 样本留作测试。注意train_test_split默认随机打乱数据因此每次运行的切分不同最终精度会略有波动——这一点在后面对比课程示例输出与 solution/notebook.ipynb 中实际运行输出时可以看到例如 Linear SVC 在课程文档里是 78.6%在 solution 笔记本里是 76.4%。Linear SVC首选分类器Support Vector ClusteringSVC是支持向量机Support Vector Machine家族的成员。在这类方法中你可以通过kernel核函数决定标签如何被分组用C正则化参数调节误分类容忍度与决策边界复杂度之间的平衡。本课关键参数含义参数取值含义kernellinear使用线性核得到 Linear SVC也可选 rbf、poly、sigmoid 等C10正则化参数控制对误分类样本的惩罚强度probabilityTrue默认False置为True以启用predict_proba概率估计会额外引入交叉验证开销random_state0固定随机种子保证数据打乱与训练结果可复现实验一训练 Linear SVC把分类器放入字典便于后续统一循环C 10 # 创建不同的分类器 classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue, random_state0) }统一训练并打印报告n_classifiers len(classifiers) 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))np.ravel(y_train)将 (n,1) 形状的标签列展平为一维数组这是 fit 方法的输入要求。课程示例输出一次随机切分下的结果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 macro avg 0.79 0.79 0.79 1199 weighted avg 0.79 0.79 0.79 1199结果相当不错。分类报告中的关键术语precision查准率预测为该类的样本中预测正确的比例、recall查全率真实为该类的样本中被找回的比例、f1-score两者调和平均、support该类别在测试集中的样本数、macro avg各类别指标简单平均、weighted avg按样本数加权的平均。indian 类别表现最好precision 0.88chinese 与 thai 相对偏弱说明这两类菜系的配料特征区分度较低。K-Neighbors 分类器邻居投票K-Neighbors 属于 neighbors近邻方法族可用于监督与无监督学习。其思路是为数据创建预定义数量K的邻近点将数据聚集在这些点周围通过邻居多数投票预测广义标签。实验二在字典中追加 KNN在 Linear SVC 条目后加逗号并新增一行classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue, random_state0), KNN classifier: KNeighborsClassifier(C), }从源码调用看这里把前面定义的C 10直接传给了KNeighborsClassifier即n_neighbors10——意味着每个样本由最近的 10 个邻居投票决定类别。这是课程刻意展示的一个细节参数可以复用但语义完全不同对 KNN 而言C并不是正则化项而是邻居数 K。课程示例输出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 macro avg 0.76 0.74 0.74 1199 weighted avg 0.76 0.74 0.74 1199比 Linear SVC 略差。注意 korean 的 precision 高达 0.94 但 recall 只有 0.58说明模型对韩餐过度保守——大量真实韩餐样本未被召回。这展示了只看单一指标的陷阱不同类别间的 precision/recall 失衡需要用 f1-score 与整体 accuracy 综合判断。Support Vector Classifier默认参数再试一轮SVC 属于支持向量机家族用于分类与回归任务。SVM 将训练样本映射为空间中的点并最大化两个类别之间的间隔margin后续数据被映射到同一空间后即可按位置预测类别。下图展示了线性可分情况下的间隔选择H1 无法分离两类H2 虽然可分但间隔很小H3 以最大间隔完美分离图片来源见 images/svm.png由 R 版本课程文档引用自维基共享资源。实验三在字典中追加默认 SVCclassifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue, random_state0), KNN classifier: KNeighborsClassifier(C), SVC: SVC(), }这里直接使用SVC()全部默认参数默认 RBF 径向基核、C1与前面显式指定线性核的 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 1199 macro avg 0.84 0.83 0.83 1199 weighted avg 0.84 0.83 0.83 1199结果相当好——默认的 RBF 核能够刻画非线性的类别边界在所有类别上均优于前面的方案这正说明了地图上如果 Linear SVC 不行再试 SVC的合理性。集成分类器Random Forest 与 AdaBoost集成方法Ensemble通过组合多个基学习器的预测来提升模型质量是本课地图路径的终点。我们尝试两种代表性方法classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue, random_state0), KNN classifier: KNeighborsClassifier(C), SVC: SVC(), RFST: RandomForestClassifier(n_estimators100), ADA: AdaBoostClassifier(n_estimators100) }Random ForestBagging平均法Random Forest是平均法averaging method它构建一棵决策树之森每棵树注入随机性随机抽样样本与特征以避免过拟合。n_estimators参数即森林中树的数量这里设为 100。课程示例输出Accuracy (train) for RFST: 84.5% precision recall f1-score support chinese 0.80 0.77 0.78 242 indian 0.89 0.92 0.90 234 japanese 0.86 0.84 0.85 254 korean 0.88 0.83 0.85 242 thai 0.80 0.87 0.83 227 accuracy 0.84 1199 macro avg 0.85 0.85 0.84 1199 weighted avg 0.85 0.84 0.84 1199这是本课全部实验中的最佳结果84.5%且各类别表现均衡。AdaBoostBoosting提升法AdaBoost先对数据集拟合一个分类器再反复拟合该分类器的副本它聚焦于被错误分类样本的权重并调整下一个分类器的拟合过程加以纠正从而逐步降低整体误差。课程示例输出Accuracy (train) for ADA: 72.4% precision recall f1-score support chinese 0.64 0.49 0.56 242 indian 0.91 0.83 0.87 234 japanese 0.68 0.69 0.69 254 korean 0.73 0.79 0.76 242 thai 0.67 0.83 0.74 227 accuracy 0.72 1199 macro avg 0.73 0.73 0.72 1199 weighted avg 0.73 0.72 0.72 1199AdaBoost 在本数据集上表现不佳72.4%chinese 类的 recall 仅 0.49——几乎所有中餐样本都被漏掉了。这说明集成方法并非总是越复杂越好不同基学习器的适用场景差异很大。结果横向对比与选择启示综合课程文档示例输出详见 README.md 与 solution/notebook.ipynb五种分类器的整体 accuracy 排名为分类器关键参数整体 accuracy课程示例输出Random Forestn_estimators10084.5%SVC默认 RBF 核全部默认83.2%Linear SVCkernellinear, C1078.6%K-Neighborsn_neighbors1073.8%AdaBoostn_estimators10072.4%几点可验证的结论默认 SVC 优于显式 Linear SVCRBF 核能建模非线性边界对本数据集更合适Random Forest 综合最优且稳定bagging 平均策略有效抑制了过拟合AdaBoost 反而最差对高维稀疏的配料二值特征提升法可能过度聚焦于难以学习的样本结果存在随机性train_test_split未固定随机种子时每次运行的切分不同。在 solution/notebook.ipynb 的实际运行输出中五者的精度分别为 76.4% / 70.7% / 80.1% / 82.8% / 71.1%——相对排名与课程示例一致但绝对数值不同。因此对比模型时应固定随机种子或采用交叉验证课程已导入cross_val_score备用。R 语言对照实现仓库补充仓库为每一课提供了 R/tidymodels 对照版本完整实现见 solution/R/lesson_12-R.ipynb其中核心差异点包括用tidymodels的workflow()把数据预处理recipe与模型spec绑定成工作流用themis::step_smote()对训练集做 SMOTE 过采样处理类别不平衡Python 版本课未做此步这是两套实现的重要差异线性 SVC 通过svm_poly(degree 1)实现RBF-SVM 用svm_rbf()KNN 用nearest_neighbor()随机森林用rand_forest()提升树用boost_tree()xgboost 引擎通过purrr::map()封装compare_models()函数批量拟合多个工作流并一次性输出 accuracy、sensitivity、ppv、f_meas 指标。安装 R 依赖install.packages(c(tidyverse, tidymodels, kernlab, themis, ranger, xgboost, kknn))。挑战与延伸参数调优上述每种技术都有大量可调参数例如SVC / Linear SVCC正则化强度、kernel核函数类型、gammaRBF 核的影响半径KNNn_neighbors邻居数、weights距离权重、p距离度量Random Forestn_estimators树的数量、max_depth树深、max_features每棵树随机选取的特征数AdaBoostn_estimators弱学习器数量、learning_rate学习率。本课配套作业 Parameter play 要求你选取本课的一种分类技术逐个调整参数重新训练模型并用文字在 notebook 中解释为什么某些参数改动提升模型质量、另一些则使其退化。实操时可在 VS Code 中利用 Intellisense 查看每个参数的原生默认值与取值范围。复习与推荐路径术语繁多时可回到课程第 2 课 Cuisine classifiers 1 复习逻辑回归与 solvers 的对比表。完整可运行的代码入口有本课工作笔记本notebook.ipynb数据加载与特征/标签拆分完整答案笔记本solution/notebook.ipynb五种分类器训练与分类报告输出R 语言对照solution/R/lesson_12-R.ipynb下一课将继续把训练好的模型落地为 Web 应用Applied ML: build a web app掌握按地图选路 → 字典批量训练 → 分类报告逐类诊断这套流程后你就可以把同样的方法迁移到任何带标签的数值分类问题上。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考