歌曲分类和流行度预测

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

梳理vite构建vue项目可选的配置和组件

梳理vite构建vue项目可选的配置和组件 💡 列举通过vite构建vue3项目时可能会使用到的配置和组件,在搭建项目初期可以提前规划,提高开发效率,后续会不断扩展… unplugin-vue-router 可以监听views文件夹中的文件变化&#xff0c…

密码学(哈希函数)

4.1 Hash函数与数据完整性 数据完整性: 检测传输消息(加密或未加密)的修改。 密码学Hash函数: 构建某些数据的简短“指纹”;如果数据被篡改,则该指纹(以高概率)不再有效。Hash函数…

ESP32-S3 42引脚 语音控制模块、设备运转展示 GOOUUU TECH 果云科技S3-N16R8 控制舵机 LED开关 直流电机

最近还是想玩了下esp32,基于原来的开发板,看见佬做了一个语音识别的项目,通过这个语音识别可以控制LED开关和直流电机这些,详情可见视频(推荐)具体硬件就在下方。 信泰微】ESP32-S3 42引脚 语音控制模块、…

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…

《Kafka 理解: Broker、Topic 和 Partition》

Kafka 核心架构解析:从概念到实践 Kafka 是一个分布式流处理平台,广泛应用于日志收集、实时数据分析和事件驱动架构。本文将从 Kafka 的核心组件、工作原理、实际应用场景等方面进行详细解析,帮助读者深入理解 Kafka 的架构设计及其在大数据领域的重要性。 ​1. Kafka 的背…

Day11,Hot100(贪心算法)

贪心 (1)121. 买卖股票的最佳时机 第 i 天卖出的最大利润,即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…

STM32呼吸灯实验手册(TIM定时器)

一、实验目标 使用TIM定时器的PWM模式控制LED亮度实现LED渐亮渐灭的呼吸灯效果掌握HAL库的TIM配置方法 二、硬件准备 开发板:STM32F103C8T6LED模块:LED串联220Ω电阻两组USB-TTL调试器硬件连接 三、软件配置(STM32CubeMX) 打开…

51页精品PPT | 农产品区块链溯源信息化平台整体解决方案

PPT展示了一个基于区块链技术的农产品溯源信息化平台的整体解决方案。它从建设背景和需求分析出发,强调了农产品质量安全溯源的重要性以及国际国内的相关政策要求,指出了食品安全问题在流通环节中的根源。方案提出了全面感知、责任到人、定期考核和追溯反…

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣(LeetCode) 解法 1:动态规划(O(n) 时间,O(n) 空间) class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…

Grafana服务安装并启动

Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍:Grafana是一个开源的可视化系统监控和警报工具包…

6. grafana的graph简介

1. Settings功能 2. Visualization功能 (可视化的方式,后续会写一些) 3. Display 功能(显示方面的设置) bars 柱状图方式显示 lines(不选不会出功能) line width 线条的粗细 staircase 会让折…

react18自定义hook实现

概念:自定义 hook 是一种将组件逻辑提取到可复用函数中的方式,它允许你在多个组件中共享相同的状态和行为。自定义 hook 的本质上是一个普通的 JavaScript 函数,它可以使用 React 内部的 hook(如 useState、useEffect、useContext…

千峰React:函数组件使用(3)

多组态进行正确记忆 首先看这个代码 import { useState } from reactfunction App() {const [count, setCount] useState(0)const [count2, setCount2] useState(0)const [count3, setCount3] useState(0)const handleClick () > {setCount(count 1)}return (<div&…

xss-labs搭建及学习

搭建 搭建过程与一般的网站搭建差不多 参考资料 当出现这个界面就是成功了 学习 学习资料 xss概念理解&#xff1a;XSS跨站脚本攻击 xss常见标签&#xff1a;XSS常见触发标签 level1-直接打 这里提示payload长度为4查看一下源码 发现get传参name的值test插入了html里头&am…

网络安全审计员

在当今数字化时代&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言&#xff0c;网络安全不仅关乎数据资产的安全&#xff0c;更与组织的声誉、客户信任乃至法律法规的遵从…

安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类

文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…

SpringBoot 2 后端通用开发模板搭建(异常处理,请求响应)

目录 一、环境准备 二、新建项目 三、整合依赖 1、MyBatis Plus 数据库操作 2、Hutool 工具库 3、Knife4j 接口文档 4、其他依赖 四、通用基础代码 1、自定义异常 2、响应包装类 3、全局异常处理器 4、请求包装类 5、全局跨域配置 补充&#xff1a;设置新建类/接…

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…

基于Redis 的分布式 session 图解

Redis 分布式 Session 工作原理 1. 传统 Session 的问题 在传统单服务器环境中&#xff0c;HTTP Session 存储在应用服务器的内存中。这在分布式系统中会导致问题&#xff1a; 用户的请求可能被分发到不同服务器&#xff0c;导致会话不一致服务器宕机会导致会话丢失需要依赖…