歌曲分类和流行度预测

news2025/3/4 16:10:52

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,直到满足停止条件。

(e)构建完整的决策树后,可以使用决策树进行分类预测。

决策树分类器的优点包括易于理解和解释、能够处理离散和连续特征、能够处理多类别问题等。然而,决策树分类器也存在一些缺点,例如容易过拟合、对输入数据的变化敏感等。因此,在实际应用中,可以通过剪枝、集成学习等方法来改进决策树分类器的性能。

从前面分析来看,先将该数据集中的数值型变量全部加入到特征工程中,再选出最优特征,然后将数据集按照二八比例分为测试集和训练集,最后进行调参训练模型,得到结果如图15。

图 15决策树分类器结果

使用该方法得到的结果并不好,准确度约为0.47。

4.1.2 随机森林分类器

随机森林是一种集成学习方法,它通过组合多个决策树来进行分类或回归。

(1)原理:

(a)随机森林由多个决策树组成,每个决策树都是独立训练的。

(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 歌曲流派分类

5.1.1 决策树分类器

用决策树分类器对该数据集进行分类,得到结果如图16。

图 16决策树分类器结果

从结果来看,使用该方法得到的结果并不好,准确度约为0.47。可能是在特征工程中未考虑到loudness与energy,acousticness与energy之间有一定的相关性。

5.1.2 随机森林分类器

对该歌曲数据集用随机森林方法进行分类,先创建一个Random Forest分类器的实例,再通过设置n_estimators参数为300来指定使用300个决策树进行集成学习,并设置random_state参数为42以确保结果的可重复性。然后使用fit方法将分类器与训练数据进行拟合,使用predict方法对测试数据进行预测,将预测结果保存在y_pred_rf变量中,最后使用metrics.accuracy_score方法计算分类器的准确率。运行结果如图17。

图 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不重启mysql情况下排查慢SQL

查状态 mysql> show variables like %slow_query_log%; 开启慢日志 mysql> set global slow_query_logON; 设置1s超时 mysql> set global long_query_time1; 如果想更小,可以设置0.5 查看慢SQL的日志 cat /var/lib/mysql/localhost-slow.log &…

27、Java 反射机制

15-1 Java 反射机制概述 Reflection(反射)是被视为动态语言的关键 动态语言:在运行时代码可以根据某些条件改变自身结构。如 C#\JavaScript\PHP 静态语言:运行时结构不可变的语言。如 Java\C\C 问题:通过直接new的方…

Android 端侧运行 LLM 框架 MNN 及其应用

MNN Chat Android App - 基于 MNN 引擎的智能聊天应用 一、MNN 框架简介与工作原理1.1 什么是 MNN?1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的优势2.3 MNN Chat Android App 的使用 三、总结 随着移动端人工智能需求的日益增长…

FPGA学习(一) —— 四位全加器

FPGA学习(一) —— 四位全加器 文章目录 FPGA学习(一) —— 四位全加器一、半加器1、半加器的真值表2、Verilog代码实现3、RTL原理图4、波形仿真 二、一位全加器1、一位全加器真值表2、Verilog代码实现3、RTL原理图4、波形仿真 三…

PHP:IDEA开发工具配置XDebug,断点调试

文章目录 一、php.ini配置二、IDEA配置 一、php.ini配置 [xdebug] zend_extension"F:\wamp64\bin\php\php7.4.0\ext\php_xdebug-2.8.0-7.4-vc15-x86_64.dll" xdebug.remote_enable on xdebug.remote_host 127.0.0.1 xdebug.remote_port 9001 xdebug.idekey"…

LINUX网络基础 - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …

QT实现单个控制点在曲线上的贝塞尔曲线

最终效果: 一共三个文件 main.cpp #include <QApplication> #include "SplineBoard.h" int main(int argc,char** argv) {QApplication a(argc, argv);SplineBoard b;b.setWindowTitle("标准的贝塞尔曲线");b.show();SplineBoard b2(0.0001);b2.sh…

Linux基础开发工具(vim编译器,yum与apt软件安装)

Linux 下载安装软件的方案 源代码安装-》》》非常麻烦与复杂一步错步步错 rmp包安装 -》》》只是安装没有对应的库与依赖相当于只是一个外壳 包管理器进行安装-》》 yum / apt(本篇重点讲解) 1.什么是软件包和软件包管理器 就好⽐ "App" 和 "应⽤商店"…

神经网络 - 激活函数(Maxout 单元)

一、Maxout 单元 Maxout 单元是一种特殊的激活函数&#xff0c;用于神经网络中&#xff0c;其主要思想是通过多个线性变换的最大值来作为神经元的输出&#xff0c;从而提高模型的表达能力和鲁棒性。 1. 数学定义 假设输入为 x&#xff0c;Maxout 单元会计算 k 个线性变换&am…

nginx+keepalived负载均衡及高可用

1 项目背景 keepalived除了能够管理LVS软件外&#xff0c;还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived&#xff0c;它是一个高性能的服务器高可用或者热备解决方案&#xff0c;Keepalived主要来防止服务器单点故障的发生问题&#xff0c;可以通过其与Nginx的…

VirtualBox虚拟机转VM虚拟机

前言&#xff1a;部分靶机只适用于VirtualBox&#xff0c;VM打不开VirtualBox的文件&#xff0c;所以需要进行转换 前置条件&#xff1a;本机已经下载VM和VirtualBox 第一步&#xff1a;文件转换 找到VirtualBox.exe所在位置&#xff0c;启动cmd窗口 文件转换的命令&#xf…

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网&#xff1a;DeepSeek 点击“开始对话”&#xff0c;进入交互页面。 在上图中&#xff0c;输入问题&#xff0c;即可获取AI生成的结果。 基础模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…

基于SpringBoot的失物招领平台的设计与实现

基于SpringBoot的失物招领平台的设计与实现 基于微信小程序的失物招领系统 失物招领小程序 校园失物招领小程序 基于微信小程序SSMMySQL开发&#xff0c;高分JAVA成品毕业设计&#xff0c;附带往届论文、启动教程、讲解视频、二次开发教程和配套安装包文件&#xff0c;论文中…

鸿蒙NEXT开发-元服务和服务卡片的开发

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 元服务基本概念 1.1 基本介绍 1.2 元…

【Spark+Hive】基于Spark大数据技术小红书舆情分析可视化预测系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目目标 三、算法介绍 四、开发技术介绍 五、项目创新点 六、项目展示 七、权威教学视频 源码获取方式在文章末尾 一、项目背景 在数字经济蓬勃发展的当下&#xff0c;社交电商平台小红书凭借其"内容电商"的独特模式&#xff0c;已…

IO基础知识和练习

一、思维导图 二、练习 1.使用标准IO函数&#xff0c;实现文件的拷贝 #include <head.h> int main(int argc, const char *argv[]) {FILE *pfopen("./one.txt","r");FILE *fpfopen("./two.txt","r");if(pNULL)PRINT_ERROR(&qu…

gradle libs.versions.toml文件

1.libs.versions.toml介绍2.创建libs.versions.toml文件3.libraries5.versions6.plugins7.bundles 1.libs.versions.toml介绍 下图是官网介绍 意思就是说项目所有插件和库的依赖版本都统一在这个文件配置。 文件中有以下四个部分 versions, 申明要使用的插件和库的版本号的…

2025 Lakehouse 趋势全景展望:从技术演进到商业重构

1. 为什么湖仓正在成为企业数据架构的必选项&#xff1f; 越来越多的企业正在通过实时数据处理能力构建核心竞争力——用户期待 APP 精准捕捉需求并实时响应&#xff0c;企业员工追求业务系统的秒级反馈&#xff0c;这些场景背后是千亿级数据资产的敏捷调度。 据 IDC 预测&am…

一、NRF2401无线通信模块使用记录

一、电路引脚图 1、引脚说明&#xff1a; 2、引脚标号&#xff1a; 找到1号引脚&#xff0c;与原理图对号入座。 3、cubemx初始化配置&#xff1a; 5、驱动文件 配置spi&#xff0c;并构建发送与接收函数接口 .h #define TX_ADR_WIDTH 5 //发射地址宽度 #define TX_PLO…

NVIDIA GPU 架构详解:Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell

目录 1. Pascal&#xff08;帕斯卡&#xff09;架构&#xff08;2016&#xff09;关键技术性能特性代表产品应用场景 2. Volta&#xff08;伏特&#xff09;架构&#xff08;2017&#xff09;关键技术性能特性代表产品应用场景 3.Turing&#xff08;图灵&#xff09;架构&#…