
ML-For-Beginners 聚类可视化实战指南用 Pandas 与 Seaborn 诊断尼日利亚音乐数据集为 K-Means 聚类做准备【免费下载链接】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的第一课 Visualize系统讲解无监督学习中的聚类clustering从定义、Scikit-learn 十种聚类方法的选型对比、五大算法家族的划分到一条完整的实操链路——加载并体检一份包含 530 首尼日利亚歌曲的 Spotify 音乐数据集用柱状图、相关系数热图、KDE 联合图与散点分布图逐层诊断数据形态最终回答这份数据适合用哪种聚类算法这一前置问题。读完后你将掌握一套可复用的聚类前数据诊断方法论。一、什么是聚类无监督学习的一种聚类是无监督学习Unsupervised Learning的一个分支它假设数据集是未标注的或者说输入并不与任何预先定义的输出配对。聚类算法通过挖掘数据中隐含的模式把无标签的样本自动划分为若干组簇。与分类、回归等监督任务不同聚类在建模前不知道答案这决定了它的一个典型定位——数据探索。原始课程文档给出的现实类比很直观聚类就像把一堆洗衣物按家庭成员分拣在数据科学中聚类用于分析用户偏好、刻画任意无标签数据集的特征结构帮助理解混乱就像一个袜子抽屉。1.1 专业场景中的聚类应用在职业场景中聚类的典型用途包括市场细分market segmentation例如确定哪些年龄段的群体购买哪些商品异常检测anomaly detection例如从信用卡交易数据集中发现欺诈行为医学影像分析例如在一批医学扫描图中定位肿瘤搜索结果分组按购物链接、图片或评论对搜索结果聚合隐私保护数据被组织成簇之后可以分配一个簇 IDcluster id此后用簇 ID 指代数据点而不是用更具身份暴露性的原始字段。值得注意的是文档指出聚类分析最早起源于 20 世纪 30 年代的人类学Anthropology与心理学领域后来才进入统计学与机器学习。当你有一份想要降维后再做更细粒度分析的大数据集时聚类常被用作在其他模型之前先了解数据的技术手段。二、Scikit-learn 聚类方法选型10 种方法与使用场景Scikit-learn 提供了覆盖面很大的聚类方法族选型完全取决于你的用例。原始课程文档基于 Scikit-learn 官方文档整理了一张简化的选型表这里完整保留方法名适用场景Use caseK-Means通用、归纳式inductiveAffinity Propagation亲和传播簇数多、簇大小不均、归纳式Mean-shift均值漂移簇数多、簇大小不均、归纳式Spectral Clustering谱聚类簇数少、簇大小均匀、迁移式transductiveWard HierarchicalWard 层次聚类簇数多、带约束的簇、迁移式Agglomerative Clustering凝聚聚类簇数多、带约束、非欧氏距离、迁移式DBSCAN非平坦几何、簇大小不均、迁移式OPTICS非平坦几何、密度可变的簇大小不均、迁移式Gaussian Mixtures高斯混合平坦几何、归纳式BIRCH含离群值的大数据集、归纳式2.1 选型表背后的术语体系这张表中的几个形容词——归纳式/迁移式平坦/非平坦距离约束密度——是理解聚类选型的关键原始文档用五个名词解释块逐一展开1迁移式transductive vs 归纳式inductive迁移式推理由观察到的训练样例直接映射到特定的测试样例归纳式推理由训练样例归纳出一般规则再把规则应用到测试样例。文档给出的例子假设一份数据只被部分标注一些条目是唱片records、一些是CD、一些是空白你的任务是为空白项打标签。走归纳式路线就是训练一个模型去识别唱片和CD再把标签应用到无标签数据——这种路线对实际是磁带cassettes的条目会束手无策。而走迁移式路线算法先把相似条目聚在一起再对整组打标签此时簇可能反映圆形的音乐介质和方形的音乐介质对未见过的类别更鲁棒。2非平坦non-flat vs 平坦flat几何这一对术语源自数学指两点间距离用平坦欧氏Euclidean还是非平坦非欧氏non-Euclidean几何方式度量。欧氏距离是两点间线段的长度非欧氏距离则沿曲线度量。如果你的数据可视化后似乎不存在一个平面上就需要选用能处理非平坦几何的专门算法如表中的 DBSCAN、OPTICS。3距离Distances簇由其距离矩阵点与点之间的距离定义。距离的度量方式有多种欧氏簇由点值的平均定义含一个质心centroid或中心点距离即到该质心的距离非欧氏距离指向clustroid类簇中心点——离其他点最近的那个点clustroid 本身也有多种定义方式。4约束Constrained约束聚类把半监督学习引入这种无监督方法点与点之间的关系被标记为cannot-link不可链接或must-link必须链接相当于给数据集强加了一些规则。例如算法自由运行在一批无标签数据上时产出的簇质量可能很差把圆形音乐物方形音乐物三角形物体曲奇混在一起分组若给定约束该物品必须由塑料制成该物品必须能发出音乐算法就被约束着做出更好的选择。5密度Density含噪声的数据被认为具有密度特征。考察各簇内部点间距离可能发现簇有疏有密拥挤程度不同因此需要用恰当的聚类方法如密度型算法来分析。文档还特别提到密度型方法DBSCAN、Mean-shift、OPTICS与 K-Means 在处理簇密度不均的噪声数据集上表现差异显著这是选型时的重要判断依据。三、五大聚类算法家族聚类算法总数超过 100 种具体用哪一种取决于手头数据的性质。原始文档归纳了五个主要家族层次聚类Hierarchical clustering对象按它与近邻对象而非远处对象的接近程度分类簇的成员彼此间基于与其他对象的距离来形成。Scikit-learn 的凝聚聚类agglomerative clustering就属于层次聚类。质心聚类Centroid clustering需要预先指定k要形成的簇数然后算法确定每个簇的中心点并把数据向该中心点聚集。K-Means 是质心聚类的著名版本——中心由最近均值确定故名 K-means算法最小化数据点到簇的平方距离。分布型聚类Distribution-based clustering基于统计建模核心是计算一个数据点属于某个簇的概率再据此指派。高斯混合Gaussian mixtures方法属于此类型。密度型聚类Density-based clustering按点的密度彼此聚集的程度把数据点分入簇远离群体的点被当作离群值或噪声。DBSCAN、Mean-shift、OPTICS 属于这一类型。网格型聚类Grid-based clustering面向多维数据集先建立一张网格再把数据分配到网格的各个单元格中由此形成簇。这五大分类与第二节的选型表互相印证选型表回答什么数据形态配什么算法算法家族则回答算法的内在机制是什么。四、动手实操可视化尼日利亚音乐数据练习文件notebook.ipynb本课配套 notebook数据文件nigerian-songs.csv。聚类作为一种技术高度依赖恰当的可视化来辅助判断因此课程从可视化音乐数据开始——这一步的目的是帮助我们决定对于这种数据形态哪种聚类方法最有效。从源码结构看仓库中该 notebook 的初始状态只含一个标题单元格Nigerian Music scraped from Spotify - an analysis和一个空代码单元格即文档中的代码步骤需要你在 notebook 中逐步填写完成。4.1 准备环境并加载数据先安装可视化库再读取数据!pip install seabornimport matplotlib.pyplot as plt import pandas as pd df pd.read_csv(../data/nigerian-songs.csv) df.head()前几行数据长这样该 CSV 实际为 530 行歌曲记录、16 列namealbumartistartist_top_genrerelease_datelengthpopularitydanceabilityacousticnessenergyinstrumentalnesslivenessloudnessspeechinesstempotime_signature0SparkyMandy The JungleCruel Santinoalternative rb2019144000480.6660.8510.420.5340.11-6.6990.0829133.01551shuga rushEVERYTHING YOU HEARD IS TRUEOdunsi (The Engine)afropop202089488300.710.08220.6830.0001690.101-5.640.36129.99332LITT!LITT!AYLØindie rb2018207758400.8360.2720.5640.0005370.11-7.1270.0424130.00543Confident / Feeling CoolEnjoy Your LifeLady Donlinigerian pop2019175135140.8940.7980.6110.0001870.0964-4.9610.113111.08744wanted yourare.Odunsi (The Engine)afropop2018152049250.7020.1160.8330.910.348-6.0440.0447105.1154特征的含义可以理解为popularity流行度、danceability可舞性、energy能量、loudness响度、speechiness说话感、tempo节奏等 Spotify 音频特征外加专辑、艺人、流派、发行年份、时长、拍号等元数据。4.2 数据体检info() / isnull() / describe()第一步调用info()获取 DataFrame 的结构信息df.info()期望输出class pandas.core.frame.DataFrame RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4 KB这与数据文件本身核对一致530 个条目、8 个 float64 列、4 个 int64 列、4 个 object字符串列。第二步用isnull()复核缺失值确认各列求和为 0df.isnull().sum()name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64各列均为 0数据干净无需填补缺失值。第三步调用describe()查看数值分布df.describe()release_datelengthpopularitydanceabilityacousticnessenergyinstrumentalnesslivenessloudnessspeechinesstempotime_signaturecount530530530530530530530530530530530530mean2015.390566222298.169817.5075470.7416190.2654120.7606230.0163050.147308-4.9530110.130748116.4878643.986792std3.13168839696.8222618.9922120.1175220.2083420.1485330.0903210.1235882.4641860.09293923.5186010.333701min19988948800.2550.0006650.11100.0283-19.3620.027861.695325%201419930500.6810.0895250.66900.07565-6.298750.0591102.96125450%2016218509130.7610.22050.78450.0000040.1035-4.55850.09795112.7145475%2017242098.5310.82950.4030.875750.0002340.164-3.3310.177125.039254max2020511738730.9660.9540.9950.910.8110.5820.514206.0075这里文档提出一个值得深思的问题既然聚类是无监督方法、不需要标签为什么还要展示这些带标签的数据答案是在数据探索阶段这些标签尤其artist_top_genre很有用但聚类算法本身并不依赖它们——你完全可以删掉列名、只按列号引用数据。这也是后面用流派字段做分组对照而非目标变量的原因。另外注意popularity可以取 025 分位数就是 0代表这些歌曲没有被评出流行度稍后会过滤掉。4.3 柱状图找出最主流的流派import seaborn as sns top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop[:5].index,ytop[:5].values) plt.xticks(rotation45) plt.title(Top genres,color blue)小贴士如果想看更多头部取值把切片[:5]改大或直接去掉即可。注意当某个流派被标记为 Missing 时意味着 Spotify 没有对该艺人做流派归类应将其剔除。4.4 数据清洗去掉 Missing 流派与零流行度噪声剔除流派为 Missing 的行并重绘全流派分布df df[df[artist_top_genre] ! Missing] top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop.index,ytop.values) plt.xticks(rotation45) plt.title(Top genres,color blue)聚焦前三大流派并过滤噪声afro dancehall、afropop、nigerian pop明显主导了这份数据集同时把popularity 0的行也去掉——这些行没有流行度评级对本练习而言可视为噪声df df[(df[artist_top_genre] afro dancehall) | (df[artist_top_genre] afropop) | (df[artist_top_genre] nigerian pop)] df df[(df[popularity] 0)] top df[artist_top_genre].value_counts() plt.figure(figsize(10,7)) sns.barplot(xtop.index,ytop.values) plt.xticks(rotation45) plt.title(Top genres,color blue)4.5 相关系数热图数据之间强相关吗快速测试数据中是否存在特别强的相关性corrmat df.corr(numeric_onlyTrue) f, ax plt.subplots(figsize(12, 9)) sns.heatmap(corrmat, vmax.8, squareTrue)结论唯一强的相关出现在energy与loudness之间——响亮的音乐通常能量也高这并不意外除此之外各列之间的相关性都相对较弱。这一点恰恰是有价值的如果特征之间高度相关某些聚类方法会受到冗余维度影响而弱相关意味着每个特征都携带独立信息看看聚类算法能把这份数据做出什么花样正是下一课的看点。注意相关不等于因果我们只有相关的证据没有因果的证据。4.6 分布形态KDE 联合图与 FacetGrid 散点图练习——数据分布这三个流派在流行度决定可舞性感知这件事上是否有显著差异第一步用 KDE 联合图观察 popularity 与 danceability 的联合分布按流派着色sns.set_theme(styleticks) g sns.jointplot( datadf, xpopularity, ydanceability, hueartist_top_genre, kindkde, )你会看到围绕一个总体收敛点的同心等高线展示各流派点的分布。这里用的是 KDEKernel Density Estimate核密度估计图用连续的概率密度曲线表示数据便于在多个分布并存时做解读。总体来看三个流派在流行度与可舞性上只是松散地对齐——要在这样松散分布的数据中确定簇本身就是一项挑战。第二步创建 FacetGrid 散点图sns.FacetGrid(df, hueartist_top_genre, height5) \ .map(plt.scatter, popularity, danceability) \ .add_legend()同一坐标轴上的散点图呈现出与 KDE 图相似的分簇模式。文档在此留了一个开放问题这个数据集在歌曲流行度感知与可舞性附近是否存在收敛FacetGrid 显示存在对齐的同心圆——无论流派如何尼日利亚听众的口味是否在这个流派中收敛到某个可舞性水平你可以换不同的数据点energy、loudness、speechiness和更多或不同的流派来尝试df.describe()表能帮你把握各数据点的大致分布范围。从方法论上总结聚类工作中散点图是最常用的簇探测器因此掌握这类可视化非常实用。本课结束时我们已经完成了三件事——确认数据干净、聚焦到三个主流派、并观察到特征间相关性弱但二维分布存在松散聚类倾向下一课K-Means将直接基于这份过滤后的数据用 K-Means 算法发现其中看似以有趣方式重叠的分组。五、挑战与延伸阅读挑战为下一课做准备绘制一张关于生产环境中可能发现并使用的各类聚类算法的图表——每种聚类算法试图解决什么问题可直接对照第二节的选型表与第三节的五大算法家族来组织。自测与延伸阅读在套用聚类算法之前理解你的数据集性质是明智的。原始课程文档还推荐了两篇外部资料一篇讨论如何为你的数据形态选择正确的聚类算法另一篇带你走查不同数据形态下各聚类算法的行为差异可在仓库原文档中查看出处。课后作业研究聚类的其他可视化方式。要求见 assignment.md——用散点图可结合不同绘图库绘制并解释你的发现评分标准是呈现一个包含五个文档完善的散点图的 notebook。六、本课要点回顾聚类是无监督学习核心价值在于建模前的数据探索选型取决于数据规模、簇的均匀性、几何性质平坦/非平坦与是否需要约束。Scikit-learn 的十种主流方法各有适用场景K-Means 通用DBSCAN/OPTICS 应对非平坦几何与密度不均BIRCH 面向含离群值的大数据Gaussian Mixtures 立足概率建模。五大算法家族层次、质心、分布、密度、网格从机制层面解释了选型表的由来。实操链路上本课用 530 首尼日利亚歌曲的数据演示了完整的诊断流程info()看结构 →isnull()查缺失 →describe()看分布 → 柱状图定流派 → 过滤 Missing 与零流行度噪声 → 相关热图判断特征冗余 → KDE 与散点图观察分布形态。诊断结论数据无缺失、特征间相关弱、三维流派在 popularity×danceability 平面上松散聚集——为下一课 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),仅供参考