Spotify 音乐ML练习数据集含158 个特征,11

数据概览与特征说明

本 Spotify ML 练习数据集专为机器学习初学者设计,旨在提供端到端的 ML 管道实践资源。原始数据含 24 个特征,经处理后扩展至 158 个工程特征,涵盖 11.4 万 + 首 Spotify 歌曲信息。
,涵盖流行度评分、音频特征、流派标签、聚类目标及艺术家统计量。

核心特征分类

  • 基础指标popularity(0-100 分)、explicit(布尔值)、音频特征(danceabilityenergyloudness 等)。
  • 流派相关 :原始流派 track_genre,114 个 is_genre_ 哑变量,标签编码 track_genre_le
  • 工程特征loudness_intensity(响度强度)、happy_dance(欢快指数)、tempo_vs_genre(速度与流派对比)。
  • 聚类目标mood_cluster(情绪聚类)、acoustic_valence_mood_cluster(声学效价聚类)。
  • 统计量artist_song_count(歌曲数)、artists_avg_popularity(艺术家平均流行度)。

获取更多数据可以访问 https://dianshudata.com/

数据分析

1. 数据探索

import pandas as pd

# 读取数据
df = pd.read_csv('modified-spotify-dataset.csv')

# 基本信息
print(f"记录数:{df.shape[0]},特征数:{df.shape[1]}")
df.info()

# 样例数据
df[['popularity', 'danceability', 'energy', 'track_genre']].head()

我们重点查看:

  • popularity (0~100,歌曲流行度) → 回归任务的潜在目标变量

  • track_genre (流派) → 分类任务的标签

  • danceabilityenergyloudness 等音频特征 → 作为输入特征

在探索阶段,我们还可以做一些可视化,了解特征分布和相关性:

import matplotlib.pyplot as plt
import seaborn as sns

sns.histplot(df['popularity'], bins=20, kde=True)
plt.title('歌曲流行度分布')
plt.show()

corr = df[['popularity', 'danceability', 'energy', 'loudness']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.title('特征相关性')
plt.show()

2. 数据处理与工程化

在正式建模之前,需要对原始的 Spotify 数据集进行多轮优化和特征工程处理,确保它既适合初学者上手(提供的数据集已经是处理后的结果),也能支持更深入的分析与建模。首先,需要删除冗余的标识信息,例如歌曲名与专辑名,这些特征虽然在人类感知上有意义,但在机器学习任务中往往属于高基数无序文本,对模型贡献有限,还可能引入噪声。

df = df.drop(columns=['track_name', 'album_name'])

接着,我们将原本分离的调式特征 keymode 合并成新的单一变量 key_mode,这样既减少了维度,又保留了音乐调性的重要信息,方便模型直接利用。

df['key_mode'] = df['key'].astype(str) + '_' + df['mode'].astype(str)
df = df.drop(columns=['key', 'mode'])

对于流派信息,我们采用了两种编码方式:一是将 track_genre 转换为 114 个 one-hot 编码的 is_genre_* 特征,以便处理多分类任务;二是使用标签编码 (track_genre_le) 生成一个整数型流派标签,更适合树模型或嵌入向量训练。

from sklearn.preprocessing import LabelEncoder

# 标签编码
df['track_genre_le'] = LabelEncoder().fit_transform(df['track_genre'])

# One-hot 编码
df = pd.get_dummies(df, columns=['track_genre'], prefix='is_genre')

为了进一步增强特征表达能力,我们还构造了一系列复合特征。例如,通过计算 energy/danceability 得到“能量-可舞性比率”,用于衡量歌曲在动感与力量上的平衡;利用主成分分析提取的 mood_pca 则将多个情绪相关特征压缩为一个综合指标,既降低了维度,又保留了主要情绪信息。这些处理步骤显著提升了数据集在回归、分类和聚类等多种任务中的适用性。

df['energy_dance_ratio'] = df['energy'] / (df['danceability'] + 1e-5)

最终处理后的数据集包含 158 个特征,覆盖原始音频特征、流派标签、统计指标、自定义情绪特征等。

3.典型任务与实现方法

回归任务(预测流行度)

任务目标 :利用音频特征和工程化指标预测歌曲的流行度(popularity),这是一个典型的回归问题。

实现思路
选取与流行度高度相关的特征,如 danceabilityenergyloudnesstempoenergy_dance_ratio 等,使用随机森林回归器(RandomForestRegressor)或者梯度提升树(XGBoost、LightGBM)进行建模。通过 R² 和 RMSE 等指标评估预测效果。

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_squared_error

# 训练和测试数据已在前面准备好
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print(f"R²: {r2_score(y_test, y_pred):.4f}")
print(f"RMSE: {mean_squared_error(y_test, y_pred, squared=False):.4f}")

分类任务 (流派预测)

任务目标 :预测歌曲所属流派(track_genre_le),这是一个多分类问题,类别数量较多(114 个)。

实现思路
使用音频特征作为输入,流派标签作为输出。由于类别多且分布不均,可以尝试随机森林、逻辑回归、支持向量机(SVM)等模型,并使用宏平均 F1 分数(macro F1)作为评价指标。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

注意 :由于流派类别众多且不平衡,模型训练时可以考虑类别权重调整或过采样技术。

聚类任务(情绪分组)

任务目标 :基于音频特征对歌曲进行无监督聚类,识别情绪相近的歌曲组。

实现思路
利用 danceabilityenergyvalence 等情绪相关特征,应用 K-means 或层次聚类方法,将歌曲划分为若干情绪类别。通过与数据集自带的 mood_cluster 标签对比,评估聚类效果。

from sklearn.cluster import KMeans

features = df[['danceability', 'energy', 'valence']]
kmeans = KMeans(n_clusters=5, random_state=42)
df['kmeans_cluster'] = kmeans.fit_predict(features)

# 查看聚类标签与情绪标签的对比
print(df[['mood_cluster', 'kmeans_cluster']].head(10))

总结

以上任务覆盖了回归、分类和聚类三大机器学习范式,结合 Spotify 数据集丰富的特征和多样标签,能够帮助初学者全方位提升实战技能。大家可以根据需求,灵活调整特征选择和模型配置,深入挖掘音乐数据背后的规律。

可在https://dianshudata.com/dataDetail/13329获取数据

posted @ 2025-09-15 14:33  一条数据库  阅读(45)  评论(0)    收藏  举报