小伙利用python构建基于内容的音乐过滤推荐系统,腾讯花巨资聘请

  背景:这个项目指的是Lambda学校的Lambda实验室,在这个实验室里,学生们花费了过去5周的时间来构建生产级的web应用程序,其中一些人利用机器学习模型作为后端的一部分。我们小组的任务是开发一个应用程序,根据他们的情绪,不推荐版权音乐。我是数据科学团队的一员,该团队使用Python和Django等工具实现了后端。如果你想看成品退房moodibeats在那里,你会发现1000多个免费音乐目录-其中一些被机器学习模式标记,你将在这里看到。

  

  第一部分:推荐系统简介

  每当我想到推荐系统,我就会想到这部电影:

  

  高忠诚度19年前上映的一部电影讲述的是一位名叫罗布·戈登(RobGordon)的唱片店老板,据说他的员工对音乐非常了解,以至于他们实际上阻止顾客购买他们想买的音乐。我之所以提到这一点,是因为在我们拥有Netflix、亚马逊(Amazon)和YouTube之前,真正的人是我们拥有的最接近个性化推荐系统的人。

  唱片店老板知道你喜欢什么,并推荐最新的Blink-182或绿色日相册,餐厅服务生尝过菜单上的每一种东西,并根据你以前吃过的东西准确地知道你想要什么,或者是街上的陌生人,他告诉你去你要找的地方的最快、最简单的方法-这些都是推荐系统-而且非常有效。

  问题是他们没有规模。直到互联网上出现了像谷歌这样的东西,才能扩大规模。即便如此,在数据科学的到来及其处理大量数据的能力到来之前,也无法有效地评估推荐过程。

  推荐系统一般可分为两类:

  基于协作的过滤:基于用户相似度的推荐服务-使用KNN(k近邻)或矩阵分解算法。协作过滤是个性化推荐系统的黄金标准,但你需要大量的用户数据,这就是YouTube和Amazon这样的应用能够如此有效地做到这一点的原因。基于内容的过滤:根据您试图推荐的元数据或特性提供建议。如果你推荐电影之类的东西,那么你会使用类型,演员,导演,电影长度等等。作为预测你是否想看电影的输入。

  对于MoodiBeats,由于数据的限制,我们最终采用了基于内容的过滤。

  第二部分:MoodiBeats的起源一瞥

  回到我们的Lambda实验室项目中,我们的团队在计划阶段经历了相当多的挣扎。MoodiBeats。试图将机器学习集成到一个尚不存在的Web应用程序中,其中一个主要问题是“鸡或蛋”问题-如何在没有实际数据的情况下设计一个由数据科学驱动的前端,以及如何为一个规格不太确定的网站获取数据?

  最初,数据科学家希望使用现成的csv文件,因此我们花了将近两周的时间来分析Last.fm数据集和臭名昭著的FMA数据集最终,想要避免与版权问题有关的任何事情,以及让用户下载歌曲的不切实际,前端团队决定使用YouTube的API和播放器没有版权音乐。这迫使数据科学小组彻底放弃了在last.fm和fma数据集上完成的所有工作,并重新集中精力试图在项目中期从Youtube v3API中获取数据。

  第三部分:让我们构建一个赤裸的Django后端作为RESTAPI

  警告1:我将用最少的解释快速构建Django后端,这样那些对Django没有太多经验但感兴趣的读者可以在媒体或YouTube上查阅这里的无数教程这里 .

  警告2:第三和第四部分必须很长。但是,要知道我们在这里所做的实际上是构建一个机器学习管道,它将:

  自动从Youtube API 3检索数据运行机器学习模型将YouTube数据和机器生成的预测(在本例中为心情)公开为RESTful端点

  因此,对于那些想要收集大量新数据并以一种世界其他地方都可以获取的方式获取数据的科学家来说,这是非常重要的,也许也是非常有用的。*如果你只关心数据科学部分,那就跳到第五部分。

  在命令行上:

  """Working within a virtual environment is highly recommended. For this project either Conda or Pipenv is sufficient. I'm using Python 3.6 and Django 1.11.20 and PostgreSQL for this project."""

  $ mkdir MoodiBeatsAPI && cd MoodiBeatsAPI

  # psycopg2 is for interfacing with PostgreSQL database

  $ pip install Django==1.11.20 psycopg2

  # don't forget the trailing period

  $ django-admin startproject music_selector .

  现在您选择的文本编辑器中打开项目文件夹(MoodiBeatsAPI),现在很多人使用VS代码,我仍然使用崇高文本。

  Django附带了SQLite 3作为数据库,但我的首选是始终使用PostgreSQL,所以如果您还没有PostgreSQL,我建议您在系统上安装它。

  您的项目结构应该如下所示:

  .

  ├── manage.py

  └── music_selector

  ├── __init__.py

  ├── settings.py

  ├── urls.py

  └── wsgi.py

  首先创建PostgreSQL数据库:

  

  进入你的设置.py并做出一些改变:

  

  在命令行上:

  

  如果一切顺利,你应该看到:

  

  

  现在让我们来做我们的Django应用程序,它将是我们项目的主要功能核心。我们在这里所做的就是创建一个数据库来保存我们的数据并将其公开为一个端点views.py而Django模板系统就没必要了。在命令行上:

  $ python manage.py startapp songs

  然后将你的新“歌曲”应用程序添加到设置.py在……下面已安装的应用程序 :

  INSTALLED_APPS=[

  # ...

  'songs',

  ]

  您的项目结构现在应该如下所示:

  

  

  让我们为我们的新歌曲应用程序创建一个数据库表:

  模型S.py

  

  你在上面看到的六种情绪(快乐,悲伤,自信,爱,冷,愤怒)将是我们的机器学习模型试图预测的情绪,并最终暴露为一个休息的终结点。

  这个新视频模型也是我们要为后端保存培训数据的地方。数据将来自python函数,该函数将对Youtube v3API并自动保存到我们的数据库。

  现在进去Admin.py

  

  然后在命令行上:

  $ python manage.py makemigrations

  $ python manage.py migrate

  如果你能做到这么远的话,你就会在后面拍拍手,我们已经到了一半的时候了。

  对于那些刚刚开始使用RESTfulWebAPI的人来说,最简单的思考方法是,它只是后端Web应用程序将其数据库公开为JSON的一种方式。它被认为是软件工程中最重要的发明之一,但一旦你开始自己实现它们,它就非常容易掌握和使用。

  为此,我们将需要Django REST框架,我们只需将其覆盖在我们的项目之上。

  在命令行上:

  

  现在,我们实际上要创建一个单独的“API”应用程序,它将保存所有与API相关的代码:

  $ python manage.py startapp api

  在API内部,创建一个erializers.py档案:

  

  然后在你的views.py在API应用程序中:

  

  现在创建一个urls.py在API应用程序内部,并:

  

  然后,在项目配置文件夹内的urls.py中(Music_Selector):

  

  现在转到Django管理员,并通过插入一些数据创建一个新视频对象:

  

  

  现在运行本地服务器并转到浏览器上的这个端点:

  $ python manage.py runserver

  # Point your browser to 127.0.0.1:8000/api/new-videos/

  Django REST框架最棒的特点之一是它的可浏览API,如果一切顺利的话,它应该是这样的:

  

  

  恭喜-您已经创建了一个RESTful端点!

  创建它的重要性在于,我们现在可以一种可以将其作为API使用的方式公开我们的数据,比如Reaction制作的FrontEnds,这正是我们在MoodiBeats项目中所做的。

  第四部分:让我们创建一个培训数据集

  Django最酷的部分之一是创建所谓的Management命令-管理用户可以在命令行上运行的函数:

  $ python manage.py do_something

  对于MoodiBeats的数据科学部分,我们需要一个函数来从Youtube API中获取数据并填充数据库。为此,我们在Django中创建了一个管理命令,用于获取视频_id和视频_title,并在我们的Heroku服务器上设置了一个名为Heroku Scheduler的命令,使其每24小时运行一次相同的函数-有效地创建了所谓的克伦·乔布斯 .

  要做到这一点,您必须通过以下步骤:

  在歌曲应用程序中创建一个名为管理在管理内部创建一个名为___还在管理内部创建另一个文件夹,名为命令然后在命令内部创建另一个名为___最后,在命令中创建一个名为获取新的视频。得到你自己Youtube v3API密钥$pip安装python-dotenv

  如果您真的想运行这个管理命令,请确保安装了python-dotenv。然后在顶级目录中创建一个名为.env在其中,您想要存储秘密_key或Youtube API密钥之类的内容,然后将.env添加到您的.gitignore文件中。如果你想把你的项目提交给一个GitHubRepo,你想要做这些事情。

  记住,永远不要向你的GitHubRepo或任何公共场所提交类似API密钥或任何个人的东西。如果你这样做了,你就会冒着非常坏的事情发生的风险。

  获取新的视频。

  

  如果您研究这个函数,它将被设置为从Youtube API中检索最多20个结果。我们故意q“工具性电火花加工”和videoLicense因为我们只想要没有版权的音乐视频。

  让我们运行命令

  $ python manage.py get_new_videos

  现在运行本地Django服务器并返回到您的管理员。

  你应该看到这样的东西:

  

  

  如果你点击视频_id进入细节视图,你应该在描述字段中看到视频描述。

  在大约7天的时间内,使用不同的查询参数完成这一操作,最终给出了一个包含1000多首歌曲的数据库。

  在我们进入项目的数据科学部分之前,要完成一个培训集,您要做的事情是标签你的数据。事实证明,这对我来说是一个粗鲁的觉醒,因为我最终用“正确”的情绪贴上了超过800个YouTube视频的标签。

  我对数据科学专业学生的建议是:不要习惯UCI数据存储库。

  第五部分:数据科学的时代

  我们将使用数据科学工具,所以请确保在您的虚拟环境中安装了Conda(我建议使用miniconda)、木星、Pandas和Scikit之类的工具。

  现在我们终于有了数据,现在是时候将它们转换成我们在开始时所期望的整洁的小CSV文件了。

  我们将连接到PostgreSQL数据库,查看表模式,并运行一个简单的复制命令到桌面上的一个文件夹,我创建了一个文件夹,名为CSV。

  $ psql -d postgres

  postgres=# \c moodibeats;

  moodibeats=# \dt

  moodibeats=# SELECT * FROM songs_newvideo LIMIT 5;

  \copy songs_newvideo(video_id,video_title,moods,labeled,video_description,predicted_moods) TO '/Users/sammylee/desktop/CSV/videos.csv' DELIMITER ',' CSV HEADER;

  现在启动你的木星笔记本,进口熊猫,看看数据:

  # In the same directory which contains your 'videos.csv' file

  $ jupyter notebook

  然后

  import pandas

  videos=pd.read_csv('videos.csv', encoding='utf-8')

  video.head()

  

  

  当然,在我的例子中,我们有更多的数据,其中大部分被标记,但这正是我们想要的。

  让我们回顾一下我们迄今取得的成就:

  我们构建了我们的问题(基于内容的过滤),并制定了一个计划,为数据科学构建一个Django后端,供一个Reaction前端使用。然后,我们使用Django REST框架构建了后端使用Youtube v3 api检索数据

  我们已经为MoodiBeats的数据科学部分创建了第一条通道,迷你管道。

  我们还需要记住,我们使用文本数据进行分析,这意味着我们需要使用不同的工具来进行机器学习。

  这些不同的工具中最重要的是单词包模型,它允许我们将文本表示为数字的向量。字包模型基本上是一个第一步的两步过程。 标记化 一种文本文档,然后将它们转换为单词计数的特征向量。

  例如

  

  这将返回一个Python字典,其中包含唯一的单词及其索引位置:

  {'the': 5, 'sun': 3, 'is': 1, 'shining': 2, 'weather': 6, 'sweet': 4, 'and': 0}

  此外,我们还可以看到由单词包模型为我们创建的特征向量:

  print(bag.toarray())

  # Returns

  [[0 1 1 1 0 1 0]

  [0 1 0 0 1 1 1]

  [1 2 1 1 1 2 1]]

  该数组[0,0,1]在索引位置0处的第一列表示‘and’一词,它只出现在第三句中,因此[0,0,1]。第二列[1,1,2]表示‘is’,我们可以看到,‘is’在前两句中出现一次,在最后一句中出现两次。

  我们需要的第二个工具是实际的机器学习算法。对于MoodiBeats,我们决定Logistic回归分类器

  

  

  Logistic回归的Sigmoid函数

  我们实际上所做的是建立一个非个性化的基于内容的过滤推荐系统,通过获取有关youtube音乐视频的元数据(在本例中,是以文本的形式进行视频描述),并利用该数据来预测视频本身的情绪。Logistic回归试图根据样本的概率函数对样本进行分类-S型函数,称为Sigmoid函数。设定的阈值为0.5,超过此阈值的概率被归类为1,而低于此阈值的概率被归类为0。利用这种方法对视频描述进行数值表示,我们可以找到情绪的概率,并选择概率最高的情绪作为我们的预测(1-VS-REST方法 ).

  另一个重要的考虑因素是,在处理文本数据时,您几乎总是要处理脏数据HMTL、表情符号、标点符号等等。我们还将编写一个函数来预处理脏数据。因此,我们将文本清理和文本标记结合在一起,为我们提供数据,然后我们可以在上面运行Logistic回归分类器。

  

  在实际训练之前的下一步是对我们的目标变量进行编码,这意味着将我们的情绪(快乐、自信、SAD、愤怒、冷静、爱情)转化为我们的算法可以使用的数字。

  在这里,我们假设您已经在Django管理员中查看了您的数据,观看了YouTube上的所有音乐视频,并在将其发送到Pandas DataFrame作为培训数据进行分析之前正确地标记了它们。

  from sklearn import preprocessing

  le=preprocessing.LabelEncoder()

  videos['moods_enc']=le_transform(videos['moods'])

  df.head()

  以下是我们最后形式的培训的核心:

  

  在我们更大的Youtube API数据集上训练这个模型给我们:

  Test set accuracy: 0.368

  Best parameters: {'C': 10}

  Best cross-validation score: 0.42

  虽然这些结果不是很好,但我们基本上没有时间收集更多的数据,重新训练我们的模型,因为我们的项目处于冻结状态。事实上,当我写这些话的时候,我们向全校的演讲只有一小时的时间。

  下一个挑战是将该模型投入生产。

  我们所做的是通过在Django应用程序中插入经过训练的模型来实现这个过程的自动化,以便作为一个管理命令运行:

  $ python manage.py get_new_videos

  您可以在生产中将此函数设置为Heroku Scheduler上的Cron作业,以便在调用Youtube API的同时自动运行您的预测。为了简洁起见,我将跳过这一部分,但是如果你想了解它,请在评论中告诉我。

  第六部分:经验教训

  看看这首歌

  

  我在大学一年级时发现的一个很棒的乐队

  如果我要求把它归类为我们的六种情绪之一:

  [HAPPY, CHILL, CONFIDENT-SASSY, SAD, ANGRY, IN-LOVE]

  我敢肯定,你们中的大多数人都会回答,这首歌清楚地表达了愤怒,甚至达到了愤怒的程度。

  但如果我给了你这样的东西

  

  这里发生了什么事?

  一般观众水平上的歌曲有两个维度(歌曲、歌词),而音乐视频有三个维度(歌曲、歌词、视觉)。

  第一次检查时,这首歌听起来很冷酷。而且视觉效果也有点傻(看看所有关于小预算和绿色屏幕的评论吧)。

  现在来看看这首歌的歌词:

  

  这首歌真的很酷吗?悲伤的?甚至是恋爱?

  你怎样才能得到一台机器来学习像“爱中”这样的复杂情绪呢?爱是那不勒斯人情感的冰淇淋。有一种幸福的爱,每件事都很好,两个人不能分开。有一种单相思的爱,只有一个人能感受到这种情感。甚至还有一种为长期结婚的夫妇保留的爱情,在那里,事情不是疯狂的,而是刚刚解决的。

  情绪是超主观的,因此对机器来说是一个超级难解决的问题.但还是超级有趣。

  第七部分:致谢通知书

  在兰博达学校的MoodiBeats项目中,我要感谢我的队友:

  乔纳森·伯纳尔、约翰·汉弗莱斯、赞德·杰克·德洛斯·桑托斯、马德·考萨·胡森、洛根·赫夫斯特勒、戴维娜·泰勒和我们的项目经理凯文·布拉克。

  建造MoodiBeats是我在Lambda学校所经历过的最好的和有趣的经历之一。我们的团队太棒了,我不会忘记这段经历的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值