1. 项目介绍
本项目从kaggle平台上下载了数据集,该数据集包含了3万多首来自Spotify API 的歌曲,共有23个特征。首先对数据集进行预处理,如重复行、缺失值、标准化处理等。再对预处理后的数据进行探索性分析,观察各变量的分布情况,各变量之间是否存在关系,如线性关系、相关性等。然后根据探索分析的结果,进行歌曲分类和流行度预测。歌曲分类依次用了决策树分类器、随机森林分类器、xgboost分类器进行分类,再根据结果比较分析了哪个分类器效果好。歌曲流行度预测选用随机森林回归器和梯度提升回归器对歌曲流行度进行预测,使用sklearn中的Grid Search方法进行最佳超参数组合的搜索,得到最佳模型。最后分析在最佳模型中,各个特征的贡献率。
2. 数据介绍
该数据集共有32833首歌曲的相关数据信息,共有23个特征,具体如表1。
表格 1 变量特征
变量名 | 类型 | 含义 | 变量名 | 类型 | 含义 |
track_id | object | 歌曲id | track_name | object | 歌曲名称 |
track_artist | object | 歌曲家 | track_popularity | int64 | 歌曲人气 |
track_album_id | object | 专辑id | track_album _name | object | 专辑名称 |
track_album _release_data | object | 专辑发行日期 | playlist_name | object | 播放列表名称 |
playlist_id | object | 播放列表id | playlist_genre | object | 播放列表类型 |
playlist_subgenre | object | 播放列表子流派 | danceability | float64 | 可舞性 |
energy | float64 | 强度和活动的感知量度 | key | int64 | 音阶 |
loudness | float64 | 响度 | mode | int64 | 曲目的模态 |
speechiness | float64 | 语音类型 | acousticness | float64 | 声学 |
instrumentalness | float64 | 是否为纯音乐 | liveness | float64 | 是否现场 |
valence | float64 | 是否积极 | tempo | float64 | 平均节奏时间 |
duration_ms | int64 | 曲目时间 |
共有10个object类型的变量,9个float型变量,4个int型变量。查看该数据集前5行数据,如图1、图2。
图 1数据集前5行数据
图 2 数据集前5行数据
3. 数据预处理方法
先导入该数据集,再进行相应的数据预处理,然后进行探索性数据分析
3.1 数据预处理
数据预处理的作用是对原始数据进行清洗、转换和集成,以便于后续的数据分析和建模工作。数据清洗,可以去除数据中的噪声、异常值和缺失值,以提高数据的质量和准确性。数据标准化,对数据进行标准化处理,以消除不同特征之间的量纲差异,提高数据的可比性和可解释性。通过数据预处理,可以提高数据的质量和准确性,减少数据分析和建模过程中的误差和偏差,从而提高数据分析和建模的效果和准确性。
经过查看数据集的前5行,发现只需要处理该数据集是否有重复行、重复值、缺失值,无需进行数据降维、数据转换等。
3.1.1 处理重复行
首先查看数据集中是否存在重复行,重复行数据增加了数据的冗余,属于无效数据,应该将其删除。使用代码“df.duplicated().sum()”查看,结果如图3。
图 3 重复行结果
发现该数据集并没有重复行,因此无需进行多余的处理。
3.1.2 处理缺失值
缺失值会导致数据不完整,处理缺失值可以提高数据质量;缺失值可能会导致数据分布的偏移,处理缺失值可以减少这种偏差,使数据更符合真实情况;缺失值会影响模型的训练和预测结果,处理缺失值可以提高模型的性能和准确度;处理缺失值可以通过插补或预测的方式填充缺失值,从而保留数据中的重要信息,避免丢失有价值的数据。处理缺失值时,可以采用直接删除缺失值、插补缺失值、使用回归模型预测缺失值、使用聚类方法填充缺失值等方法。
在本项目中先使用代码“df.isnull().sum()”,检查该数据集是否有缺失值,结果如图4。
图 4 缺失值结果
发现变量“track_name”、“track_artist”、“track_album_name”,均有5个缺失值,使用插补法进行填充缺失值,将缺失值都填充为N/A。结果如图5
图 5 缺失值填充后结果
缺失值插补完成,数据集中已无缺失值。
3.2 数据探索性分析
虽然数据集已经处理完成了,但是并不清楚各变量的分布情况,及相互之间的关系,先进行一些探索性分析,为后续的分析、建模奠定基础。
首先查看变量“playlist_genre”的分布情况,即播放列表中各流派的占比情况,如图6。
图 6 播放列表中各流派占比饼状图
从饼状图结果来看,在播放列表中的各流派的占比情况相差不大,较为均匀。
接着分析在播放列表中的各流派的的人气情况,如图7、图8。
图 7 各流派人气情况
图 8 各流派人气分布条形图
从结果来看,各流派的人气中位数相差不大,其中最受欢迎的是latin流派,相对不受欢迎的是edm流派;其中rock、r&b、pop受欢迎的范围相对于其他三个流派较广。
再分析变量'energy'、'danceability'、'valence'在不同的音乐流派中是否有关联、区别,可以帮助我们发现数据中的模式、离群值和异常值,分析结果如图9。
图 9 各流派在不同特征上的关系图
从结果上可以得出,edm流派的曲目的活力最强,让人听了精力充沛;这6种流派的音乐,可舞性较好,都比较适合作为跳舞的背景音乐;edm流派的曲目偏消极一点,其他5种流派的大多数曲目偏中性,少部分既有消极的又有积极的。edm流派的律动性最好。
其次分析数值型变量,分别统计各个变量不同取值的个数,然后绘制图形观察其分布状况,如是否存在有明显的线性关系。其分析结果如图10。
图 10 数值型变量的线性图
从运行结果来看,这些数值型变量都不存在一元线性关系,但变量danceability、energy、valence、duration存在比较明显的正态分布。如变量danceability其值主要分布在0.6-0.8,表明该数据集中的曲目,大多都具有可舞性,可舞性是根据音乐元素的组合,如节奏、节奏稳定性、节拍强度和整体规律性等,来描述曲目适合跳舞的程度,即表明大多数曲目节奏、律动较好。
再用小提琴图来分析不同音乐流派的能量(Energy)的分布情况,得到的结果如图11。
图 11 不同音乐流派的energy分布小提琴图
从结果来看,pop摇滚乐和edm电舞曲往往更有活力,r&b歌曲通常是最没有活力的,这也验证了上面的结论edm流派的音乐的可舞性是最强的。
分析不同年份专辑的发行量情况,用条形图来展示,如图12。
从结果来看,2013-2019年专辑的发行量,不断增加,并且在2019年激增,约为2018年的专辑发行量的3倍,但在2020年又显著下降,猜测2019年可能发生了促进专辑发行的大事件。
然后分析各变量随年份的变化趋势,如图12。
图 12各变量随时间的变化趋势
从结果来看,随着时间的移动,该数据集中整体的声学在下降,特别是在1980年后,波动较为平缓;曲目的整体可舞性在上升,音乐的律动性越来越强;歌曲是否为现场的音频整体变化不大;歌曲中含有口语的占比在1970-2000年显著增加,整体的波动较大。
然后绘制散点图,来观察不同变量之间两两之间的关系,结果如图13。
图 13 散点图
从结果来看,发现各特征两两之间并无明显线性关系,所以在后续的类别和流行度预测的模型中无需剔除变量。
最后绘制各特征之间的热力图,如图14所示。
图 14 各特征之间热力图
发现除了loudness与energy,acousticness与energy之间有较强的相关性后,其他变量两两之间均无明显的相关性。因此在后续的建模中,应该考虑loudness与energy,acousticness与energy之间的相关性。弱相关性表明,预测曲目受欢迎程度可能受到当前数据集范围之外的因素组合的影响。由于 track_populariy 和 duration_ms 之间的相关性为 -0.14,因此较长的歌曲与平均略低的曲目受欢迎程度相关的趋势较弱。然而,这种关系并不牢固,其他因素可能会影响整体情况。
看起来track_popularity与给定的任何功能都没有很强的相关性。
随着歌曲响度的增加,歌曲的能量也可能会增加。相反,如果响度降低,能量更有可能降低。由于 track_populariy 和 duration_ms 之间的相关性为 -0.14,因此较长的歌曲与平均略低的曲目受欢迎程度相关的趋势较弱。然而,这种关系并不牢固,其他因素可能会影响整体情况。基于-0.15的相关系数,器乐性较高的歌曲与平均曲目受欢迎程度略低的趋势较弱。但是,这种关系并不牢固,其他因素可能会在决定曲目受欢迎程度方面发挥作用。
4. 构建模型方法
基于前面的探索性分析,我们对该数据集进行歌曲流派的分类和歌曲流行度的预测。
4.1 歌曲流派分类
歌曲流派分类我们分别采用决策树分类器、随机森林分类器、xgboost分类器三种机器学习方法进行分类。
4.1.1 决策树分类器
决策树分类器是一种基于树结构的机器学习算法,用于解决分类问题。它通过对数据集进行递归分割,构建一个树形结构的分类模型。
(1)原理:
(a)决策树的根节点表示整个数据集,每个内部节点表示一个特征,每个叶节点表示一个类别。
(b)决策树的构建过程是一个递归的过程,每次选择一个最优的特征进行分割,使得分割后的子集中的样本尽可能属于同一类别。
(c)决策树的构建过程会根据特征的不同取值进行分割,直到满足停止条件,例如达到最大深度、样本数量小于阈值等。
(2)实现步骤:
(a)选择一个合适的特征选择度量指标,例如信息增益、信息增益比、基尼指数等。
(b)根据特征选择度量指标,选择最优的特征进行分割。
(c)根据选择的特征的不同取值,将数据集分割成多个子集。
(d)对每个子集递归地重复步骤2和步骤3,直到满足停止条件。
决策树分类器的优点包括易于理解和解释、能够处理离散和连续特征、能够处理多类别问题等。然而,决策树分类器也存在一些缺点,例如容易过拟合、对输入数据的变化敏感等。因此,在实际应用中,可以通过剪枝、集成学习等方法来改进决策树分类器的性能。
从前面分析来看,先将该数据集中的数值型变量全部加入到特征工程中,再选出最优特征,然后将数据集按照二八比例分为测试集和训练集,最后进行调参训练模型,得到结果如图15。
使用该方法得到的结果并不好,准确度约为0.47。
4.1.2 随机森林分类器
随机森林是一种集成学习方法,它通过组合多个决策树来进行分类或回归。
(1)原理:
(b)每个决策树的训练集是通过有放回抽样(bootstrap)从原始训练集中抽取的。
(c)在每个节点上,决策树选择最佳的特征来进行分割,分割依据可以是信息增益、基尼系数等。
(d)每个决策树的分割过程会一直进行,直到达到预定的停止条件,例如达到最大深度或节点中的样本数小于某个阈值。
(e)预测时,随机森林中的每个决策树都会进行预测,最终的预测结果是通过投票或取平均值来确定的。
(2)实现步骤:
(a)准备训练集和测试集。
(b)根据需要设置随机森林的参数,例如决策树的数量、最大深度等。
(c)对于每个决策树:①从训练集中有放回地抽取样本,构建决策树。②在每个节点上选择最佳的特征进行分割。③重复步骤①和②,直到达到停止条件。
(d)对于每个测试样本,通过投票或取平均值来确定最终的预测结果。
(e)计算预测结果的准确率或其他评估指标。
4.1.3 xgboost分类器
xgboost(eXtreme Gradient Boosting)是一种基于梯度提升树的机器学习算法,它在许多数据科学竞赛中表现出色。XGBoost结合了梯度提升树和正则化技术,具有高效性和准确性。
(1)原理如下: (a)初始化模型:将所有样本的预测值初始化为一个常数,通常为样本标签的均值。(b)计算损失函数的梯度和二阶导数:根据当前模型的预测值和样本标签,计算损失函数的一阶导数(梯度)和二阶导数。(c)选择最佳分割点:对每个特征,根据样本的梯度和二阶导数,选择最佳的分割点,将样本划分为左右两个子节点。(d)计算叶子节点权重:根据样本的梯度和二阶导数,计算每个叶子节点的权重。(e)更新模型:根据叶子节点权重,更新模型的预测值。(f)迭代步骤2-5,直到达到指定的迭代次数或损失函数的收敛条件。
(2)实现步骤如下:(a)准备数据:将数据集划分为训练集和测试集,并进行特征工程,如缺失值填充、特征选择、特征缩放等。(b)初始化模型参数:设置树的最大深度、学习率、正则化参数等。(c)训练模型:使用训练集数据训练XGBoost分类器,通过迭代优化模型参数,使损失函数最小化。(d)预测结果:使用训练好的模型对测试集数据进行预测,得到分类结果。(e)评估模型:根据预测结果和真实标签,计算模型的准确率、精确率、召回率等指标,评估模型的性能。(f)调参优化:根据模型评估结果,调整模型参数,如增加树的数量、调整学习率、正则化参数等,以提高模型的性能。
通过不断迭代优化模型参数,XGBoost能够有效地处理高维稀疏数据,并在许多机器学习任务中取得优秀的性能。
4.2 歌曲流行度预测
选用随机森林回归器和梯度提升回归器对歌曲流行度进行预测,使用sklearn中的Grid Search方法进行最佳超参数组合的搜索。同时根据预测值和真实值之间的平均绝对误差MAE来选择出最佳模型。得到最佳梯度提升模型后,再根据此模型获取个特征在此模型中的贡献,并绘图直观展示,观察各特征对歌曲流行度的影响程度。
5. 研究结果及分析
5.1 歌曲流派分类
从结果来看,使用该方法得到的结果并不好,准确度约为0.47。可能是在特征工程中未考虑到loudness与energy,acousticness与energy之间有一定的相关性。
对该歌曲数据集用随机森林方法进行分类,先创建一个Random Forest分类器的实例,再通过设置n_estimators参数为300来指定使用300个决策树进行集成学习,并设置random_state参数为42以确保结果的可重复性。然后使用fit方法将分类器与训练数据进行拟合,使用predict方法对测试数据进行预测,将预测结果保存在y_pred_rf变量中,最后使用metrics.accuracy_score方法计算分类器的准确率。运行结果如图17。
该方法的准确效率约为0.87,相较于之前的决策树分类器的分类准确率明显提高。
5.1.3 xgboost分类器
先定义xgboost模型的超参数,网格搜索(grid search)调优 XGBoost 模型的超参数,进行训练获得最佳超参数和最佳模型,然后进行预测,并计算出其准确率,得到结果如图18。
图 18 xgboost分类器结果
从结果来看,该分类器最大深度为6,树为200,,准确率已经约为0.92,其分类效果是这三种分类方法中,最好的。
5.2 歌曲流行度预测
用该数据集进行流行度预测,得到的结果如图19,在该模型中各特征的贡献情况如图19。
图 19 流行度预测结果
图 20 预测模型中各特征贡献率
该预测模型的最低平均绝对误差约为16,效果还是比较好。在该预测模型中,音轨时间、速度和音量是歌曲流行度预测中贡献率前三,表明这三个特征变量是流行度预测中最重要的影响因素。
完整的数据集和源代码:
https://download.csdn.net/download/qq_62974479/90439692