ML-For-Beginners 实战:用 Scikit-learn 逻辑回归构建多类菜系分类器
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 / 2-Classifiers-1」课程对应西班牙语文档 translations/es/4-Classification/2-Classifiers-1/README.md的完整技术讲解。课程围绕一份已经过清洗与平衡的亚洲菜系数据集cleaned_cuisines.csv演示如何选用合适的分类算法仅凭一组食材配料预测一道菜属于哪个国家的菜系。读完本文你将掌握 scikit-learn 中分类模型的完整工作流数据加载与特征/标签拆分、分类器选型推理、LogisticRegression的multi_class与solver参数组合、模型训练、单样本概率预测以及classification_report的解读。前置准备一份干净又平衡的菜系数据本课不从头清洗数据而是直接使用上一课4-Classification/1-Introduction/README.md产出的成果。在上一课中数据经历了三个关键步骤探索原始数据读取 4-Classification/data/cuisines.csv2448 条样本、385 列含 5 种菜系indian、chinese、korean、japanese、thai并发现各菜系样本量严重不均——korean 799 条、indian 598 条、chinese 442 条、japanese 320 条、thai 289 条。去除干扰特征rice、garlic、ginger是各菜系共有的高频配料会混淆分类边界被统一剔除。SMOTE 平衡数据使用imblearn的SMOTE合成少数类过采样技术将五类样本全部补齐到 799 条再拼接导出为 4-Classification/data/cleaned_cuisines.csv。该文件共 3995 条样本cuisine为标签列其余 380 列是 0/1 编码的配料特征列另有索引列Unnamed: 0。假设你已完成上述准备即可开始本课的第一个练习。练习一加载数据并拆分特征与标签1. 读取 CSV 并预览在 4-Classification/2-Classifiers-1/notebook.ipynb 中运行import pandas as pd cuisines_df pd.read_csv(../data/cleaned_cuisines.csv) cuisines_df.head()相对路径说明notebook 位于4-Classification/2-Classifiers-1/而数据位于4-Classification/data/因此代码中使用../data/cleaned_cuisines.csv若从仓库根目录引用则为 4-Classification/data/cleaned_cuisines.csv。前 5 行数据如下可见每行是一条配料组合cuisine是目标标签其余列是 0/1 表示该配料是否出现索引Unnamed: 0cuisinealmondangelicaanise...yogurtzucchini00indian000...0011indian100...0022indian000...0033indian000...0044indian000...102. 导入训练所需的库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这里提前导入了后续课程会用到的SVC支持向量机与cross_val_score交叉验证等模块本课主力是LogisticRegression。3. 拆出标签列cuisinecuisines_label_df cuisines_df[cuisine] cuisines_label_df.head()输出0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object4. 剔除索引列与标签列保留特征cuisines_feature_df cuisines_df.drop([Unnamed: 0, cuisine], axis1) cuisines_feature_df.head()Unnamed: 0只是行索引的冗余副本对预测毫无价值cuisine则是我们要预测的目标二者都必须从特征中移除。剩余特征矩阵如下380 个配料列索引almondangelicaaniseanise_seedapple...yogurtzucchini000000...00110000...00200000...00300000...00400000...10至此X cuisines_feature_df特征、y cuisines_label_df标签已就绪可以开始训练。如何选择合适的分类器scikit-learn 中可用的分类技术scikit-learn 将分类归入监督学习Supervised Learning范畴其 监督学习文档 中涉及的分类方法包括线性模型Linear Models支持向量机Support Vector Machines随机梯度下降Stochastic Gradient Descent最近邻Nearest Neighbors高斯过程Gaussian Processes决策树Decision Trees集成方法Ensemble Methods如投票分类器多类与多输出算法Multiclass and Multioutput Algorithms涵盖多类分类、多标签分类、多类多输出分类此外神经网络也可用于分类但不在本课讨论范围内。直观对比跑一遍看结果一种朴素的做法是逐个试。scikit-learn 官方在构造数据集上对 10 种分类器做了并排对比KNeighbors、两种 SVC、GaussianProcessClassifier、DecisionTreeClassifier、RandomForestClassifier、MLPClassifier、AdaBoostClassifier、GaussianNB、QuadraticDiscrinationAnalysis把决策边界可视化出来上图为 scikit-learn 官方文档生成的可视化对比。商业化的 AutoML 方案本质上就是把这种批量对比搬到云端自动执行帮你选出最适配当前数据的算法。更聪明的办法对照算法速查表与其盲目猜测不如参考可下载的ML 算法速查表ML Cheat Sheet。针对多类分类问题速查表给出了一批候选方案图为算法速查表中详述多类分类选项的章节。结合本课约束条件的推理面对我们的具体场景可以逐条排除神经网络过于笨重数据集虽干净但规模极小约 4000 条且是在 notebook 本地训练神经网络在此任务中杀鸡用牛刀。不需要二分类器本任务是五类分类因此 one-vs-all 中针对二分类的部分不适用注意这里排除的是二分类专用器而非后面要讲的 OvR 多类策略。决策树或逻辑回归可行决策树可以直接处理多类逻辑回归也支持多类数据。多类提升决策树解决的是另一类问题它更适合非参数化任务例如构建排序对菜系预测没有帮助。综合下来逻辑回归Logistic Regression成为本课首选的训练算法——它在前面的回归章节刚被介绍过且对多类问题有成熟的支持。深入理解 LogisticRegression 的两个关键参数multi_class与solver逻辑回归本质上是为二分类设计的模型。要在多类任务中使用它必须通过multi_class指定多类方案、通过solver指定优化算法且两者存在组合约束。multi_class的可选值与含义ovrone-vs-rest一对多为每个类别训练一个该类别 vs 其余所有类别的二分类器共 5 个分类器分别输出各自的置信度。multinomial直接以交叉熵损失cross-entropy loss训练一个统一的多项式逻辑回归。该选项目前仅支持lbfgs、sag、saga、newton-cg四个求解器。solver的含义它是优化问题中使用的算法。不同 solver 对不同数据结构的处理能力差异很大。scikit-learn 官方用下表说明各 solver 在不同数据场景下的适配性理解这张表的核心线索并非所有 solver 都能与所有multi_class取值任意搭配——例如liblinear只支持ovr而multinomial只支持lbfgs/sag/saga/newton-cg。选型时要同时考虑数据规模、稀疏性、是否需要 L1 正则等因素。练习二划分训练集与测试集调用train_test_split()把特征与标签按70% 训练 / 30% 测试划分X_train, X_test, y_train, y_test train_test_split(cuisines_feature_df, cuisines_label_df, test_size0.3)3995 条样本中约 2796 条用于训练1199 条用于测试与后文分类报告中support合计一致。练习三训练多类逻辑回归分类器针对多类场景本课选择multi_classovrsolverliblinear组合进行首次训练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)y_train是 Series 或二维数组时ravel()将其展平为一维数组满足 scikit-learn 对标签输入的格式要求。换个 solver 试试lbfgs常被设为默认值你可以在同样数据上替换solverlbfgs对比精度差异。从 4-Classification/2-Classifiers-1/solution/notebook.ipynb 的缓存输出来看ovr liblinear组合在本次运行中得到的Accuracy is 0.8181818181818182超过 80%说明模型已能从配料组合中捕捉到显著的菜系信号。单样本验证看看模型在一道菜上的判断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可以更换不同的行号如iloc[60]、iloc[100]继续验证。值得注意仓库中的 4-Classification/2-Classifiers-1/solution/notebook.ipynb 是同一份代码、同样的第 50 行却输出了korean配料为artemisia, black_pepper, mushroom, shiitake, soy_sauce, vegetable_oil——这正是train_test_split()默认随机切分导致的结果不同运行下第 50 行对应的样本不同。这也提醒我们模型评估结论应依赖整体指标如准确率、分类报告而非单一行。深入一步查看各类别的预测概率用predict_proba()输出模型对该样本在每个类别上的置信度分布test X_test.iloc[50].values.reshape(-1, 1).T proba model.predict_proba(test) classes model.classes_ resultdf pd.DataFrame(dataproba, columnsclasses) topPrediction resultdf.T.sort_values(by[0], ascending [False]) topPrediction.head()输出示例即文档中的那次运行模型判定为印度菜且置信度较高类别概率indian0.715851chinese0.229475japanese0.029763korean0.017277thai0.007634模型对印度菜的判断置信度高达约 0.72远超第二名的 0.23。原因不难推断该样本包含cilantro、potato、tomato、vegetable_oil等在南亚菜系中高频出现的配料组合而这些配料在训练数据里与indian标签的共现模式非常鲜明。你也可以尝试解释为什么换成shiitake、soy_sauce组合时见 solution notebook 的输出模型的最高置信度会转向korean。打印分类报告全面评估各类别表现y_pred model.predict(X_test) print(classification_report(y_test,y_pred))本课文档中的一次运行结果如下类别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精确率模型预测为某菜系的样本中真正属于该菜系的比例。indian高达 0.91说明误报极少。recall召回率真实属于某菜系的样本中被正确找出的比例。indian0.93、thai0.85 领先而chinese/japanese偏低——中餐与日料在部分配料上存在混淆如酱油、豆腐等东亚共性配料导致彼此漏检。f1-score精确率与召回率的调和平均是两者的综合平衡。support每个类别在测试集中的真实样本数。macro avg五个类别指标的简单平均每类权重相同。weighted avg按 support 加权的平均更能反映整体样本分布下的表现。仓库 4-Classification/2-Classifiers-1/solution/notebook.ipynb 中另有一次完整运行输出accuracy 0.82其中indian的 precision/recall 为 0.93/0.88korean为 0.87/0.86进一步印证在 80% 以上准确率的前提下印度菜和韩国菜是最容易被区分的类别而中餐与日料的混淆是主要误差来源。延伸阅读与动手挑战挑战深入探索 scikit-learn 的分类选项本课用干净数据构建了根据配料预测国家菜系的模型。建议进一步通读 scikit-learn 提供的全部分类算法思考哪些适用于多类、哪些只适用于二分类深入钻研solver概念liblinear、lbfgs、sag、saga、newton-cg各自在稀疏性、样本规模、正则项L1/L2支持上的取舍理解训练时幕后发生了什么在ovr之外尝试multinomial需搭配lbfgs等求解器对比两者在准确率与训练耗时上的差异。课后作业研究 solver 的异同本课配套作业4-Classification/2-Classifiers-1/assignment.md要求从本课列举的 solver 中任选两个用自己的话对比它们的异同——它们各自解决什么类型的问题如何适配不同的数据结构什么场景下会选择其中一个而非另一个评分标准要求对每个 solver 各写一段有深度的对比分析。自主复习建议可以进一步研读逻辑回归背后的数学原理梯度推导、损失函数、OvR 与 softmax 的关系并结合 R 语言实现4-Classification/2-Classifiers-1/solution/R/lesson_11.Rmd使用tidymodels生态完成同样的多类逻辑回归流程从另一个技术栈印证本课结论。小结本课完整演示了数据就绪后的分类建模闭环拆分特征/标签 → 依据约束推理选型 → 配置multi_class与solver→ 训练 → 单样本概率验证 → 分类报告整体评估。基于 4-Classification/data/cleaned_cuisines.csv 这份 3995 条样本、5 类菜系的数据一个简单的LogisticRegression(multi_classovr, solverliblinear)即可稳定取得 80% 以上的准确率。理解multi_class/solver的组合约束与各类别指标的差异是下一步尝试SVC、决策树等更多分类器见下一课 4-Classification/3-Classifiers-2/README.md之前最重要的基础。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →