聚类入门与数据可视化实战:用 Seaborn 探索尼日利亚音乐数据集(ML-For-Beginners 聚类课程)

聚类入门与数据可视化实战:用 Seaborn 探索尼日利亚音乐数据集(ML-For-Beginners 聚类课程) 聚类入门与数据可视化实战用 Seaborn 探索尼日利亚音乐数据集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第一课的技术指南围绕聚类Clustering这一无监督学习技术展开先讲清楚聚类的定义、适用场景与 Scikit-learn 支持的主要算法家族再以从 Spotify 抓取的尼日利亚歌曲数据nigerian-songs.csv530 条记录、16 个特征为主线逐步演示如何用 pandas 与 Seaborn 完成数据加载、清洗、相关性分析与分布可视化。读完本文你将掌握在应用聚类算法之前先通过可视化理解数据形态的完整工作流并具备在 notebook.ipynb 中复现每一步实验的能力为下一课 K-Means 聚类 做好数据准备。什么是聚类无监督学习的一种形式聚类Clustering是一种 无监督学习 方法它假定数据集没有标签或者输入不与预定义输出配对。它使用各种算法对无标签数据排序并根据数据中识别出的模式提供分组。在本项目场景中目标是判断聚类能否帮助我们发现尼日利亚听众消费音乐时的趋势与模式。数据集中每首歌曲带有danceability可舞性、acousticness声学性、loudness响度、speechiness语言性、popularity流行度、energy能量等 Spotify 音频特征——这些特征都是没有先验分组标签的数值属性正是聚类发挥作用的典型场景。在实际业务中聚类可用于市场细分判断哪个年龄段购买哪些商品异常检测从信用卡交易数据中发现欺诈医疗影像在一批医学扫描中定位肿瘤搜索分组把购物链接、图片或评论聚成一组。当数据被组织成聚类后你还可以为每个簇分配一个簇 Idcluster Id用它来代替更具识别性的个人数据引用某个数据点——这在保护数据集隐私时非常有用。有趣的历史背景聚类分析起源于 20 世纪 30 年代的人类学与心理学领域。开始使用聚类Scikit-learn 支持的方法一览Scikit-learn 提供了大量聚类方法选择哪种取决于你的用例。下表是原文档整理的 Scikit-learn 支持方法及其适用场景的简化对照方法名称适用场景K-Means通用、归纳式inductive亲和传播Affinity propagation大量、不均衡的簇、归纳式Mean-shift大量、不均衡的簇、归纳式谱聚类Spectral clustering少量、均衡的簇、直推式transductiveWard 层次聚类大量、受约束的簇、直推式凝聚聚类Agglomerative clustering大量、受约束、非欧氏距离、直推式DBSCAN非平面几何、不均衡簇、直推式OPTICS非平面几何、密度可变的不均衡簇、直推式高斯混合Gaussian mixtures平面几何、归纳式BIRCH含离群点的大数据集、归纳式理解聚类方法表中的关键术语直推式Transductivevs. 归纳式Inductive直推式推断由观察到的训练案例直接映射到特定的测试案例归纳式推断由训练案例归纳出通用规则再把这些规则应用到测试案例。举例假设数据集只有部分标签有些是黑胶唱片、有些是CD还有些是空白。你的任务是为空白项打标签。如果选择归纳式方法你会训练一个识别黑胶和CD的模型再把标签套用到无标签数据——这种方法很难正确归类盒式磁带。直推式方法则不同它先把相似物品聚成组再给整组打标签此时簇可能表现为圆形音乐物品和方形音乐物品。非平面Non-flatvs. 平面Flat几何这一对术语来自数学平面指使用 欧几里得几何即平面几何测量点间距离非平面指非欧几里得几何。欧氏距离 是两点之间线段的长度非欧氏距离 则沿曲线测量。如果你的数据在可视化后看起来不是分布在一个平面上就可能需要专门的算法来处理。距离Distances簇由它们的距离矩阵即点与点之间的距离定义。欧氏簇以点值的平均来定义包含一个质心centroid中心点距离按到质心的远近度量非欧氏距离则指聚类中心点clustroid离其他点最近的点。受约束Constrained受约束聚类 把半监督学习引入这个无监督方法点之间的关系被标记为不能链接或必须链接从而对数据集施加规则。例如若算法在无标签或半标签数据上自由运行可能产出圆形音乐物品方形音乐物品三角形物品和饼干这样低质量的簇若给定约束物品必须由塑料制成物品必须能发出音乐就能帮助约束算法做出更优决策。密度Density有噪声的数据被认为是密集的。各簇内点之间的距离经过检验可能或密或疏因此需要用合适的聚类方法分析。本课文档提到K-Means 与 HDBSCAN 在处理簇密度不均衡的噪声数据时表现差异明显。聚类算法的主要类型存在超过 100 种聚类算法具体使用取决于数据本身的性质。以下按家族分类介绍主要算法层次聚类Hierarchical clustering如果一个对象按它与邻近对象的接近程度而非更远对象来分类就基于成员到其他对象的距离形成簇。Scikit-learn 的凝聚聚类就是层次式的。质心聚类Centroid clustering这个流行算法需要选择k即要形成的簇数量随后算法确定簇的中心点并把数据聚集在该点周围。K-Means 聚类 是质心聚类的流行版本中心由最近的均值确定故得其名算法最小化到簇的平方距离。基于分布的聚类Distribution-based clustering基于统计建模重点判断一个数据点属于某簇的概率并据此分配。高斯混合方法属于此类。基于密度的聚类Density-based clustering数据点根据密度或相互聚集程度分配到簇中远离群体的点被视为离群值或噪声。DBSCAN、Mean-shift 和 OPTICS 属于此类。基于网格的聚类Grid-based clustering对多维数据集创建网格数据被划分到网格单元中从而形成簇。实战第一步加载数据并了解数据全貌聚类技术极大地受益于恰当的可视化所以本课从可视化音乐数据开始。这个练习会帮助我们判断针对这批数据的特性哪种聚类方法最有效。课程配套 notebook 位于 5-Clustering/1-Visualize/notebook.ipynb可直接打开跟随执行仓库中还提供了完整运行结果的 solution/notebook.ipynb 供对照参考。首先安装可视化包Seaborn并导入 matplotlib 与 pandas!pip install seaborn import matplotlib.pyplot as plt import pandas as pd从 nigerian-songs.csv 加载数据并预览前几行df pd.read_csv(../data/nigerian-songs.csv) df.head()注意若直接在仓库根目录运行 notebook相对路径应写作5-Clustering/data/nigerian-songs.csv。notebook 位于5-Clustering/1-Visualize/目录下时使用../data/nigerian-songs.csv。前几行数据如下该数据集中每条记录包含歌曲名、专辑、艺人、艺人顶级流派、发行年份、时长、流行度及 8 项 Spotify 音频特征、速度与拍号索引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调用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 行、16 列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用describe()查看数值列的统计分布df.describe()统计量release_datelengthpopularitydanceabilityacousticnessenergyinstrumentalnesslivenessloudnessspeechinesstempotime_signaturecount530530530530530530530530530530530530mean2015.39222298.1717.510.740.270.760.0160.15-4.950.13116.493.99std3.1339696.8218.990.120.210.150.090.122.460.0923.520.33min19988948800.2550.0006650.11100.0283-19.3620.027861.695325%201419930500.6810.08950.66900.0757-6.2990.0591102.96450%2016218509130.7610.22050.78450.0000040.1035-4.55850.098112.71475%2017242098.5310.82950.4030.875750.0002340.164-3.3310.177125.044max2020511738730.9660.9540.9950.910.8110.5820.514206.0075 既然聚类是无监督方法、不需要标签数据为什么还要展示带标签的数据在数据探索阶段标签很有用但聚类算法运行并不依赖它们。你完全可以去掉列名改用列号引用数据。注意popularity可以为 0表示歌曲没有排名稍后我们会移除这些记录。实战第二步用条形图探查最热门流派并清洗数据用 Seaborn 绘制条形图找出最热门的流派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)✅ 如果想看更多 top 值可以把top[:5]改成更大的数字或者去掉切片查看全部。注意当流派被标记为Missing表示 Spotify 没有对它分类应当剔除。通过过滤移除缺失数据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上并额外过滤掉流行度为 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)实战第三步相关性分析——聚类前的体检接下来快速检验数据是否存在特别强的相关性绘制相关性热力图corrmat df.corr(numeric_onlyTrue) f, ax plt.subplots(figsize(12, 9)) sns.heatmap(corrmat, vmax.8, squareTrue)唯一的强相关性出现在energy与loudness之间——这并不意外响度大的音乐通常能量感强。除此之外各特征间的相关性相对较弱。有趣的问题来了一个聚类算法能从这个数据中发掘出什么 注意相关不代表因果。我们有相关性的证据但没有因果性的证据。那么这个数据集在歌曲被感知的流行度与可舞性之间是否存在某种收敛FacetGrid 显示无论流派如何都有对齐的同心圆。这或许暗示尼日利亚听众的口味在该流派的某个可舞性水平上趋于收敛。✅ 尝试不同的数据点energy、loudness、speechiness以及更多或不同的音乐流派参考df.describe()表格观察数据点的整体分布看看能发现什么。实战第四步分布可视化——判断流派是否可分接下来要回答的问题是基于流行度这三个流派在可舞性的感知上是否存在显著差异用 KDE 联合分布图检查三个主要流派在 popularity 与 danceability 上的数据分布sns.set_theme(styleticks) g sns.jointplot( datadf, xpopularity, ydanceability, hueartist_top_genre, kindkde, ) 本示例使用了 KDEKernel Density Estimate核密度估计图它用连续的密度概率曲线表示数据让我们在应对多个分布时可以解释数据。总体来看三个流派在流行度和可舞性上大致对齐。要在这种松散对齐的数据中确定簇将是一个挑战。再创建同轴散点图sns.FacetGrid(df, hueartist_top_genre, height5) \ .map(plt.scatter, popularity, danceability) \ .add_legend()同样坐标轴的散点图显示出了相似的收敛模式。一般说来聚类时可以用散点图展示数据的簇因此掌握这类可视化非常有用。下一步从可视化走向 K-Means 聚类本课的结论为下一课埋下伏笔我们将带着这份过滤后的数据应用 K-Means 聚类去发现其中以有趣方式重叠的群组。在下一课 2-K-Means/README.md 中将学习如何用 Scikit-learn 对同一份尼日利亚音乐数据创建簇先用KMeans(n_clusters3)做初步聚类再借助**轮廓系数silhouette score约 0.53**评估聚类质量并通过 WCSSwithin-cluster sums of squares与肘部法则elbow method寻找最优簇数量——这正是本课可视化工作流的直接延续。挑战与延伸练习作为预习下一课的挑战制作一张关于各种聚类算法的图表思考在生产环境中你可能发现并使用哪些聚类算法以及聚类试图解决什么样的问题。另外也可以完成本课作业 assignment.md研究不同的可视化技术与库来绘制散点图散点图特别适合发现对象群组在 notebook 中记录至少五个文档完善的散点图可以使用本课数据、其他课程数据或自行获取的数据记得注明来源并解释你的发现。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考