使用UMAP对Spotify音频特征降维时丢失信息无法区分流行度聚类问题
问题核心原因
- 特征区分度不足:你选取的danceability、liveness、energy属于音频本身的声学属性,和流行度的关联天然较弱,不同流行度等级的曲目在这三个特征上本身就存在大量重叠,没有天然的聚类边界。
- UMAP默认无监督特性:原生无监督UMAP降维时不会使用你已有的流行度标签信息,只会按照特征本身的相似度排布点,所以如果特征本身区分度低,降维结果自然会完全重叠。
可落地的解决方案
- 先做特征有效性校验
首先计算三个特征和离散化流行度的斯皮尔曼相关系数,如果所有系数绝对值都低于0.1,说明这三个特征本身就无法解释流行度的差异,要么新增特征(如歌手热度、歌曲流派、发行时间、时长等),要么调整研究方向,不需要再浪费时间调聚类参数。 - 改用半监督UMAP降维
UMAP支持传入标签做半监督降维,会主动拉大不同类别样本的距离,仅需要修改一行代码即可:
# 原代码:X_reduced = reducer.fit_transform(X) # 修改为: X_reduced = reducer.fit_transform(X, y=y)
- 调整UMAP核心参数
你当前的参数更偏向保留局部结构,不利于全局类别区分,可以尝试以下调整:
reducer = umap.UMAP( n_neighbors=50, # 从10提升到30-100区间,越大越关注全局结构 min_dist=0.4, # 从0.1提升到0.3-0.5区间,增大簇之间的间隔 metric='cosine', # 替换默认的欧氏距离,更适配音频特征的相似度计算 random_state=42 # 固定随机种子保证结果可复现 )
- 优化可视化效果
如果降维后仍然有轻度重叠,可以调整绘图参数提升区分度:
plt.figure(figsize=(10, 5)) plt.title('Projecting %d-dimensional data to 2D' % X.shape[1]) # 分三类分别绘制,使用不同标记+半透明效果避免遮挡 plt.scatter(X_reduced[y==-1, 0], X_reduced[y==-1, 1], c='yellow', s=20, alpha=0.7, marker='o', label='popularity=-1') plt.scatter(X_reduced[y==0, 0], X_reduced[y==0, 1], c='red', s=20, alpha=0.7, marker='^', label='popularity=0') plt.scatter(X_reduced[y==1, 0], X_reduced[y==1, 1], c='green', s=20, alpha=0.7, marker='s', label='popularity=1') plt.colorbar(ticks=range(3), label='popularity value') plt.legend() plt.show()
如果以上调整都完成后仍然没有明显的聚类边界,说明你选取的特征集本身就不存在对应流行度的聚类结构,建议放弃聚类可视化,改用逻辑回归、随机森林等模型直接计算特征对流行度的影响系数,结果会更严谨。
内容的提问来源于stack exchange,提问作者Mariia Skripchenko
相关产品推荐
相关产品推荐

