Spotify 是全球最大的正版流媒体音乐服务平台,深受全球用户的喜爱。那么你的歌单无聊吗?一位程序员小哥对自己的Spotify歌单进行了数据分析。
几天前,我正在和一个朋友聊天,同时听着我的 Spotify 歌单里的歌。听了几首歌,她说:“你的音乐品味很有意思...你的歌单音乐很多样,器乐音乐多,还有些无聊 ”。
听到这个评论,我笑了,因为这不是第一次别人这么说我了。我承认我的音乐品味有点奇怪。比如,我会听一些 Kendrick Lamar (美国说唱歌手)的歌,然后会切换到《盗梦空间》配乐,接着又是西班牙萨尔萨舞曲。
不过,她的评论给了我一个灵感:让我们看看数据是怎么说的。
所以,我进行了一个实验。
在实验中,我分析了我的 Spotify 歌曲,看看它们是否真的很多样化,器乐音乐多而且无聊。此外,为了加强趣味性,我把这三个特征与我朋友的歌单进行了比较。最后,我构建了一个机器学习模型,目的是预测某首歌更适合我的歌单还是她的。
工具
当中使用的主要工具是 Spotify API 服务的音频特性组件。这些音频特征代表了一首歌曲的特点。稍后我将更详细地解释这些特性。
我们用 Python 来获取数据,并利用 scikit- learn 来训练机器学习模型。同时使用 R 语言进行数据分析。
数据
歌曲的数据是用我写的一个 Python 脚本获取的,该脚本获取一个用户的所有播放列表,以及特定播放列表的所有歌曲。一旦我有了歌曲的基本信息,包括 Spotify ID,我就能使用该脚本获取音乐的音频特征。
由此产生的数据集由 15 列和 1074 首歌曲组成,其中 563 首来自我的歌单,511 首来自她的歌单(从现在起,我将把我的朋友称为她)。
在数据集的 15 列中,只有与音频特性相关的部分被使用。在下面的列表中,我将介绍并解释它们的含义(在某些情况下,我只会复制来自 Spotify 的描述)。注意:所有特性的值在 0.0 - 1.0 范围内。
• 器乐性:指歌曲中的器乐量。该值越接近1.0,歌曲就越偏向器乐性。
• 原声性:指歌曲的原声性(“不插电”即表示不含电子合成音乐)。该值越接近1.0,歌曲就越具有原声性。
• 现场性:指歌曲现场录制的概率。根据官方描述“ 该值达 0.8 以上则说明歌曲很可能是现场录制”。
• 语言性:“ 指歌曲中存在语言 ”。如果一首歌曲该值高于0.66,则由语言组成,在 0.33 和0.66 之间,这首歌既包含音乐也包含语言,低于 0.33 表示该歌曲没有任何语言。
• 活力性:“指强度和活跃的感知度量。通常,充满活力的歌曲让人感觉快速,响亮,嘈杂 “。
• 舞蹈性:“ 指根据一系列的音乐元素,包括速度,节奏稳定性,拍子强度和整体规律性,从而判断歌曲是否适合舞蹈。该值为 0.0 最不适合跳舞,1.0 是最适合跳舞 “。
• 心理效价性:“ 描述歌曲传达的音乐积极性。该值越高的音乐越积极(例如,快乐,开朗,欣快),该值越低音乐则越消极(例如悲伤,沮丧,愤怒) “。
数据分析
这个报告的前提是,根据一个朋友的说法:我的歌单是多样的、器乐音乐多、无聊的。因此,我调查了这三个属性,以判断她的观点是否正确。
我将展示两个歌单所有音频特性的平均值,从而我们能了解每个数据集的主要特征。
图1 的数据表明,我的歌单的普遍特征是器乐性。图2 的数据表明,她的普遍特征是舞蹈性。然而,这些值之间的差异有多大?
下面的图表显示我的歌单特征分别减去她的对应特征。
很明显,我们可以看到器乐性和原声性(蓝条)是我歌单的显著特征,相减后值分别为 0.53 和 0.1。她的歌单特征为舞蹈性和心理效价性,均为 0.19。
结果
• 我的歌单器乐音乐更多。
• 她的歌单更有活力。
那么,对于她的第一个判断“我歌单器乐音乐多吗?”答案是肯定的。
多样性
接着回答的下一个问题:我歌单是否很多样?
为了回答这个问题,我分析了歌单中歌曲的相似性与区别性。多样的歌单意味着用户有许多不同类型的歌曲。与此相反,缺乏变化性的歌单说明所有的歌曲基本属于同一类型。
为了判断我歌单的多样性,在这里我们用到了音频特性的标准偏差。
通过图表很难判断谁的歌单更具多样性。但是如果结合所有的值并计算, 可以发现我歌单的标准差的平均值为 0.244,总和为 1.713。关于她的歌单,平均值为 0.174,总和为 1.218。
这意味着什么?较高的标准偏说明,我的歌曲音频特征不是很相似。也就是说,我的歌曲中有的器乐性很高,有的器乐性很低。
结论: 我的歌单比她的更多样。
无聊
关于第三个问题“我的歌单有多无趣?”是这次实验最有趣的部分之一。什么才是无聊的歌?对我来说很无聊的歌也许对其他人来说很有意思。
为了解答这个问题,我想象自己在一个派对上,我希望在派对上听到什么样的音乐。所以我想出了一个简单的方程式,涉及到活力性和舞蹈性特性,以及我还没有介绍的两个特性:节拍和音量。原因在于,在一个聚会上我更想听到吵闹的音乐,同时节拍又好,能激发人的活力,让人想随着舞蹈。
方程式如下:
boringness = loudness + tempo + (energy*100) + (danceability*100)
根据方程式,得分最低,歌曲越无聊,得分最高,越有趣。另外需注意,由于节拍和音量的值不在 0.0-1.0 范围内,为了保持数据的一致性,我把活力性和舞蹈性乘以 100。
结果如下:
以上为一个直方图,它显示了“无聊”值在每个数据集间的分布情况。人们可能会注意到粉色区域的峰值,即她的歌单,比蓝色的要高。另外,与蓝色区域相比,右边的粉色区域更密集(这叫做左倾斜),这意味着她歌单中无聊值大多数都比我的更高。
为了补充这个直方图,我们计算了无聊的平均值,我的为 201.735,她的为 233.284。
因此,我们可以得出结论,根据我自己的方程式,我的歌单比她的更无聊,我很可能讨厌在派对上听到自己的音乐。
机器学习 判断这首歌是她的还是我的?
该实验的最后一个目标是,看能否通过机器学习来预测一首歌属于谁。
我想把机器学习定义为,监督学习的子域,使用系统学习的数据集模型的任务。在这个学习过程中,算法寻找最优的数学函数。某种程度上,这可以解释数据特性(如音频特性)和数据标签间的关系(即歌单所有者,我或她)。因此,当系统学习数据时,它应该能够利用学习过程中所学到的知识来推断或预测一组新数据的类别。
在这个过程中,这意味着我们需要之前使用的数据集的机器学习系统。该系统能够判断出一组新的音频的特征更符合谁的歌单。
在现有的所有机器学习模型中,我使用了一个叫做逻辑回归的模型。在此不对逻辑回归的工作原理做出过多解释。可以将它理解为一个数学方程,其中的目标变量称为因变量。我们想要预测的内容(在这个例子中是歌单的所有者),取决于一个或几个独立变量(音频特征)。具体如下:
dependent_variable = magic(independent_variable_1 + independent_variable_2 + …)
因变量的值是 0 到 1 之间的数字,在这种情况下,这个值表示一首歌属于我的歌单的概率,如果这个值小于某个极限 X,这首歌属于我,否则它属于她。
在展示结果之前,我想简单介绍一下。通过网格搜索和交叉验证,得到模型参数α和迭代次数。
最佳配置如下:
• Penalty:弹性网
• α:0.001
• 迭代次数:50
以下是用于训练模型的 Python 代码。
parameters = { ‘alpha’: (0.001, 0.0001, 0.00001, 0.000001), ‘penalty’: (‘l2’, ‘elasticnet’,), ‘n_iter’: (10, 50, 100), ‘loss’: (‘log’,)
# Perform a grid search with cross validation to search for the best parameters.
grid_search = GridSearchCV(SGDClassifier(), parameters, n_jobs=-1, verbose=1, cv=5, scoring=’accuracy’) grid_search.fit(data, labels)
结果出乎意料的好!
根据一些训练和测试部,平均准确度为 82%,换句话说,10 次中有 8 次能够准确预测歌单的所有者。
一旦这个模型经过训练,它就会用于测试两首在训练中没有遇到的歌曲。第一首歌曲是来自游戏《质量效应:仙女座》的 “A Better Beginning” ,预测属于我的歌单,而第二首歌 Rihanna 的 “Love On The Brain” 则属于她的歌单。很准确。
结语
在这篇文章中,我展示了如何把对我歌单的一个无聊的观点,变成了一个实验。通过使用Spotify 的音频功能,我能够发现就像我的朋友说的,我的歌单具有多样性,器乐音乐多,而且有些无聊。为了补充,加上了一个机器学习模型,逻辑回归,从而预测一首歌更符合谁的歌单。该模型的精度为 82%,相当不错。
所有使用的代码均可在以下可以获取。这包括获取数据分析的Python脚本,R 语言脚本以及训练机器学习模型。
https://github.com/juandes/spotify-audio-features-data-experiment
有关Spotify的音频功能的详细信息,请查Spotify上的官方文档。
https://developer.spotify.com/web-api/get-audio-features/
ref:
https://medium.com/towards-data-science/is-my-spotify-music-boring-an-analysis-involving-music-data-and-machine-learning-47550ae931de