ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ML-For-Beginners 聚类实战:用 Scikit-learn 对无标签数据做 K-Means 聚类分析(尼日利亚音乐品味数据集)

ML-For-Beginners 聚类实战:用 Scikit-learn 对无标签数据做 K-Means 聚类分析(尼日利亚音乐品味数据集) ML-For-Beginners 聚类实战用 Scikit-learn 对无标签数据做 K-Means 聚类分析尼日利亚音乐品味数据集【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners聚类Clustering是机器学习中典型的无监督学习任务它不依赖任何标签仅凭数据点之间的相似性自动将对象归组。本文以 ML-For-Beginners 开源课程第 5 章5-Clustering为主线带领你从聚类是什么出发先通过数据可视化摸清数据集脾性再使用 Scikit-learn 的 K-Means 算法对从 Spotify 抓取的尼日利亚歌曲数据完成从建模、评估到调优的完整实战最终掌握轮廓系数、肘部法则、WCSS 与方差等核心概念并理解为什么选对算法之前要先读懂数据。本课程区域的实战数据集来自 Spotify 抓取并托管于 Kaggle 的 Nigerian Songs 数据集见 5-Clustering/data/nigerian-songs.csv包含 530 首歌曲、16 个字段记录了danceability舞蹈性、acousticness原声性、loudness响度、speechiness语言性、popularity流行度、energy能量等音频特征。本文内容与代码均以 translations/en/5-Clustering/README.md 为骨架并对照两个课时文档与 notebook 逐行展开。为什么说聚类是监督学习的反面聚类任务的目标是识别彼此相似的对象并把它们归入同一簇cluster。它与分类等监督学习方法的本质区别在于整个过程自动发生。监督学习需要输入-输出成对的标签来训练模型而聚类直接面对无标签数据靠算法自行发现数据中潜藏的模式。这一点决定了它的适用边界当数据集没有标签时聚类是发现模式的绝佳工具当数据集有标签时此前课程学过的分类技术通常更合适。现实世界中聚类的应用场景非常广泛市场细分判断哪些年龄段购买哪些商品、异常检测从信用卡交易流水中识别欺诈、医疗影像分析在一批扫描结果中圈定肿瘤区域、搜索引擎结果分组按购物链接、图片或评论归类等。聚类还常用于在大数据集上先做降维式粗分组为后续更精细的建模铺路——即在构建其他模型之前先用聚类了解数据。一个容易被忽略的价值是隐私保护一旦数据被组织成簇就可以用簇 IDcluster ID代替更具辨识度的原始标识来引用数据点从而降低数据泄露风险。区域实战背景尼日利亚听众的音乐品味尼日利亚人口构成多元音乐偏好同样多样。本课程基于从 Spotify 抓取的歌曲数据探索尼日利亚流行的音乐及其内在规律。数据集覆盖多种音频属性尤其值得关注的是danceability、acousticness、loudness、speechiness、popularity与energy之间的相互关系——聚类算法能否从中找出令人惊喜的模式是本章的核心悬念。提示如果不想写代码也可以借助 Azure ML 等低代码工具来体验聚类模型的搭建流程详见原文链接。本章共包含两个课时构成了完整的先可视化、后建模学习路径聚类入门与数据可视化 —— 认识聚类方法体系并用 Seaborn 可视化音乐数据K-Means 聚类实战 —— 用 Scikit-learn 训练 K-Means 模型学习轮廓系数、肘部法则与方差。聚类方法全景先选对算法再谈建模Scikit-learn 提供了大量聚类算法选型完全取决于数据形态与使用场景。下表总结了各方法及其适用场景源自课时 1 文档 5-Clustering/1-Visualize/README.md方法名适用场景K-Means通用目的、归纳式inductiveAffinity propagation亲和传播簇多且不均匀、归纳式Mean-shift均值漂移簇多且不均匀、归纳式Spectral clustering谱聚类簇少且均匀、转导式transductiveWard hierarchical clusteringWard 层次聚类簇多、有约束、转导式Agglomerative clustering凝聚聚类簇多、有约束、非欧氏距离、转导式DBSCAN非平面几何、簇不均匀、转导式OPTICS非平面几何、密度不一的簇、转导式Gaussian mixtures高斯混合平面几何、归纳式BIRCH含离群点的大数据集、归纳式要真正读懂这张表需要先厘清几个关键术语转导式 vs 归纳式Transductive vs Inductive转导推理从已观察的训练案例直接映射到特定测试案例归纳推理则先从训练案例总结出一般规则再套用到测试案例。设想一个只有部分标签的数据集部分是唱片、部分是CD、部分是空白归纳式方法会训练模型识别唱片和CD再把标签套到空白数据上遇到真正属于磁带的对象时会出错转导式方法则先把相似对象归组再给整组打标签簇可能反映圆形音乐物品与方形音乐物品对未知数据更鲁棒。平面 vs 非平面几何Flat vs Non-flat geometry源于数学术语指测量点间距离时采用平面欧氏还是非平面非欧氏几何方法。欧氏距离即两点间直线段长度非欧氏距离沿曲线测量。如果数据可视化后明显不在一个平面上就需要专门的算法来处理参见 flat-nonflat 信息图。距离Distances簇由点间距离矩阵定义。欧氏簇以点值的平均确定质心centroid距离按到质心的远近衡量非欧氏距离则对应簇心clustroid即距离其他点最近的点。约束聚类Constrained clustering把半监督思想引入无监督方法将点间关系标记为不可连接cannot-link或必须连接must-link向算法强制施加规则从而改善自由聚类可能产生的低质量分组。密度Density嘈杂的数据被认为密集。各簇内点间距离可能疏密不一需要选用匹配的聚类方法例如 K-Means 与 HDBSCAN 在密度不均匀的噪声数据集上表现差异很大。五大类聚类算法速览文献中已有超过 100 种聚类算法选型取决于数据性质。课时 1 重点介绍以下五大类层次聚类Hierarchical clustering对象依据与邻近对象的接近程度归类簇基于成员彼此间距离形成。Scikit-learn 的凝聚聚类Agglomerative clustering即属此类见 hierarchical 信息图。质心聚类Centroid clustering最流行的做法需先指定簇数k算法随后确定簇中心点并围绕它聚集数据。K-Means 是质心聚类的代表中心由最近均值确定故得此名并使样本到簇的平方距离最小化见 centroid 信息图。基于分布的聚类Distribution-based clustering基于统计建模核心是计算某个数据点属于某簇的概率再据此指派高斯混合方法Gaussian mixture即属此类。基于密度的聚类Density-based clustering按数据点密度彼此聚集程度划归簇远离群体的点被视为离群点或噪声。DBSCAN、Mean-shift 与 OPTICS 属此类。基于网格的聚类Grid-based clustering针对多维数据集划分网格将数据分配到网格单元从而形成簇。实操一用可视化读懂数据课时 1聚类技术高度依赖可视化辅助因此本章先对音乐数据做全面的探索性可视化以决定哪种聚类方法最适合这批数据。以下代码可在 5-Clustering/1-Visualize/notebook.ipynb 中逐格运行。导入数据与基础探查!pip install seaborn import matplotlib.pyplot as plt import pandas as pd df pd.read_csv(../data/nigerian-songs.csv) df.head()前几行数据示例namealbumartistartist_top_genrerelease_datelengthpopularitydanceabilityacousticnessenergyinstrumentalnesslivenessloudnessspeechinesstempotime_signatureSparkyMandy The JungleCruel Santinoalternative rb2019144000480.6660.8510.420.5340.11-6.6990.0829133.0155shuga rushEVERYTHING YOU HEARD IS TRUEOdunsi (The Engine)afropop202089488300.710.08220.6830.0001690.101-5.640.36129.9933接着调用info()、isnull().sum()、describe()做三件套体检df.info() # 530 行 × 16 列无缺失 df.isnull().sum() # 所有字段缺失值均为 0 df.describe() # 各数值列的统计概览info()确认数据为 530 条记录、16 个字段其中 8 个 float64、4 个 int64、4 个 objectname、album、artist、artist_top_genre内存占用约 66.4 KB。describe()显示popularity最小值为 0——这代表歌曲在数据集中没有排名属于噪声稍后要剔除。思考聚类是无需标签的无监督方法为什么这里还展示带标签的数据因为在数据探索阶段标签能辅助人类理解但聚类算法本身并不依赖它们——你完全可以去掉列名、用列号引用数据。观察流派分布并清洗数据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)当顶部流派显示为 Missing 时说明 Spotify 没有对该歌曲分类应当剔除随后聚焦数据集中占绝对主导的三大流派并过滤掉 popularity 为 0 的噪声数据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)] 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)相关性热图correlation.png显示唯一强相关出现在energy与loudness之间——响度大的音乐通常能量高这并不意外其余字段间相关性都较弱。注意相关性不等于因果性。分布观察三个流派是否存在清晰分界分别用联合分布图KDE与散点图观察popularity与danceability的分布sns.set_theme(styleticks) g sns.jointplot( datadf, xpopularity, ydanceability, hueartist_top_genre, kindkde, )KDE核密度估计用连续概率密度曲线表示数据分布。结果显示三个流派在流行度与舞蹈性上呈现围绕某个汇聚点的同心圆形态总体松散对齐distribution.png——在这类松散对齐的数据上寻找清晰簇将是一大挑战。再用散点图验证同一结论sns.FacetGrid(df, hueartist_top_genre, height5) \ .map(plt.scatter, popularity, danceability) \ .add_legend()散点图facetgrid.png呈现相似的汇聚模式。散点图是展示数据簇的最重要可视化手段掌握它是进入聚类建模的前提。课时 1 的课后作业 5-Clustering/1-Visualize/assignment.md 要求你用不少于 5 个散点图研究不同的绘图库与画法并记录发现。实操二K-Means 聚类建模与评估课时 2课时 2 的 notebook 承接上一课清洗后的数据直接开始建模。K-Means 源自信号处理领域通过一系列迭代把数据划分成k个簇每个观测把给定数据点归到离它最近的均值簇中心点附近。簇可用 Voronoi 图 直观呈现——包含一个种子点及其对应区域。K-Means 的三步迭代过程Scikit-learn 文档将 K-Means 归纳为三步循环算法从数据集中采样选出k个中心点然后循环执行把每个样本分配到最近的质心取分配到上一轮质心的所有样本的均值生成新质心计算新旧质心的差异并重复直到质心稳定。K-Means 的主要缺点是必须事先指定簇数k好在**肘部法则elbow method**能帮助估计合理的初始k。数据准备箱线图观察离群点plt.figure(figsize(20,20), dpi200) plt.subplot(4,3,1) sns.boxplot(x popularity, data df) # ... 其余字段acousticness / energy / instrumentalness / liveness / # loudness / speechiness / tempo / time_signature / danceability / length / release_date箱线图boxplots.png显示各列存在不少离群点数据有些嘈杂。逐个剔除会让数据所剩无几因此课程选择直接挑选量纲相近的列进入建模并用LabelEncoder把artist_top_genre编码为数值from sklearn.preprocessing import LabelEncoder le LabelEncoder() X df.loc[:, (artist_top_genre,popularity,danceability,acousticness,loudness,energy)] y df[artist_top_genre] X[artist_top_genre] le.fit_transform(X[artist_top_genre]) y le.transform(y)第一个模型与轮廓系数数据集是从三大流派中切出来的先尝试k 3from sklearn.cluster import KMeans nclusters 3 seed 0 km KMeans(n_clustersnclusters, random_stateseed) km.fit(X) # 为每个数据点预测所属簇 y_cluster_kmeans km.predict(X) y_cluster_kmeans输出为每行数据预测的簇编号0、1、2组成的数组。随后用轮廓系数silhouette score量化聚类质量from sklearn import metrics score metrics.silhouette_score(X, y_cluster_kmeans) score轮廓系数取值范围为 -1 到 1越接近 1簇越致密且与其他簇分离得越好接近 0 表示簇相互重叠、样本紧贴相邻簇的决策边界负值则表示样本可能被分错了簇。本实验得分约为0.53处于中间水平说明这批数据并非特别适合此类聚类——但这不妨碍我们继续探索。肘部法则用 WCSS 和 Inertia 找最优 k之前因为只有 3 个流派所以选 3 个簇只是猜测肘部法则可以验证from sklearn.cluster import KMeans wcss [] for i in range(1, 11): kmeans KMeans(n_clusters i, init k-means, random_state 42) kmeans.fit(X) wcss.append(kmeans.inertia_)这段代码涉及几个核心概念range(1, 11)聚类过程的迭代次数即尝试 k 从 1 到 10random_state决定质心初始化的随机数生成固定它可保证结果可复现WCSSwithin-cluster sums of squares簇内平方和衡量一个簇内所有点到簇质心的平方平均距离Inertia惯性K-Means 试图最小化的目标——簇内部一致性的度量Scikit-learn 文档定义每轮迭代被追加到wcss列表k-meansScikit-learn 支持的初始化优化让质心彼此大体相距较远通常比随机初始化得到更好的结果。绘制 WCSS 随 k 变化的折线图plt.figure(figsize(10,5)) sns.lineplot(xrange(1, 11), ywcss, markero, colorred) plt.title(Elbow) plt.xlabel(Number of clusters) plt.ylabel(WCSS) plt.show()曲线手肘处的拐点即最优簇数的指示——在本数据集中拐点恰好落在 3 附近。展示簇结果并评估准确率用k 3重新建模并以散点图展示横轴 popularity、纵轴 danceability、颜色为簇标签from sklearn.cluster import KMeans kmeans KMeans(n_clusters 3) kmeans.fit(X) labels kmeans.predict(X) plt.scatter(df[popularity],df[danceability],c labels) plt.xlabel(popularity) plt.ylabel(danceability) plt.show()对照真实标签计算准确率labels kmeans.labels_ correct_labels sum(y labels) print(Result: %d out of %d samples were correctly labeled. % (correct_labels, y.size)) print(Accuracy score: {0:0.2f}. format(correct_labels/float(y.size)))结果显示模型准确率不佳簇的形状也解释了原因这批数据过于不平衡、相关性太弱、列间方差太大难以聚出清晰的簇已形成的簇很可能被最初定义的三个流派类别严重倾斜。从 Scikit-learn 文档的示意图problems.png可以看到此类簇边界不清的模型存在典型的方差variance问题。方差问题根源与优化方向方差定义为与均值之差的平方的平均值。在本问题语境下它指的是数据集中各数值与均值偏离过大导致距离度量失真。课程给出的优化思路包括更彻底地清洗数据例如剔除离群点更换参与聚类的特征列更换算法对数据进行缩放scaling解决方案 notebook 5-Clustering/2-K-Means/solution/notebook.ipynb 中保留了被注释掉的StandardScaler标准缩放代码。缩放后各列量纲趋近一致但轮廓系数反而下降、肘部曲线的折角变平滑——原因在于不做缩放时方差较小的列会携带更大权重缩放消除了这种偏差却也让簇的区分度降低。这正说明模型表现与数据预处理之间存在微妙的权衡。R 版解决方案5-Clustering/2-K-Means/solution/R/lesson_15-R.md 同级文件同样在特征选择后保留了scale()的注释代码并演示了用cluster包的silhouette()计算平均轮廓宽度的完整流程。课时 2 的作业 5-Clustering/2-K-Means/assignment.md 要求不局限于 K-Means用其他聚类方法如层次聚类、DBSCAN重做一次聚类并记录学到的东西这正好呼应了选型表里不同数据配不同算法的核心思想。小结聚类建模的完整工作流回顾本章一次合格的聚类实战应当遵循以下流程读数据加载并体检info/isnull/describe判断是否真的没有可用标签清洗数据剔除缺失流派、popularity 为 0 的噪声记录可视化探索用柱状图、热图、联合分布图与散点图观察分布、相关性与潜在汇聚点选型依据数据形态平面/非平面、簇数、密度、是否含离群点从 Scikit-learn 聚类方法表中挑选算法建模评估用轮廓系数衡量聚类质量用肘部法则WCSS/inertia确定最优 k归因与调优通过方差分析定位效果不佳的根源尝试特征缩放、更换特征列或算法来迭代优化。整个 5-Clustering 模块的英文原版文档与配套 notebook 均可在本仓库的 5-Clustering 目录下找到其中 1-Visualize 与 2-K-Means 两个子目录下还提供了 R 语言与 Julia 的解决方案方便跨语言对照学习。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表