python音乐推荐

推荐系统示例——音乐推荐

本次,我们专注于构建推荐系统,以寻找用户感兴趣的商品、音乐和电影。以推荐音乐为例, 我们将调用一些包,搭建模型,用于推荐歌曲。

在这项任务中,我们将研究和探索人们听音乐的情况,以及歌曲的而相关信息,做出模型,并对指定用户做推荐。 在此过程中,我们将学习如何使用最重要的数据操作放方法groupby。

数据的导入与预处理

import graphlab #导入graphlab包
song_data = graphlab.SFrame.read_csv('song_data.csv',verbose = False) #数据导入
users = song_data['user_id'].unique() #user_id唯一化,看总共有几个用户
song_data.head(2)
user_idsong_idlisten_counttitleartist
b80344d063b5ccb3212f76538
f3d9e43d87dca9e …
SOAKIMP12A8C1309951The CoveJack Johnson
b80344d063b5ccb3212f76538
f3d9e43d87dca9e …
SOBBMDR12A8C13253B2Entre Dos AguasPaco De Lucia
song
The Cove - Jack Johnson
Entre Dos Aguas - Paco De
Lucia …

根据歌手统计用户和收听次数

我们可以用unique方法,去掉用户数组中重复的元素,即选择数据列中的唯一元素。 下面,我们可以简单地count听过某首歌的用户总数,一个用户听过同一个歌手多首歌,自然是算一个用户。我们要统计用户数的歌手有:’Kanye West’、’Kanye West’、’Foo Fighters’、’Taylor Swift’和’Lady GaGa’。 因为数目比较少,我就单列出来,而不使用循环了。

song_preference_users = song_data[song_data['artist'] == 'Kanye West']['user_id'].unique()
len(song_preference_users)
2522
song_preference_users = song_data[song_data['artist'] == 'Foo Fighters']['user_id'].unique()
len(song_preference_users)
2055
song_preference_users = song_data[song_data['artist'] == 'Taylor Swift']['user_id'].unique()
len(song_preference_users)
3246
song_preference_users = song_data[song_data['artist'] == 'Lady GaGa']['user_id'].unique()
len(song_preference_users)
2928
len(users)
66346

对于每个歌手,我们可以计算其音乐被收听的总的次数,从而来判断这个歌手是否受欢迎。从结果中可以看出,最受欢迎的歌手是Kings Of Leon,最不受欢迎的歌手是William Tabbert。

artist_listen_num = song_data.groupby(key_columns='artist', operations={'total_count': graphlab.aggregate.SUM('listen_count')})
artist_listen_num.head(1)
print artist_listen_num.sort('total_count',ascending = False)
print artist_listen_num.sort('total_count',ascending = True)
+————————+————-+ | artist | total_count | +————————+————-+ | Kings Of Leon | 43218 | | Dwight Yoakam | 40619 | | Björk | 38889 | | Coldplay | 35362 | | Florence + The Machine | 33387 | | Justin Bieber | 29715 | | Alliance Ethnik | 26689 | | OneRepublic | 25754 | | Train | 25402 | | The Black Keys | 22184 | +————————+————-+ [3375 rows x 2 columns] Note: Only the head of the SFrame is printed. You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns. +——————————-+————-+ | artist | total_count | +——————————-+————-+ | William Tabbert | 14 | | Reel Feelings | 24 | | Beyoncé feat. Bun B and Sl… | 26 | | Diplo | 30 | | Boggle Karaoke | 30 | | harvey summers | 31 | | Nâdiya | 36 | | Kanye West / Talib Kweli /… | 38 | | Aneta Langerova | 38 | | Jody Bernal | 38 | +——————————-+————-+ [3375 rows x 2 columns] Note: Only the head of the SFrame is printed. You can use print_rows(num_rows=m, num_columns=n) to print more rows and columns.

建立模型,寻找最(不)值得推荐的歌曲

下面,我们建立personal_model模型模型,并根据建立的模型给全部或者部分用户做推荐。
接着我们来统计,这些推荐的歌曲中,哪些是personal_model模型推荐最多的歌曲,那个是推荐最少的歌曲。

train_data,test_data = song_data.random_split(.8,seed=0) #分割数据
personalized_model = graphlab.item_similarity_recommender.create(train_data,
                                                                user_id='user_id',
                                                                item_id='song',verbose = False);#,target='listen_count')
#新建一个item_similarity_recommender模型
#user_id作为推荐使用的i
#personalized_model.recommend(users=[users[0]])
#personalized_model.get_similar_items(['With Or Without You - U2']) #列出相似的歌曲
Recsys training: model = item_similarity
subset_test_users = test_data['user_id'].unique()#[0:10000];
recommend_result  = personalized_model.recommend(subset_test_users, k=1,verbose = False);
recommend_result.head(3);
recommanded_song_count = recommend_result.groupby(['song'], graphlab.aggregate.COUNT);
recommanded_song_count.head(2)
songCount
Your Star - The All-
American Rejects …
1
The Climb - Miley Cyrus6

song_count_sort = recommanded_song_count.sort('Count',ascending = False)
song_count_sort.head(3)
#recommanded_song_count.sort('Count',ascending = True)
songCount
Undo - Björk2504
Secrets - OneRepublic2251
Revelry - Kings Of Leon1321

可以看出,Undo - Björk的歌曲是推荐得最多的。这首歌曲的歌手是 Björk,并不是是最受欢迎歌手Kings Of Leon。主要是因为,我们在选最受欢迎歌手的时候,考虑到了一个用户听多次的情况。而我们在建立模型的时候,并没有考虑每个人对于同一首歌的收听次数,只在意其听没听。故而,若Kings Of Leon被单用户听的次数比较多,而Undo的听众比较多,就会造成这种不一致。我们也可以使用target='listen_count',来设置模型的rating。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值