ML-For-Beginners 聚类可视化实战:用散点图探索尼日利亚音乐数据集的作业指南
【免费下载链接】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 课程5-Clustering/1-Visualize章节配套作业撰写的技术指南。该作业要求学习者围绕"聚类前的数据可视化"主题,调研多种散点图绘制方式与绘图库,并在 Notebook 中产出五张高质量散点图、写出图释发现。读完本文,你将掌握基于matplotlib/seaborn/pandas的散点图绘制链路、五图作业的选题与组织方法,以及对照评分标准自查产出质量的具体做法。
1. 作业背景:为什么聚类之前要先画散点图
聚类(Clustering)属于无监督学习 中,课程明确写道:"聚类作为一种技术,极大地受益于恰当的可视化"——先通过可视化理解数据形态,才能为后续选择聚类算法(K-Means、DBSCAN、层次聚类等)提供依据。
散点图(Scatterplot)之所以是聚类前最有用的可视化工具,是因为它能直观地显示"对象的成组聚集":横轴与纵轴各取一个特征,每个样本落在平面上的一个点,天然聚集的点群往往就是潜在簇(cluster)的雏形。本课以从 Spotify 抓取的尼日利亚歌曲数据集 nigerian-songs.csv 为研究对象,课程结尾明确指出:"下一课将用这份过滤后的数据做 K-Means 聚类,去发现那些看起来以有趣方式重叠的群组。"因此,本作业实际上是下一课 K-Means 实战的"侦察兵"。
2. 作业目标与任务要求(原文完整继承)
作业原文(对应 5-Clustering/1-Visualize/assignment.md)给出的任务如下:
在本课中,你已经使用了一些可视化技术来把握如何为聚类绘制数据。尤其是散点图,对于发现对象的成组聚集非常有用。请调研不同的方式与不同的库来创建散点图,并把你的工作记录在一个 Notebook 中。你可以使用本课的数据、其他课的数据,或自己找到的数据(但请在 Notebook 中注明其来源)。用散点图绘制一些数据,并解释你的发现。
归纳为四个可执行的要点:
- 调研广度:不止用一种方法、一个库画散点图,要主动对比不同方式;
- 成文载体:所有探索必须沉淀在一个 Notebook 中,可运行、可复现;
- 数据来源:优先使用仓库数据,也可跨课程取数或自备数据(自备数据必须标注来源);
- 结论输出:每张图都要配文字说明——你发现了什么,为什么它重要。
3. 评分标准(Rubric)逐条解读
作业附带的评分表是判断产出的唯一标尺,原文如下:
| 标准 | 优秀(Exemplary) | 合格(Adequate) | 需改进(Needs Improvement) |
|---|---|---|---|
| 交付物 | 提交一个包含五个记录良好的散点图的 Notebook | 提交一个散点图少于五个且记录较差的 Notebook | 提交一个不完整的 Notebook |
三条关键信号值得注意:
- 数量硬指标:5 张是"优秀"的下限,少于 5 张直接降档;
- 质量软指标:不只是"画出来",而是"well-documented"——每张图都要有充分的文字记录(markdown 说明 + 图内注释);
- 完整性要求:Notebook 必须能完整跑通,代码、输出、结论俱全,不能只有半截代码。
4. 环境准备与数据加载(结合仓库源码)
作业起点是课程自带的 Notebook。仓库中有两个可直接参考的文件:
- 课程模板:5-Clustering/1-Visualize/notebook.ipynb(仅含一个标题单元格的空白模板);
- 官方解答:5-Clustering/1-Visualize/solution/notebook.ipynb(完整的可视化实现,可作为对照参考)。
4.1 安装与导入
作业要求使用Seaborn进行高质量可视化,安装与导入代码如下(与解答 Notebook 一致):
!pip install seaborn import matplotlib.pyplot as plt import pandas as pd import seaborn as sns4.2 加载歌曲数据
数据文件位于仓库 5-Clustering/data/nigerian-songs.csv,共 530 行、16 列。从 Notebook 所在目录加载:
df = pd.read_csv("../../data/nigerian-songs.csv") # 位于 5-Clustering/1-Visualize/solution/ 时 df.head()前几行数据如下:
| name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
其中length单位是毫秒(144000 ms ≈ 2 分 24 秒),popularity是 0~100 的流行度评分,danceability、energy、acousticness等音频特征均为 0~1 区间的小数。
4.3 数据体检三步曲
按课程流程,加载后依次执行info()、isnull().sum()、describe()三连:
df.info() df.isnull().sum() df.describe()df.info()显示 16 列无缺失、无重复类型异常;df.isnull().sum()全列为 0,无需处理空值;df.describe()的统计摘要给出关键量级:popularity最小值为 0(表示该曲目没有排名),tempo均值约 116.5 BPM,time_signature绝大多数为 4 拍。数据体检的结果要原样写入你的 Notebook 并附一句解释——这正是"well-documented"的组成部分。
5. 数据清洗:散点图质量的前提
课程指出,若直接对全量数据画图,popularity = 0的"未排名"记录以及artist_top_genre为Missing(Spotify 未分类)的行都会成为噪声。作业沿用课程的过滤方案:
# 去掉未分类流派 df = df[df['artist_top_genre'] != 'Missing'] # 只看占比最高的三个流派 df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] # 去掉 popularity 为 0 的记录 df = df[df['popularity'] > 0] # 复查各流派数量 top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10, 7)) sns.barplot(x=top.index, y=top.values) plt.xticks(rotation=45) plt.title('Top genres', color='blue')过滤后数据集中在afro dancehall、afropop、nigerian pop三个流派,噪声被剔除,后续散点图中的点群才不会被"未排名"的离群点污染。作业中建议再用df.corr(numeric_only=True)检查特征相关性,课程观察到唯一较强的相关性出现在energy与loudness之间(响度大的音乐通常能量感强),其余特征间相关性较弱——这直接提示了散点图选轴的方向(见第 6 节)。
6. 散点图绘制:本课已演示的两种核心方式
作业要求"调研不同的方式",而课程与解答 Notebook 已经示范了两种互为补充的散点图形态,它们是作业的基线,必须掌握。
6.1 方式一:seaborn.jointplot + KDE 密度叠加
先看双变量的联合分布,jointplot会在散点区域周围附加两个边缘分布直方图/密度曲线:
sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", )kind="kde"使用核密度估计(Kernel Density Estimate)以连续概率密度曲线表示数据,适合同时观察多个分布的形态。课程发现:三个流派围绕一个大致收敛点形成同心圆状分布——在 popularity 与 danceability 这两个维度上,尼日利亚听众的口味存在趋同现象。
6.2 方式二:FacetGrid + plt.scatter 按类别分组散点
同一条轴组合,改用FacetGrid调用底层plt.scatter,即可按artist_top_genre分色绘制经典散点图:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()课程指出,散点图呈现了与 KDE 图相似的重叠收敛模式——三个流派在散点图上松散对齐、并无清晰分离的边界,这意味着在这个特征平面上做聚类会有挑战,也为下一课引入 K-Means 留下了悬念。注意:早期版本 seaborn 用size=5参数,新版本已更名为height=5(解答 Notebook 中会出现size参数的弃用警告),作业里请使用height。
7. 进阶调研:凑齐五张散点图的选题方案
评分标准的"优秀"档要求五张记录良好的散点图。单纯重复同一轴组合两次达不到"不同方式"的要求,下面给出可直接落地的五图选题方案,全部可在仓库数据上复现:
方案 A:本课基线图
popularity×danceability,按流派着色(第 6.2 节代码),记录"三流派松散重叠"的发现。
方案 B:强相关特征验证图
课程在相关性热力图中发现energy与loudness强相关,可绘制:
sns.scatterplot(data=df, x="energy", y="loudness", hue="artist_top_genre")预期点群沿对角线聚集,可顺带撰写"相关性 ≠ 因果性"的讨论。
方案 C:多维特征散点(pandas 内置绘图)
不引入新库,直接用 pandas 的.plot.scatter()绘制不同轴组合(如tempo×danceability、length×popularity),对比不同特征组合下的聚集程度:
df.plot.scatter(x="tempo", y="danceability", c="popularity", colormap="viridis")方案 D:3D 散点(matplotlib 生态)
用mpl_toolkits.mplot3d在同一张图里放入三个特征轴(如popularity、danceability、energy),体会二维散点丢失的信息在三维中能否显现。
方案 E:多变量散点矩阵
用sns.pairplot(df, hue="artist_top_genre", vars=["popularity", "danceability", "energy", "loudness"])一次性生成多组两两散点矩阵,从全局视角寻找"哪对特征最能分开三个流派"。
调研提示:作业要求"不同的库",除本仓库使用的
matplotlib、seaborn、pandas外,可以按作业要求自行探索其他绘图生态(例如交互式图表库),并在 Notebook 中注明各方案的适用场景与优缺点。不要照抄同一张图改个标题充数——评分关注的是"方式与库的多样性"。
8. 写出"well-documented"散点图的四步模板
对照评分标准中的 Exemplary 档,每张散点图建议用以下四段式组织文字记录(Notebook 中每图配一个 Markdown 单元格 + 一个代码单元格):
- 目的(Why):这张图想回答什么问题?(例:三个流派在 popularity 维度上是否可分?)
- 做法(How):选择了哪个库、哪种方式、哪对特征,为什么这样选轴;
- 发现(What):肉眼可见的点群、重叠、离群点或趋势(例:三流派围绕某 danceability 值收敛);
- 对聚类的启示(So What):这组特征适合/不适合用来聚类,下一课应优先尝试哪种算法方向。
若使用自己搜集的数据,务必在 Notebook 中注明来源;若使用仓库其他课程的数据,同样标注数据文件路径。仓库中可作选题的数据还包括 2-Regression/data/US-pumpkins.csv(南瓜价格)与 4-Classification/data/cleaned_cuisines.csv(菜系配料),跨课程取数本身就是"调研不同数据集"的加分项。
9. 参考实现与验收清单
9.1 仓库可参考的实现
- 官方 Python 解答:5-Clustering/1-Visualize/solution/notebook.ipynb
- R 语言版本(R 学习者可对照):5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb(另有同目录
.Rmd与.html渲染版) - Julia 语言说明:5-Clustering/1-Visualize/solution/Julia/README.md
- 课程正文(含聚类算法选型表与全部可视化代码):5-Clustering/1-Visualize/README.md
9.2 提交前自查清单
- Notebook 中恰好包含(或超过)5 张散点图;
- 至少使用了2 种以上绘图方式或库(如 jointplot / FacetGrid / scatterplot / pairplot / pandas 内置绘图);
- 每张图都有 Markdown 文字说明,包含目的、做法、发现与聚类启示;
- 若使用了仓库外的数据,已在 Notebook 中标注来源;
- Notebook 从上到下可完整运行(可从模板 notebook.ipynb 起步);
- 数据清洗(过滤 Missing 流派、popularity=0)有据可查,而不是凭空丢行。
对照评分表:满足前三条即达到"优秀(Exemplary)"档;只画图不写说明、数量不足 5 张,则落入"合格(Adequate)"档;代码残缺无法运行,只能得到"需改进(Needs Improvement)"。本作业完成后,你将带着"三个流派在该特征空间松散重叠"的明确判断进入下一课——用 K-Means 在这些看似纠缠的数据中寻找隐藏的分组。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考