用 Scikit-learn 训练多分类器ML-For-Beginners 中的菜系分类实战——从 solver 选择到分类报告解读【免费下载链接】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 课程第 10 课Cuisine classifiers 1完整复现根据一组食材预测其所属菜系的多分类建模流程如何从 Scikit-learn 众多分类算法中做出选择、如何为LogisticRegression正确指定multi_class与solver参数、如何用train_test_split划分数据以及如何用predict_proba和classification_report深入评估模型。学完本篇你可以独立完成一个可解释的多分类器训练与评估闭环。上图来自课程原文展示 Scikit-learn 不同分类器KNeighbors、SVC、GaussianProcess、DecisionTree、RandomForest、MLP、AdaBoost、GaussianNB 等在同一数据集上绘制的决策边界直观说明同一个问题、不同算法的差异。数据集五类亚洲/印度菜系的平衡矩阵本课延续上一课 Introduction to classification 的工作原始数据 cuisines.csv 经过清洗与 SMOTE 过采样后保存为 cleaned_cuisines.csv。该文件的实际结构为3995 行样本恰好是 5 个菜系indian、chinese、japanese、korean、thai各 799 行——这正是上一课对数据进行类别平衡的结果382 列1 列无名列Unnamed: 0原始索引、1 列标签cuisine、其余380 列食材特征almond、angelica、anise……zucchini每列取值 0/1表示该食材是否出现在这道菜中。也就是说输入是一个高度稀疏的 0/1 特征矩阵输出是 5 个类别之一的标签。这种标签完全平衡 特征高度稀疏的数据结构将直接影响后面求解器solver的选择。数据就绪后用 Pandas 读入在本课目录 notebook.ipynb 中工作时路径为../data/cleaned_cuisines.csv相对仓库根目录则是 4-Classification/data/cleaned_cuisines.csvimport pandas as pd cuisines_df pd.read_csv(../data/cleaned_cuisines.csv) cuisines_df.head()准备特征与标签拆分 X 和 y多分类建模的第一步是把标签列和特征列拆开。课程给出的完整做法# 标签 cuisines_label_df cuisines_df[cuisine] cuisines_label_df.head() # 0 indian # 1 indian # 2 indian # ... # Name: cuisine, dtype: object # 特征丢弃无名列和标签列其余 380 列食材作为可训练特征 cuisines_feature_df cuisines_df.drop([Unnamed: 0, cuisine], axis1) cuisines_feature_df.head()丢弃Unnamed: 0是必要的——它是原始 CSV 的行号对模型没有任何信息量。这一步在仓库中的参考实现 solution/notebook.ipynb 里有逐格对应可以对照学习。需要导入的库课程原文清单完整保留from sklearn.linear_model import LogisticRegression 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 from sklearn.svm import SVC import numpy as np如何选择分类器从 Scikit-learn 算法族到约束推理Scikit-learn 把分类归在监督学习Supervised Learning之下可选的算法族包括线性模型Linear Models支持向量机Support Vector Machines随机梯度下降Stochastic Gradient Descent近邻Nearest Neighbors高斯过程Gaussian Processes决策树Decision Trees集成方法Ensemble methods如 Voting Classifier多分类/多输出算法multiclass、multilabel、multiclass-multioutput神经网络同样可以做分类但课程明确将其排除在本课范围之外。面对如此多的选择课程提出了两条实用路径横向对比法直接跑多个分类器看结果。Scikit-learn 官方就提供了 KNeighbors、两种 SVC、GaussianProcessClassifier、DecisionTreeClassifier、RandomForestClassifier、MLPClassifier、AdaBoostClassifier、GaussianNB、QuadraticDiscriminationAnalysis 的并排决策边界对比图即文章开头那张 comparison.png。查阅算法速查表课程推荐参考微软的 ML Algorithm Cheat Sheet其中多分类multiclass一栏给出的候选算法包括决策树、随机森林、支持向量机Linear SVM、SVM、逻辑回归多分类、朴素贝叶斯、神经网络、KNN 等课程原文建议下载这张速查表打印出来挂墙上。结合本课数据做约束推理课程进一步演示了如何用数据本身的约束来缩小范围这套推理过程比速查表更有价值神经网络太重。数据虽然干净但规模小不到 4000 行 × 380 列的稀疏 0/1 矩阵且训练在本地 notebook 中运行神经网络是过重的选择。不用二分类器。这是 5 类问题纯 two-class 方案如 one-vs-all 的两分类框架本身不在候选之列——注意这里被排除的是把它当二分类问题的思路而不是 OvR 多分类方案。决策树或逻辑回归都可能可行。决策树可以直接处理多类逻辑回归有成熟的多分类扩展。多分类 Boosted Decision Trees 解决的是另一类问题。提升决策树Boosted Trees最适合非参数任务例如构建排序ranking的场景对本课的分类任务不合适。最终本课选中的方案是逻辑回归 多分类设置。逻辑回归的两个关键参数multi_class 与 solver逻辑回归天然面向二分类扩展到多分类需要两个配置multi_class分类方案与solver优化算法且二者并非任意可组合。课程原文对这两个参数的说明值得完整保留multi_classovrone-vs-rest一对多为每个类别训练一个该类 vs 其余所有类的二分类器multi_classmultinomial多项分布使用交叉熵损失直接优化多类联合分布。课程引用文档指出multinomial目前仅被lbfgs、sag、saga、newton-cg这几个 solver 支持solver定义为用于优化问题的算法即底层数值优化器。不同 solver 对数据形态的适应能力各有差异Scikit-learn 官方有一张对照表说明每个求解器适用于何种数据规模、是否需要稀疏输入、是否支持 L1/L2 惩罚等对本题来说有两个值得注意的点特征是0/1 稀疏矩阵380 列中绝大多数为 0liblinear这类支持稀疏输入且擅长中小型数据集的求解器是自然选择liblinear本身只支持ovr方案不支持multinomial因此multi_classovrsolverliblinear是一个自洽的组合如果想用multinomial必须换到lbfgs/sag/saga/newton-cg之一。划分训练集与测试集选定算法后调用train_test_split划分数据。课程采用 30% 测试集X_train, X_test, y_train, y_test train_test_split(cuisines_feature_df, cuisines_label_df, test_size0.3)由于没有设置random_state每次运行时划分略有不同评估数值也会有小幅波动。按 3995 行 × 30% 计算测试集约 1199 行每类约 240 行上下这与课程文档中classification_report输出的 support 总数 1199 完全吻合。训练多分类逻辑回归模型并查看单样本预测按课程要求用multi_classovr与liblinear求解器训练lr LogisticRegression(multi_classovr, solverliblinear) model lr.fit(X_train, np.ravel(y_train)) accuracy model.score(X_test, y_test) print(Accuracy is {}.format(accuracy))几个细节np.ravel(y_train)标签是 Pandas Seriesravel将其展平为一维数组课程也提示可用 Pandas 的Series.ravel。OvR 内部要为每个类别分别训练二分类器并共享同一份特征矩阵课程原文给出的结果是准确率超过 80%课程建议再试lbfgsScikit-learn 常见的默认 solver对比效果。检查单条样本的模型视角课程选测试集中第 50 行作为解剖样本先看它包含哪些食材print(fingredients: {X_test.iloc[50][X_test.iloc[50]!0].keys()}) print(fcuisine: {y_test.iloc[50]}) # ingredients: Index([cilantro, onion, pea, potato, tomato, vegetable_oil], dtypeobject) # cuisine: indian然后让模型输出每个类别的预测概率test X_test.iloc[50].values.reshape(-1, 1).T # 展平为 1×380 行向量 proba model.predict_proba(test) classes model.classes_ resultdf pd.DataFrame(dataproba, columnsclasses) topPrediction resultdf.T.sort_values(by[0], ascending[False]) topPrediction.head()课程记录的结果0indian0.715851chinese0.229475japanese0.029763korean0.017277thai0.007634模型最可能的猜测是印度菜且给出了较高的置信度。课程留了一个思考题你能解释模型为什么比较确定这是印度菜吗——从 OvR 的角度这相当于 5 个该类 vs 其余二分类器对香菜、洋葱、豌豆、土豆、番茄、植物油这组食材组合各自投票后综合出的结果从特征矩阵看这一组食材在 799 条印度菜样本中的出现模式显著区别于其他四类。输出分类报告classification report单看整体准确率会掩盖类别间的差异课程要求输出更细的报告y_pred model.predict(X_test) print(classification_report(y_test, y_pred))课程记录的结果测试集 1199 行precisionrecallf1-scoresupportchinese0.730.710.72229indian0.910.930.92254japanese0.700.750.72220korean0.860.760.81242thai0.790.850.82254accuracy0.801199macro avg0.800.800.801199weighted avg0.800.800.801199从这张表可以读出几层信息印度菜是区分度最高的类precision 0.91 / recall 0.93印度菜常用香料组合如孜然、姜黄、咖喱粉类特征与其他四类食材重叠最少日料是最难的一类precision 0.70这与日料少油少料的清淡风格导致 0/1 特征向量整体偏稀疏、更容易与他类混淆的直觉一致——这一点是从数据形态推断的仓库文档未直接给出结论support 列各约 240 上下验证了上一课平衡数据的效果5 类在测试集中近似等量macro avg 与 weighted avg 因此几乎相等。挑战与课后作业课程给出的挑战Challenge是通读 Scikit-learn 提供的各种分类选项并深入挖掘solver背后的机制。配套作业 Study the solvers 要求从课程列出的 solver 中任选两个用自己的话对比——它们解决什么类型的问题如何配合不同的数据结构工作什么情况下会选 A 而不选 B其评分标准要求用两段文字分别论述两个 solver 并进行有见地的比较。小结本课程的完整技术脉络可以概括为一条可复现的链路使用上一课产出的平衡、干净的 cleaned_cuisines.csv3995 行 × 380 个食材 0/1 特征5 类各 799 行用drop()拆出特征矩阵 X 与标签序列 y通过数据规模 → 算法族的约束推理在多候选中选定逻辑回归依据稀疏 0/1 特征 支持稀疏输入这一数据结构特征选择multi_classovrsolverliblinear的自洽组合以test_size0.3划分数据训练后获得 80% 以上的准确率用predict_proba解剖单样本置信度用classification_report暴露类别间的强弱差异indian 最强、japanese 最弱。完整可运行的代码见 solution/notebook.ipynb练习空白模板见 notebook.ipynb。本课结束时模型只是第一枪——后续课程Classifiers-2 及之后会在此基础上引入随机森林、SVM 等更强的分类器并讨论混淆矩阵与特征重要性可以顺着 4-Classification 目录继续学习。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考