ML-For-Beginners 分类进阶:基于 Scikit-learn 路线图的五款分类器对比实战(Cuisine Classifiers 2) 📅 发布时间:2026/9/7 2:59:08 👁 浏览次数: ML-For-Beginners 分类进阶基于 Scikit-learn 路线图的五款分类器对比实战Cuisine Classifiers 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 课程4-Classification章节的第二课「Cuisine classifiers 2」展开以一份 3995 条、五国料理类别均衡的菜谱数据集为对象沿着 Scikit-learn 官方算法路线图的决策路径依次实战 Linear SVC、K-Neighbors、SVCRBF 核、Random Forest 与 AdaBoost 五款分类器记录各自的训练代码、分类报告与准确率表现。读完后你能掌握按数据画像选择估计器的决策方法以及每个分类器关键超参数C、n_neighbors、n_estimators 等的含义与调参思路。前置条件与数据准备本课程的默认假设是你已经完成了分类章节的前序课程并且在本四课文件夹根目录的data文件夹中有一份清洗好的数据集 cleaned_cuisines.csv该数据集由 Lesson 1 中整理得到。从实际数据文件可以确认其规模共3995 行样本、382 列第一列为行索引Unnamed: 0第二列为标签列cuisine其余 380 列为二值化的食材特征0/1表示该菜谱是否含某种食材五个类别完全均衡indian、thai、chinese、japanese、korean 各799 条。本课程的 notebook.ipynb 已预置好数据加载代码把数据集拆成了模型构建所需的两部分import pandas as pd cuisines_df pd.read_csv(../data/cleaned_cuisines.csv) cuisines_df.head() cuisines_label_df cuisines_df[cuisine] cuisines_label_df.head() cuisines_features_df cuisines_df.drop([Unnamed: 0, cuisine], axis1) cuisines_features_df.head()从 notebook 的四个单元格结构看准备工作只做了三件事读入 CSV、取出cuisine列作为标签y、剔除索引列和标签列后剩余 380 列食材特征作为X。数据以 DataFrame 形式就位后即可进入建模环节。该课程还提供了一份 R 语言平行实现 lesson_12.Rmd供使用 R 生态的读者参考。一张分类路线图如何走路到决策上一课Cuisine classifiers 1中课程使用微软的机器学习选择 cheat sheet 来介绍分类选项。本课则引入 Scikit-learn 版本——一张更细粒度的算法路线图即文首的 map.png它把分类、回归、聚类、降维四大任务按样本量、是否有标签、是否预测类别/数值等维度组织成可点击的决策树。当你已经对数据有清晰把握时可以沿着图上的分支走出一条确定的路线。对本数据集而言决策过程是样本数 50实际 3995 条目标是预测一个类别cuisine数据是有标签的监督学习样本数 10 万于是路线指向 ✨Linear SVC线性支持向量分类器如果效果不佳——由于我们的数据是数值型特征——可以继续尝试 ✨KNeighbors Classifier仍不理想时升级到 ✨SVC与 ✨Ensemble Classifiers集成分类器。这正是本课实验的完整脚本五个分类器按路线图顺序逐一登场。实验准备导入库并划分训练/测试集导入所需库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_size0.3)test_size0.3意味着约 30% 的样本1199 条进入测试集其余约 2796 条用于训练——后续每份 classification_report 中的support合计 1199 正对应这个划分。Linear SVC 分类器支持向量分类SVC属于支持向量机SVM家族的一个分支。SVC 的关键参数在本课中都有明确取值参数本课取值含义kernellinear核函数决定如何划分类别簇取linear即利用 Linear SVCC10正则化强度约束参数权重的影响大小probabilityTrue默认关闭打开后可获得概率估计random_state0固定随机种子配合概率估计时对数据洗牌过程可复现实验构建分类器字典并训练课程建议用一个字典统一管理所有分类器后续每测试一款就向字典追加一项C 10 # Create different classifiers. 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)把标签 DataFrame 压平为一维数组避免 fit 收到形状不符的二维标签其二打印语句虽写着 Accuracy (train)实际计算的是accuracy_score(y_test, y_pred)即测试集准确率——阅读输出时不要混淆。Linear SVC 的结果已经相当不错测试集准确率78.6%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 1199K-Neighbors 分类器K-Neighbors 属于机器学习中的邻居方法族同时可用于监督与无监督学习先产生一组预先定义数量的参考点把数据聚集在这些点周围从而为数据预测泛化的标签。对本数据集KNN 直接沿用了上面的C 10作为邻居数。实验追加 KNN 到分类器字典上一款分类器表现不错但或许还能更好。在字典的 Linear SVC 项后补一个逗号追加KNN classifier: KNeighborsClassifier(C),注意这里把C作为了KNeighborsClassifier的第一个位置参数即n_neighbors10——同一个数值 10在 SVC 里是正则化系数在 KNN 里是邻居数含义完全不同。结果略逊于 Linear SVC测试集准确率73.8%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从报告可以看出 KNN 的短板在 korean 类precision 高达 0.94 但 recall 只有 0.58即判为韩料的多数是对的但大量韩料菜谱被漏判——邻居法在特征高度稀疏、维度高达 380 的食材空间中受距离度量稀释的影响比线性模型更明显。Support Vector 分类器默认 RBF 核支持向量分类器是 SVM 家族的成员用于分类与回归任务。SVM 的直观思想是把训练样本映射到空间中的点并最大化两类之间的间隔后续新数据被映射进这个空间后即可预测其类别。实验追加默认配置的 SVC在 KNN 项后加逗号追加一行SVC: SVC(),不传任何参数即采用 Scikit-learn 默认配置默认核为 RBFC1.0。结果有了明显提升达到83.2%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与 Linear SVC 对比可以看到非线性 RBF 核把 korean 的 recall 从 0.81 提到 0.82 以上chinese 的 precision 从 0.71 提到 0.79说明食材特征之间的非线性组合关系确实存在且被 RBF 核捕捉到了。集成分类器Random Forest 与 AdaBoost即使上一轮结果已经相当好课程仍要求把路线图走到终点尝试集成分类器——具体是 Random Forest 与 AdaBoost。RFST: RandomForestClassifier(n_estimators100), ADA: AdaBoostClassifier(n_estimators100)两者的机制各有侧重Random Forest是一种平均法averaging集成构建一片由随机性注入的决策树森林以避免过拟合n_estimators参数即树的棵数本课设为 100。AdaBoost采用 boosting策略先对一个数据集拟合一个分类器再用同样的分类器在同一数据上反复拟合逐步把权重集中到被分错的样本上并调整后续分类器的拟合以纠正这些错误。结果中 Random Forest 成为全场最佳84.5%AdaBoost 则垫底72.4%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 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 1199集成的本质是融合多个基估计器的预测以提升模型质量。Random Forest 在五个类别上的 precision/recall 全面均衡AdaBoost 则暴露出典型问题——chinese 类 recall 仅 0.49说明 boosting 对稀疏高维特征上的弱学习器组合并不占优。五款分类器对比汇总分类器关键参数测试集准确率优势类别按 f1薄弱类别Linear SVCkernellinear, C10, probabilityTrue78.6%indian (0.87)chinese (0.69)KNNn_neighbors1073.8%indian (0.82)korean (0.72)SVC默认 RBF默认参数83.2%indian (0.89)chinese (0.76)Random Forestn_estimators10084.5%indian (0.90)chinese (0.78)AdaBoostn_estimators10072.4%indian (0.87)chinese (0.56)可以看出两个跨模型的规律indian 类在所有分类器下都最易识别chinese 类则始终最难——这提示类别难度既来自模型也来自特征本身的判别力而路线图顺序Linear SVC → KNN → SVC → Ensemble在本数据上大体对应着准确率的爬升路径。挑战与课后作业玩转超参数课程给出的挑战是这些技术各自都有大量可调参数。去查阅它们的默认参数并思考调整这些参数对模型质量意味着什么。具体到本课用到的五个估计器值得重点研究的参数包括SVC / Linear SVCC正则化强度、kernellinear/rbf/poly 等、gamma、probabilityKNeighborsClassifiern_neighbors、weightsuniform 或 distance、metric距离度量、pRandomForestClassifiern_estimators树棵数、max_depth、min_samples_split、class_weightAdaBoostClassifiern_estimators、learning_rate、algorithmSAM/SAM_E/ADA通用验证工具cross_val_score本课导入但留给读者在挑战中实践、confusion_matrix、precision_recall_curve。正式作业见 assignment.md「Parameter Play」选定本课任一分类技术调整不同参数值重新训练并产出一份解释哪些改动提升了模型质量、哪些导致退化的 notebook评分标准rubric要求完整构建分类器、逐项调参并用文字解释每处改动。完整可运行的参考实现位于 solution/notebook.ipynb其中分类器字典一次性包含全部五个估计器训练循环与上文一致R 语言版本参考 solution/R/lesson_12.Rmd。小结本课以一份 3995 条五类均衡的菜谱二值特征数据为载体完整演示了按 Scikit-learn 路线图选模型 → 逐一实验 → 用 classification_report 对比 → 归纳调参方向的经典机器学习工作流。最终 Random Forest 以 84.5% 的测试集准确率胜出而 AdaBoost 的落后则提醒我们集成并非万能算法选择必须结合数据特征维度、稀疏度、类别结构来判断。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考