新闻详情

新闻详情

首页 / 资讯中心 / 详情

ML-For-Beginners 分类入门:基于亚洲与印度料理数据集的多分类数据清洗与 SMOTE 平衡实战

发布时间:2026/9/7 3:02:44来源:尧图网络
ML-For-Beginners 分类入门:基于亚洲与印度料理数据集的多分类数据清洗与 SMOTE 平衡实战
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 课程《Getting started with classification》模块的第一课课程第 10 课原文档 README.md该文档为英文原版 4-Classification/1-Introduction/README.md 的阿拉伯语机器翻译版。本篇将带你把亚洲与印度料理数据集2448 道菜谱、385 个成分特征列加工为一个特征去噪、类别均衡的多分类训练集从理解二分类与多分类的本质区别到用 Pandas 探查数据分布再到用imblearn的 SMOTE 过采样把 289799 条不均衡样本拉平到每类 799 条并导出 cleaned_cuisines.csv 供后续三课的分类算法使用。1. 分类的定位监督学习的另一面分类Classification是经典机器学习中与回归并列的核心任务属于监督学习Supervised Learning数据带有标签模型通过学习输入特征 → 输出类别的映射关系来建立预测模型。原文档特别强调它与回归的连续性帮助读者建立知识衔接线性回归Linear Regression预测变量间的连续关系例如同一款南瓜 9 月与 12 月的价格差异逻辑回归Logistic Regression发现二元类别例如在这个价格点这个南瓜是橙色还是非橙色分类用多种算法确定数据点的标签或类别并进一步分为二分类binary classification与多分类multiclass classification两大族。图 1分类算法需要处理的二分类与多分类问题对比信息图作者 Jen Looper原文档给出的思考题值得在动手前完成想象一个料理数据集——多分类模型能回答什么问题二分类模型又能回答什么问题例如判断某道菜是否很可能使用葫芦巴fenugreek是二分类问题而给定一袋八角、朝鲜蓟、花椰菜和辣根能否做出一道典型印度菜则涉及多类别判断。Scikit-learn 提供了多种分类算法取决于要解决的问题类型。本模块共 4 课见 4-Classification/README.mdIntroduction to classification —— 本课数据清洗与均衡More classifiersYet other classifiersApplied ML: build a web app。本课对应的课后作业是 assignment.md要求查阅 Scikit-learn 文档中的分类方法清单将算法与本课程数据集匹配并说明将向数据提出什么问题。2. 任务定义一个多分类问题本课要回答的问题是给定一组成分ingredients判断它属于哪种菜系。由于存在多个候选菜系thai、japanese、chinese、indian、korean这实际上是一个多分类问题。数据源为 4-Classification/data/cuisines.csv其结构特点可通过 solution/notebook.ipynb 与 CSV 表头确认共2448 行菜谱样本不含表头385 列除cuisine字符串标签列object 类型外384 列全部是 0/1 二值成分列almond、angelica、anise、rice、soy_sauce……即每一列代表一种成分是否出现在该菜谱中另有一列Unnamed: 0原始索引残留需要丢弃。3. 环境准备与数据导入动手前需要安装imblearnimbalanced-learn。它是 Scikit-learn 生态中专门处理类别不均衡问题的包本教程用它提供的 SMOTE 算法实现过采样。pip install imblearn然后在 notebook.ipynb该目录下的空白 Notebook位于本课根目录中导入所需依赖import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE导入数据集。注意由于 Notebook 位于4-Classification/1-Introduction/数据目录在上一级的data/文件夹因此路径为../data/cuisines.csv若你运行的是 solution 目录下的 solution/notebook.ipynb其内部路径为../../data/cuisines.csv同理df pd.read_csv(../data/cuisines.csv)read_csv()会读取cuisines.csv的全部内容并放入变量df。先用head()查看前五行df.head()前五行形如每行是一个菜谱绝大多数成分列为 0个别为 1| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | ... | whiskey | white_bread | white_wine | ... | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | --- | ------- | ----------- | ---------- | --- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | ... | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | ... | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | ... | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | ... | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | ... | 1 | 0 |再用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这组输出直接印证了仓库中 CSV 文件的实际规模2448 条记录、385 列其中 384 列为 int64 二值列、1 列为 object 标签列。4. 探查菜系分布发现类别不均衡先弄清数据在每个菜系上的分布情况df.cuisine.value_counts().plot.barh()图 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)直接对 cuisines.csv 按cuisine列统计可复现该结果korean 799、indian 598、chinese 442、japanese 320、thai 289合计 2448。最大类korean是最小类thai的约 2.8 倍——这种偏斜会让模型偏向多数类正是第 6 节要用 SMOTE 修复的问题。5. 成分画像找出混淆各菜系的公共特征深入数据之前先看每种菜系的典型成分长什么样。原文档给出一个辅助函数create_ingredient_df()先转置并丢弃cuisine与Unnamed: 0两列对每一行即每个成分求和得到该菜系内出现次数再剔除全 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_dfsolution/notebook.ipynb 中同一函数带有完整注释df.T转置后sum(axis1)即每个成分在该菜系中的总出现次数(ingredient_df.T ! 0).any()过滤掉零出现行。对每个菜系分别调用并绘制前 10 个成分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()观察这些图表可以发现米饭rice、大蒜garlic、姜ginger在几乎所有菜系中都是高频成分。从源码结构看这些特征对区分是哪国菜几乎没有信息量反而会成为跨菜系的噪声。因此用drop()将它们连同两个无信息列一并删除feature_df df.drop([cuisine,Unnamed: 0,rice,garlic,ginger], axis1) labels_df df.cuisine #.unique() feature_df.head()至此feature_df是 2448 × 380 的纯特征矩阵labels_df是 2448 个菜系标签。6. 用 SMOTE 均衡数据集数据已经干净了但类别仍不均衡。这里引入imblearn的SMOTESynthetic Minority Over-sampling Technique合成少数类过采样技术它不是简单复制少数类样本而是在特征空间中对少数类样本做插值生成合成样本从而把每类样本数提升到最大类的水平。为什么必须均衡以二分类为例如果绝大多数数据属于某一种类模型会仅因该类的训练样本多而更频繁地预测该类。SMOTE 消除这种偏斜让分类结果反映真实判别能力。调用fit_resample()执行过采样oversample SMOTE() transformed_feature_df, transformed_label_df oversample.fit_resample(feature_df, labels_df)fit_resample()返回两个对象过采样后的特征矩阵与对应的标签序列。注意 SMOTE 要求特征为数值型——本数据集 380 列均为 0/1 二值特征天然满足该前提。对比新旧标签分布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每个菜系都被抬升到 799 条总量从 2448 变为3995 条799 × 5。最后一步把均衡后的标签与特征合并为新的 DataFrame 并导出供后续课程使用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——直接检查该文件可以验证共 3995 行数据且 chinese、indian、japanese、korean、thai 各恰好 799 行与上文 SMOTE 输出完全一致。后续第 11、12 课2-Classifiers-1、3-Classifiers-2都将基于这份均衡数据训练 Naive Bayes、SVM、Random Forest 等分类器。7. 进阶练习与自研方向原文档在收尾处给出了两个延伸任务挑战题翻查课程其他data文件夹如 2-Regression/data/US-pumpkins.csv、5-Clustering/data/nigerian-songs.csv判断哪些数据集适合二分类或多分类并列出你会向数据提出的问题自研探索 SMOTE 的 API——它的k_neighbors、sampling_strategy等参数在哪些场景下需要调整它解决什么问题、又会在什么场景例如高维稀疏特征下带来风险另外本课同时提供 R 语言版本solution/R/lesson_10.html含 lesson_10-R.ipynb以及 Julia 说明solution/Julia/README.md可用其他语言对照同一工作流。8. 小结本课完成了分类项目的前置工程概念层分类是监督学习的两大分支之一按类别数分为二分类与多分类本数据集是一个 5 类多分类问题探查层read_csv→head()/info()确认 2448 × 385 的二值特征结构value_counts().plot.barh()暴露出 289799 条的类别偏斜去噪层create_ingredient_df()定位出rice/garlic/ginger等跨菜系高频成分并删除均衡层SMOTE 过采样把每类拉到 799 条导出 cleaned_cuisines.csv3995 行作为后续三课分类实验的统一输入。这套分布探查 → 公共特征剔除 → 合成过采样 → 落盘的流水线是所有类别不均衡分类项目的通用起手式。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

