ML-For-Beginners 实战用 Scikit-learn 多分类器对比实验为菜品数据选出最佳分类模型【免费下载链接】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 / 3-Classifiers-2」一课对应 translations/el/4-Classification/3-Classifiers-2/README.md内容与英文原版一致以清理后的多国菜品数据cleaned_cuisines.csv为样本带领读者沿着 Scikit-learn 官方算法选择地图ML Map依次尝试 Linear SVC、KNN、SVC 与集成分类器Random Forest、AdaBoost并学会用classification_report逐类评估精度、召回率与 F1 值。读完本文你将掌握一套可复制的多分类器对比方法论并理解为什么某些分类器在该数据上表现更好这一选择背后的原理。该地图即课程中引用的 Scikit-learn cheat sheet点击图中各节点对应的路径即可阅读官方文档用于逐步缩小候选分类器范围。前置条件与准备课程假设你已完成前序课程1-Introduction、2-Classifiers-1并已获得清理后的数据集数据文件位于 4-Classification/data/cleaned_cuisines.csv即本 4 课文件夹根部的data目录数据形态约 3995 条样本不含表头每条样本为一道菜recipe以cuisine列为类别标签其余 380 列是各食材的 0/1 布尔特征课程配套 notebook4-Classification/3-Classifiers-2/notebook.ipynb 中已将数据划分为 X特征与 y标签两个 DataFrame可直接进入建模环节。在 notebook 中完成数据加载与特征/标签拆分的关键代码为与 2-Classifiers-1 承接import pandas as pd cuisines_df pd.read_csv(../data/cleaned_cuisines.csv) cuisines_label_df cuisines_df[cuisine] # y标签列 cuisines_features_df cuisines_df.drop([Unnamed: 0, cuisine], axis1) # X特征列分类地图如何为你的数据挑选分类器前一课学习了微软的 cheat sheet而 Scikit-learn 提供了一张更细粒度的决策地图。当地图配合你对数据的清晰认知时你可以沿着路径一步步走到答案样本数 50目标预测一个类别数据有标签监督学习样本数少于 100K✨ 可以选择Linear SVC如果效果不理想由于我们是数值型数据可以尝试 ✨KNeighbors 分类器如果还不行再试 ✨SVC与 ✨集成分类器Ensemble Classifiers。这条路径正是本课实验的主线从线性 SVM 出发逐步扩展到近邻、核 SVM 与集成方法。第一步导入库并切分数据沿用地图路径先导入所需库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切分训练集与测试集保留 30% 作为测试集X_train, X_test, y_train, y_test train_test_split(cuisines_features_df, cuisines_label_df, test_size0.3)Linear SVC 分类器支持向量聚类SVC属于支持向量机SVM技术家族。核心概念kernel核函数决定标签如何被聚簇分隔可选线性核、多项式核、RBF 核等C正则化参数调节参数的影响力C 越大对误分类的惩罚越重边界越严格probability默认False设为True可输出概率估计内部会额外做 Platt 缩放random_state设为0以固定数据洗牌顺序保证结果可复现。实践应用线性 SVC先创建一个分类器字典后续所有模型都逐步追加进该字典统一训练与评估C 10 # 创建不同分类器 classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue,random_state0) }统一训练循环注意np.ravel(y_train)把标签压成一维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))输出结果相当不错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 近邻K-Neighbors属于neighbors家族可用于监督与非监督学习。方法上先确定一个预设数量的点数据围绕这些点聚集从而对数据预测出泛化标签。实践应用 K-Neighbors在上一个分类器后加一行注意补上逗号classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue,random_state0), KNN classifier: KNeighborsClassifier(C), }结果略逊于 Linear SVCAccuracy (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 类召回率仅 0.58大量漏检整体准确率掉到 73.8%。这提示我们稀疏高维的 0/1 食材特征下基于距离的 KNN 对邻居数量此处直接复用了C10作为邻居数非常敏感。SVC 分类器支持向量分类器是 SVM 家族成员用于分类与回归任务。SVM 将训练样本映射到空间中的点并最大化两个类别之间的间隔新数据被映射进该空间后即可预测其类别。下图直观展示了不同超平面对类别的分隔效果H1 无法分开、H2 间隔小、H3 以最大间隔分隔实践应用 SVC在 K-Neighbors 项后追加classifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue,random_state0), KNN classifier: KNeighborsClassifier(C), SVC: 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默认SVC()使用 RBF 核能捕捉非线性类别边界因此显著优于线性核版本也比 KNN 高约 10 个百分点。集成分类器Ensemble Classifiers尽管 SVC 已表现很好我们仍沿着地图走到底尝试集成分类器——随机森林Random Forest与 AdaBoostclassifiers { Linear SVC: SVC(kernellinear, CC, probabilityTrue,random_state0), KNN classifier: KNeighborsClassifier(C), SVC: SVC(), RFST: RandomForestClassifier(n_estimators100), ADA: AdaBoostClassifier(n_estimators100) }结果非常好尤其 Random ForestAccuracy (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随机森林一种平均化averaging / bagging方法构建由随机注入的决策树组成的森林以抑制过拟合。n_estimators即森林中树的数量此处 100 棵AdaBoost先在数据集上拟合一个分类器再在同一数据集上拟合该分类器的多个副本聚焦于被错误分类样本的权重并为下一个分类器调整拟合以修正错误boosting。从结果看AdaBoost72.4%在本数据集上效果不佳chinese 的召回率仅 0.49——说明它对弱学习器与噪声特征的组合并不适配这组高维稀疏特征。五种分类器横向对比分类器关键参数本课取值测试集准确率观察要点Linear SVCkernellinear,C10,probabilityTrue78.6%线性边界快速稳健KNNn_neighborsC复用 1073.8%对高维稀疏特征与邻居数敏感SVC默认RBF 核83.2%核技巧捕捉非线性边界Random Forestn_estimators10084.5%bagging 集成本课最佳AdaBoostn_estimators10072.4%boosting 在此数据上反而欠佳这组对比清晰体现了选择分类器的代价没有万能的模型必须结合数据形态样本量、特征稀疏性、类别是否可分与评估指标综合决策。深入验证仓库配套实现本课仓库内提供了可直接运行验证的完整实现4-Classification/3-Classifiers-2/solution/notebook.ipynb将上述 5 个分类器一次性放入字典统一训练与评估代码与本课完全一致是复现所有输出报告的权威参考4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynbR 语言 tidymodels 版本使用svm_poly(degree1)线性 SVC、svm_rbf()、nearest_neighbor()、rand_forest()与boost_tree()复刻同一实验并额外演示了 SMOTE 处理类别不平衡、workflowset批量比较多个模型数据源4-Classification/data/cleaned_cuisines.csv。从 solution notebook 可以看到R 版实验还强调了不平衡数据的处理过采样/欠采样这也是影响多分类器表现差异的重要因素可作为深入研究的起点。挑战与作业参数游戏每个分类器都有大量可调参数。本课的挑战见 4-Classification/3-Classifiers-2/assignment.md 与课程挑战节要求调查每个分类器的默认参数可用 VS Code 的 Intellisense 查看签名与默认值选取本课任一分类技术反复调整参数并重新训练模型在 notebook 中用文本框详细解释为什么某些参数改动提升模型质量、另一些则使其退化。值得尝试的调整方向SVC改变C正则化强弱、更换kernelrbf/poly/sigmoid与gammaKNN调整邻居数n_neighbors与距离度量metricRandom Forest调整n_estimators、max_depth、max_featuresAdaBoost调整n_estimators与learning_rate。建议同时观察cross_val_score交叉验证结果避免仅凭单次切分下的准确率下结论。小结本课完整演示了用分类地图缩小候选 → 字典化批量训练 → 分类报告逐类诊断的多分类器实验流程。在 380 维稀疏食材特征上Random Forest84.5%与 RBF-SVC83.2%明显优于线性 SVC78.6%、KNN73.8%与 AdaBoost72.4%说明非线性模型与 bagging 集成更契合本数据的类别结构。掌握这套对比方法后你可以将其迁移到任何有标签的表格分类任务中。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考