数据概览与特征说明
本 Spotify ML 练习数据集专为机器学习初学者设计,旨在提供端到端的 ML 管道实践资源。原始数据含 24 个特征,经处理后扩展至 158 个工程特征,涵盖 11.4 万 + 首 Spotify 歌曲信息。
,涵盖流行度评分、音频特征、流派标签、聚类目标及艺术家统计量。
核心特征分类
- 基础指标 :
popularity
(0-100 分)、explicit
(布尔值)、音频特征(danceability
、energy
、loudness
等)。 - 流派相关 :原始流派
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 (流派) → 分类任务的标签
-
danceability 、 energy 、 loudness 等音频特征 → 作为输入特征
在探索阶段,我们还可以做一些可视化,了解特征分布和相关性:
import matplotlib.pyplot as plt
import seaborn as snssns.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'])
接着,我们将原本分离的调式特征 key
与 mode
合并成新的单一变量 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
),这是一个典型的回归问题。
实现思路 :
选取与流行度高度相关的特征,如 danceability
、energy
、loudness
、tempo
、energy_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_reportclf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
注意 :由于流派类别众多且不平衡,模型训练时可以考虑类别权重调整或过采样技术。
聚类任务(情绪分组)
任务目标 :基于音频特征对歌曲进行无监督聚类,识别情绪相近的歌曲组。
实现思路 :
利用 danceability
、energy
、valence
等情绪相关特征,应用 K-means 或层次聚类方法,将歌曲划分为若干情绪类别。通过与数据集自带的 mood_cluster
标签对比,评估聚类效果。
from sklearn.cluster import KMeansfeatures = 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获取数据