我的世界修仙RPG服务器搭建指南:从插件配置到性能优化 2026/9/7 3:38:49

我的世界修仙RPG服务器搭建指南:从插件配置到性能优化

这次我们来看一个非常典型的热门类型——我的世界修仙类大型 RPG 服务器。这种服务器的核心卖点不是单纯的原版生存,而是把“修仙”题材和 RPG 玩法整段搬进《我的世界》:境界突破、法宝炼制、渡劫飞升、宗门系统、在线挂机、装备成长、 RBM 交易。玩家进…

阅读更多 →
告别订阅制:用DBeaver和Bruno平替商业开发工具的工作流指南 2026/9/7 3:38:49

告别订阅制:用DBeaver和Bruno平替商业开发工具的工作流指南

做开发这些年,我们每个人电脑里几乎都躺着几个付费商业工具。有的是公司统一采购还好,个人开发者和小团队往往只能自己扛授权费。更麻烦的是,这几年主流商业工具的授权模式普遍转向订阅制,价格越涨越高,强制登录越来越…

阅读更多 →
Windows 10 上 MinGW V14.12.0 安装配置与避坑指南 2026/9/7 3:38:49

Windows 10 上 MinGW V14.12.0 安装配置与避坑指南

简介:面向Windows 10 64位开发者的MinGW安装包,版本为V14.12.0,集成了完整的GCC编译链。它能够让开发者在Windows系统中编译运行C、C等语言编写的类Unix程序,适合需要搭建跨平台编译环境、学习编译原理或维护开源项目的用户使用。…

阅读更多 →
labelImg-master.zip全攻略:安装、标注、Git分支与压缩包修复详解 2026/9/7 3:38:49

labelImg-master.zip全攻略:安装、标注、Git分支与压缩包修复详解

简介:labelImg-master.zip 是图像标注工具 LabelImg 的完整源码包,面向准备目标检测、语义分割等神经网络训练数据集的开发者,帮助解决标注流程繁琐、数据质量参差不齐的问题。工具提供直观图形界面,支持矩形框、多边形等标注&…

阅读更多 →
WinForms Chart控件时间轴设置与滚动条实现深度解析 2026/9/7 3:38:49

WinForms Chart控件时间轴设置与滚动条实现深度解析

简介:面向需要在 Windows 窗体项目中使用 VS 自带图表控件的 .NET 开发者,这份可运行示例演示了从 Excel 读取数据、把 x 轴设置为“MM-dd HH:mm:ss:fff”格式时间轴的方法。数据点以 0.5 秒间隔刷新,当时间跨度超过 5 秒后自动启用滚动框&am…

阅读更多 →
GPT4All 桌面端设置体系详解:应用、模型与 LocalDocs 配置项全解析 2026/9/7 3:35:49

GPT4All 桌面端设置体系详解:应用、模型与 LocalDocs 配置项全解析

GPT4All 桌面端设置体系详解:应用、模型与 LocalDocs 配置项全解析 【免费下载链接】gpt4all GPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use. 项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all 本文基于 …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