资讯动态

ML-For-Beginners 分类入门实战:基于亚洲与印度菜系数据集理解分类原理并完成 SMOTE 数据平衡

发布时间:2026/9/8 21:03:56 来源:尧图企业网站定制
ML-For-Beginners 分类入门实战基于亚洲与印度菜系数据集理解分类原理并完成 SMOTE 数据平衡【免费下载链接】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 / 1-Introduction」单元的技术实践指南核心主题是经典机器学习中的分类classification——一种与回归一脉相承的监督学习技术。我们将在课程配套的亚洲与印度菜系数据集上从二元分类 vs 多分类的概念辨析出发逐步完成数据导入、分布探查、特征筛选并使用imblearn的SMOTE技术对不均衡数据进行合成过采样平衡最终产出可供后续分类算法直接使用的cleaned_cuisines.csv。读完本文你将掌握分类问题的类型判定方法、数据清洗与类别不平衡处理的标准流程以及它们背后的原理。一、分类监督学习的核心活动之一在课程路线图中你此前已经接触过两种预测技术线性回归帮你预测变量之间的关系并推断一条直线附近新数据点的落点。例如预测南瓜在 9 月与 12 月的价格分别是多少逻辑回归帮你发现二元类别例如在给定价格点下这只南瓜是橙色的还是不是橙色的。分类classification则利用一系列算法用另一种方式判定一个数据点所属的标签label或类别class。从统计分类statistical classification衍生而来的经典机器学习分类会使用诸如smoker、weight、age之类的特征features去估计患某病的可能性这类结果。作为一种与回归练习类似的监督学习技术你的数据是带标签labeled的机器学习算法借助这些标签对数据集进行分类与预测并把样本归入某个组或某种结果。分类是机器学习研究人员与数据科学家最基本的工作之一——从这封邮件是不是垃圾邮件的二元判断到借助计算机视觉完成复杂的图像分类与分割把数据归入不同类别并针对它们提出问题是始终有用的能力。用更科学的方式表述你的分类方法会构建一个预测模型使你能够把输入变量与输出变量之间的映射关系建立起来。上图展示了分类算法需要应对的二元 vs 多分类问题课程Hello, classifier章节的配套信息图。二、二元分类与多分类先判定问题的类型分类通常分为两组二元分类binary classification与多分类multiclass classification。二元分类只有两个候选类。例如此邮件是否为垃圾邮件、此南瓜是否为橙色、此人是否患病多分类候选类在两个以上。例如这封信属于情书、账单还是投诉。课堂上的思考练习可以帮助你区分两者设想一个关于菜系的数据集——多分类模型能回答什么问题二元分类模型能回答什么问题如果你想知道某道菜是否可能使用葫芦巴fenugreek这属于哪一类问题如果给你一袋装有八角、洋蓟、菜花和辣根horseradish的食材想判断能否据此做出一道典型的印度菜又属于哪一类问题在正式清洗、可视化和为机器学习任务准备数据之前先厘清这些问题类型会直接影响你后续的算法选型。三、Hello, classifier菜系数据集是一个多分类问题本单元共四课使用的数据集是关于亚洲与印度各地美味菜系的cuisines.csv位于 4-Classification/data/cuisines.csv。我们希望向数据集提出的问题本质上是一个多分类问题我们手头有多个潜在的国家菜系泰国、日本、中国、印度、韩国那么在给定一批食材的情况下这些数据最可能匹配众多类别中的哪一类从数据结构的实际形态看这个判断非常直观cuisines.csv首行是列名第一列cuisine为标签列其余各列是成百上千种食材的名称。示例首行表头以,cuisine,almond,angelica,anise,...的形式出现即每一行代表一道菜菜系标签后跟随各食材的 0/1 取值。这就是一个典型的多分类输入——特征矩阵 类别标签。Scikit-learn 依据要解决的问题类型提供了多种分类算法逻辑回归、SVM、决策树、朴素贝叶斯、K 近邻等。后续两课会逐一介绍这些算法而本课的任务是为它们准备好一份干净、均衡的数据。四、数据准备第一步清洗与查看数据集4.1 安装并导入依赖本课起始的空 notebook 位于 4-Classification/1-Introduction/notebook.ipynb。第一个要安装的是imblearnimbalanced-learn——它是 Scikit-learn 生态的配套包用于更好地平衡数据pip install imblearn随后导入数据处理、可视化所需的包并从imblearn引入SMOTEimport pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE4.2 读取 CSV 并检查数据形态df pd.read_csv(../data/cuisines.csv)说明在原课程目录结构中notebook.ipynb位于 4-Classification/1-Introduction/ 下因此相对路径../data/cuisines.csv指向的就是仓库中的 4-Classification/data/cuisines.csv。若在仓库根目录下运行等价于pd.read_csv(4-Classification/data/cuisines.csv)。调用df.head()查看前五行df.head()输出截断展示| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | ... | whiskey | white_bread | ... | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | --- | ------- | ----------- | --- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | ... | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | ... | 0 | 0 | ... | 0 | 0 | | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |再调用df.info()获取数据类型与内存占用信息df.info()class pandas.core.frame.DataFrame RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2 MB这份输出揭示了三个关键事实也与仓库中的真实数据吻合样本量2448 条样本记录cuisines.csv实际为 2448 行数据 1 行表头列结构共 385 列其中 384 列为int64食材的 0/1 编码仅有cuisine一列为object字符串类型的菜系标签无索引脏列Unnamed: 0是读入时多出的一列源自 CSV 中残留的行序号后续需要剔除。五、探索菜系分布先发现数据不平衡5.1 绘制每类样本的柱状图df.cuisine.value_counts().plot.barh()输出即下图所示——菜系种类有限5 类但各类样本数量分布不均衡由图可见korean 样本最多接近 800而 thai 样本最少约 250。这种不均衡正是后续需要解决的问题。5.2 精确统计各类别样本量用布尔索引切分出每一菜系的子集并打印其形状thai_df df[(df.cuisine thai)] japanese_df df[(df.cuisine japanese)] chinese_df df[(df.cuisine chinese)] indian_df df[(df.cuisine indian)] korean_df df[(df.cuisine korean)] print(fthai df: {thai_df.shape}) print(fjapanese df: {japanese_df.shape}) print(fchinese df: {chinese_df.shape}) print(findian df: {indian_df.shape}) print(fkorean df: {korean_df.shape})输出thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)各菜系形状均为(n, 385)与df.info()的 385 列一致但 n 从 289 到 799 不等最大与最小相差约 2.8 倍。如果不加处理后续分类器会天然偏向样本多的类别详见第七节因此需要平衡它们。六、发掘典型食材特征工程与降噪6.1 按菜系统计食材热度深入数据内部我们想知道每类菜系的典型食材。先编写一个工具函数create_ingredient_df()转置 DataFrame、剔除无用的cuisine与Unnamed: 0列、按出现次数求和排序def create_ingredient_df(df): ingredient_df df.T.drop([cuisine,Unnamed: 0]).sum(axis1).to_frame(value) ingredient_df ingredient_df[(ingredient_df.T ! 0).any()] ingredient_df ingredient_df.sort_values(byvalue, ascendingFalse, inplaceFalse) return ingredient_df6.2 观察五类菜系的 Top10 食材对每一菜系子集调用该函数并绘制水平条形图barh()即可直观比较彼此的特色食材thai_ingredient_df create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()japanese_ingredient_df create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()chinese_ingredient_df create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()indian_ingredient_df create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()korean_ingredient_df create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()五张图对应的原始图片与可视化细节分别见 thai 图、japanese 图、chinese 图、indian 图 与 korean 图。这一步的价值在于哪些食材在多个菜系中高频出现、从而区分度低哪些食材只在单一菜系中高频出现、从而判别力强为下一步特征筛选提供依据。6.3 剔除造成混淆的共性食材当多种菜系都高频使用某种食材时它会干扰分类器对国别来源的判断。最常见的干扰项是米饭、大蒜、姜——几乎人人都爱它们。使用drop()移除这些共性食材列同时去除cuisine标签列将单独存放与Unnamed: 0无用列得到特征矩阵feature_dffeature_df df.drop([cuisine,Unnamed: 0,rice,garlic,ginger], axis1) labels_df df.cuisine # .unique() feature_df.head()至此feature_df只有食材编码列约 380 列不含标签labels_dfSeries保存每条样本的菜系标签特征矩阵仍是不均衡的行数未变下一步用 SMOTE 进行样本层面的平衡。七、用 SMOTE 平衡数据集原理与实操7.1 为什么不均衡数据有害想象一个二元分类问题如果绝大多数数据属于某个类别机器学习模型会更频繁地预测该类别——仅仅因为它的样本更多。数据平衡会消除这种由样本量悬殊带来的系统性偏差让分类器公平地学习每一个类别。对多分类的菜系数据集同样如此。7.2 SMOTE 是什么SMOTE 的全称是Synthetic Minority Over-sampling Technique合成少数类过采样技术。与简单复制少数类样本不同SMOTE 通过在少数类样本之间做插值interpolation来生成全新的合成样本从而在不引入过多重复数据的前提下扩充少数类。7.3 调用 fit_resample 完成平衡oversample SMOTE() transformed_feature_df, transformed_label_df oversample.fit_resample(feature_df, labels_df)fit_resample()一次性完成拟合 重采样它会学习各类别在特征空间中的分布然后为样本量不足的类别合成新样本直到所有类别样本数一致。7.4 验证平衡效果分别打印新、旧标签计数进行对比print(fnew label count: {transformed_label_df.value_counts()}) print(fold label count: {df.cuisine.value_counts()})输出new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64可以看到经过 SMOTE 处理后五个菜系的样本数被统一到 799数据干净、平衡而且很美味。这也与仓库中平衡后产物的真实规模吻合4-Classification/data/cleaned_cuisines.csv 实际包含 3995 行数据5 类 × 799 1 行表头而平衡前的 cuisines.csv 只有 2448 行数据。7.5 合并标签与特征并导出把平衡后的标签与特征按列合并回一个完整 DataFramejoinouter确保两侧行索引全部保留transformed_df pd.concat([transformed_label_df, transformed_feature_df], axis1, joinouter)最后再检查一遍数据并保存到数据目录供后续课程使用transformed_df.head() transformed_df.info() transformed_df.to_csv(../data/cleaned_cuisines.csv)从仓库路径看该文件最终写入 4-Classification/data/cleaned_cuisines.csv课程同时提供了 R 版本 cleaned_cuisines_R.csv 与食材索引辅助文件 ingredient_indexes.csv。这份新 CSV 将成为后续分类器 1 / 分类器 2 / 应用等课程训练模型的标准输入。八、数据流向与产物对照仓库证据把本课产出与仓库中的真实文件对应起来可以清晰看到整条数据流水线阶段仓库中的对应文件说明原始数据4-Classification/data/cuisines.csv2448 条样本、385 列1 标签 384 食材特征类别不均衡特征清洗df.drop([cuisine,Unnamed: 0,rice,garlic,ginger], axis1)剔除标签、无用索引列与共性干扰食材类别平衡SMOTE().fit_resample(...)五类统一至每类 799 条平衡产物4-Classification/data/cleaned_cuisines.csv3995 条样本供后续课程复用同时仓库为本科目提供了多种语言与工具的完整解答资源可用于对照验证你的 notebook 步骤Python 解答见 4-Classification/1-Introduction/solution/notebook.ipynbR 语言版本见 4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb对应 HTML 输出为 lesson_10.html。如果你希望在 R 生态中完成同样的流程原课程还提供 Julia 与 R 两个方向的替代实现solution/R 与 solution/Julia。九、延伸练习与课后巩固9.1 挑战为仓库其他数据集判定分类任务类型本套课程还包含若干有趣的数据集。翻一翻各单元的data目录判断哪些数据集适合做二元分类、哪些适合做多分类并思考如果面对这些数据你会提出什么问题可重点考察 2-Regression/data、3-Web-App/1-Web-App/data、5-Clustering/data 与 7-TimeSeries/data 中的数据集比较它们与菜系数据集在标签形态上的差异。9.2 深入研究 SMOTE对照 assignment.md 的课后作业要求在 Scikit-learn 文档中检索各类分类方法为课程中的某个数据集匹配一个可问的问题 一种分类技术并整理成表格或文档。此外深入阅读 SMOTE 的 API 文档思考它最适合哪些使用场景、解决了什么问题以及它可能的局限例如对高维稀疏特征与极端离群点的处理方式为下一课选择合适的分类器打下基础。小结本课以亚洲与印度菜系溯源这一多分类任务为主线走通了分类学习的标准前置流程判定问题类型多分类→ 读取并体检数据2448 行 × 385 列→ 发现类别不均衡289799→ 探查与筛选特征剔除 rice/garlic/ginger 等共性食材→ 用 SMOTE 将五类统一平衡至 799 条 → 导出 cleaned_cuisines.csv 供下游算法使用。掌握了这套清洗 平衡方法论后你就可以在下一课放心地把它交给各种分类器检验给出一组食材、判断其菜系来源这一多分类任务的真实预测效果了。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价