用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!


用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

推薦系統無處不在,而且在整個網絡上都是非常標準的。亞馬遜、Netflix和許多這樣的公司都在使用推薦系統。我們將要構建的這個版本與Spotify或Youtube音樂的使用非常相似,但要簡單得多。

接下來需要用到的工具是 Tableau Python3 。先介紹一下數據集,稍後我將在數據可視化部分簡要介紹Tableau。

數據集

百萬首歌曲數據集是一個免費收集的音頻功能和元數據為一百萬個當前流行音樂曲目庫。

以下是數據集的鏈接:

https://static.turi.com/datasets/millionsong/10000.txt

https://static.turi.com/datasets/millionsong/song_data.csv

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

這是我們需要合併的兩個數據集。我們將使用Python3連接數據集並將其導入Tableau中進行數據可視化。

<code>#導入所有必需的庫
import numpy as np
import pandas as pd

#導入兩個數據集
songmetadata = pd.read_csv(r'Path where the file is located')

#其中一個文件是文本文件,因此我們使用pd.read_fwf導入它
#fwf代表固定寬度文件
othersongdata = pd.read_fwf(r'Path where the file is located')

#為 othersongdata 命名列
othersongdata.columns = ['user_id','song_id','listen_count’]

#合併數據集並刪除重複項
song_df = pd.merge(othersongdata, songmetadata.drop_duplicates(['song_id']), on="song_id", how="left")

#在.csv中寫入文件以在Tableau中可視化
song_df.to_csv(r'Path where you want to store the exported CSV file\\File Name.csv', index = False)/<code>

在合併數據集之後,我們得到的是一個一百萬首歌曲的數據集,數據集有超過一百萬個觀測數據,由七個變量組成。

<code>Song_id = Object
#數據集中每首歌的唯一ID,數據集中總共有1000首歌
User_id = Object #
Unique ID for every user
每個用戶的唯一ID
Listen_count = int

#Number of times a song was listened by an user
Artist_name = Str
#Name of Artist
Title = Str
#Title of each song
Year = int
#Categorical variable with lot of zero values
Release = Str
#Album to which the songs belong to/<code>

數據可視化

可視化能給你所有你不知道的問題的答案--本·施奈德曼

可視化數據、理解數據和發現見解總是一個很好的實踐。我使用Tableau是因為它很快,並且提供了大量可視化數據集的選項。Tableau大大改進了我們的工作流程,此外,它是免費的!

什麼是TreeMaps?

在這個項目中廣泛使用TreeMaps來顯示數據,這些數據可視化後的非常易於觀看,而且是可定製化的。

維基百科已經用一種我無法理解的格式解釋它:

Treemaps將分層(樹結構)數據顯示為一組嵌套矩形。樹的每個分支都有一個矩形,然後用代表分支的較小矩形平鋪。葉節點的矩形區域與數據的指定維度成比例。通常葉節點被著色以顯示數據的單獨維度。--維基百科

Tableau

在寫這篇文章的時候,我想,什麼是最好的方式來解釋一個人,“如何在Tableau中創建TreeMaps?”. 我不想通過截圖的途徑。我能做什麼?所以我製作了一個容易理解的視頻。

要將數據轉換為表格,需要將.csv轉換為excel工作簿。您可以使用python中的以下命令輕鬆完成此操作:

<code>song_df.to_excel("millionsong.xlsx")/<code>

有時轉換需要大量的時間,所以我在這裡提供了一個可以隨時下載的excel工作簿。

無論如何,這是一個全面的Tableau指南,它只是一個概述,讓您熟悉Tableau是如何工作的,以及TreeMaps是如何製作的。

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

第一個TreeMap表示數據集中年份變量相對於偵聽計數的比例。圖表顯示數據集中有許多零。由於我們在創建音樂推薦系統時不會使用Year變量,因此我們不會刪除這些觀察結果。

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

第二個TreeMap表示與數據集中的總偵聽計數相關的藝術家。Coldplay以36406首點擊率成為數據集中最受關注的藝術家,其次是Kings Of Leon,點擊率為32552。

業務問題

太多的選擇會讓用戶不知所措。如果提供的選項太多,用戶可能不會購買任何東西。像Spotify這樣的流媒體服務有大量的目錄。識別用戶可能喜歡的跟蹤並推薦他們可能喜歡的產品對他們的業務至關重要。

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

我們將創建兩個播放列表,一個是流行的播放列表,第二個是識別與用戶已經喜歡的歌曲相似的歌曲,從而為他們提供個性化的推薦。

推薦系統

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

基於內容的推薦系統

CBRS根據項目的特徵和其他項目元素之間的相似性推薦項目。假設用戶已經看過喜劇類型的電影,CBRS將推薦同樣屬於喜劇類型的電影。

協同過濾推薦系統

用戶偏好和態度被認為是創建cfr的基礎。CFRS推薦的項目與用戶已經選擇的相似。我們將使用皮爾遜相關來計算相似軌跡之間的關係。

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

為什麼我們使用協同而不是關聯?

關聯只描述了兩個變量之間的關係,而協同不僅描述了兩個變量之間的關係,還描述了兩個變量之間的強度。因此,當我們創建一個協同過濾推薦系統時,我們使用相關性。

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

開始編寫代碼

首先,我們創建流行的播放列表。

<code>import pandas as pd
songmetadata = pd.read_csv(r'E:\\Analytics\\song_data.csv')
othersongdata = pd.read_fwf(r'E:\\Analytics\\10000.txt’)
songmetadata = pd.DataFrame(songmetadata)
othersongdata.columns = ['user_id','song_id','listen_count’]
song_df = pd.merge(othersongdata, songmetadata.drop_duplicates(['song_id']), on="song_id“, how ="left“)
song_grouped = song_df.groupby(['title']).agg({"listen_count":"count"})
grouped_sum = song_grouped['listen_count'].sum()

#計算每首歌曲在收聽計數中所佔的百分比

song_grouped['percentage'] = song_grouped['listen_count'].div(grouped_sum)*100

#根據偵聽計數對數據集排序
song_grouped = song_grouped.sort_values(['listen_count'],ascending = True)
song_df = song_df['listen_count'].astype(float)
popular = song_grouped.sort_values(by = 'listen_count')

#篩選數據集中的前十首歌曲
popularsongs = popular[9517:9567]
popularsongs = pd.DataFrame(popularsongs.reset_index())
popularsongs.sort_values('listen_count', ascending = False)
popularsongs/<code>
用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

現在我們將製作CFR並創建個性化播放列表,推薦系統的結果如下:

用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

<code>import numpy as np
import pandas as pd
songmetadata = pd.read_csv(r'E:\\Analytics\\song_data.csv')
othersongdata = pd.read_fwf(r'E:\\Analytics\\10000.txt')
othersongdata.columns = ['user_id','song_id','listen_count’]
song_df = pd.merge(othersongdata, songmetadata.drop_duplicates(['song_id']), on="song_id", how="left")
song_grouped = pd.DataFrame(song_df.groupby('song_id')['listen_count'].count())
song_grouped = pd.DataFrame(song_df.groupby('song_id')['listen_count'].count())
song_df.astype({'listen_count': 'int32'},{'song_id':'str'}).dtypes
song_df[song_df['song_id'] == 'SOFVZRE12A8C139783']
songs_crosstab = pd.pivot_table(song_df, values = 'listen_count', index = 'user_id', columns = 'song_id’)
songs_crosstab.head()
predictor_song_ratings = songs_crosstab['SOFVZRE12A8C139783']
predictor_song_ratings[predictor_song_ratings>= 1]
similar_songs = songs_crosstab.corrwith(predictor_song_ratings)
corr_listened_song = pd.DataFrame(similar_songs, columns = ['pearsonR'])
corr_listened_song.dropna(inplace = True)
predictor_corr_summary =corr_listened_song.join(song_grouped['listen_count'])

predictor_corr_summary = predictor_corr_summary.sort_values('pearsonR', ascending = False)
final_recommended_songs = predictor_corr_summary[predictor_corr_summary.pearsonR < 0.9999]
final_recommended_songs.sort_values('pearsonR', ascending = False)
final_recommended_songs = final_recommended_songs.reset_index()
song_df_one = song_df.drop(['listen_count'], axis=1)
similar_songs = pd.merge(final_recommended_songs, song_df_one.drop_duplicates(["song_id"]), on="song_id", how="left")
similar_songs = similar_songs.sort_values('pearsonR', ascending = False)
similar_songs.head(50)/<code>
用Python創建音樂推薦系統,下一個“網易雲音樂”創建者就是你!

以上。有從事算法推薦崗位的同學不妨練習起來!在很多音樂推薦或者電商推薦裡,使用的算法會有一定的偏差,音樂推薦算法主要考量的數據是你聽得次數最多的、收藏等,趕緊行動起來!

--END--

翻譯:未艾信息(www.weainfo.net)

查看更多最新資訊,歡迎大家點擊閱讀原文登錄我們的AI社區。

以及關注我們的公眾號:為AI吶喊(weainahan)


分享到:


相關文章: