2016-03-29 42 views
0

在Graphlab中,我正在處理一小組健身數據,以使用可以提供建議的推薦功能。數據集有userid的列,但沒有項目標識符,而是按列排列的不同項目以及與每個用戶標識對應的行中的各自評級。爲了使用任何graphlab推薦方法,我需要有userid和item id。下面是我做的:Grpahlab SFrames:與數據集一起使用SFrame的錯誤

v = graphlab.SFrame.read_csv('Data.csv') 
userId = v["user_id"] 
itemId = v["x","y","z","x1","y1","z1"] //x,y,z,x1,y1,z1 are activities that are actually the columns in Data and contains corresponding ratings given by user 

sf= graphlab.SFrame({'UserId':userId,'ItemId':itemId}) 
print sf.head(5) 

基本上,我提取從數據user_ID的山坳,並使用X,Y,Z,等試圖使一列項目Id從相同的數據中提取出列,以使其他sframe只有這2列。這段代碼產生了一個帶有2列的表格格式的sframe,但是沒有按照我在SFrame中傳遞參數的順序排列。因此,輸出將ItemId作爲第一列,然後是UserId。儘管我試圖改變在sframe中傳遞這2個元素的順序,但它仍然提供相同的輸出。有誰知道原因? 使用任何推薦方法時,這會進一步產生問題,因爲它會給出錯誤:列名稱user_id不存在。

回答

0

列排序的原因是因爲您正在將Python字典傳遞給SFrame構造函數。 Python中的字典不會按照指定的順序保存鍵,他們有自己的訂單。如果您首選「UserId」,則可致電sf.swap_columns('UserId','ItemId')

雖然列的順序不會影響推薦方法。如果沒有精確指定user_id的列,並且未指定user_id列的名稱,則會出現Column name 'user_id' does not exist錯誤。在你的情況下,你會想做:graphlab.recommender.create(sf, user_id='UserId', item_id='ItemId')

此外,你可能想看看stack方法,它可以幫助你的數據進入推薦方法期望的形式。我認爲您目前的SFrame sf將有一列字段,其中的項目標識是關鍵字,評級是值。我相信這將在這種情況下工作:

sf.stack('ItemId', new_column_name=['ItemId','Rating']) 
+0

謝謝埃文,使用堆棧()幫助使用其他推薦方法。代碼執行得很好,除非它沒有給出我以這種方式使用的推薦函數的任何結果:result = graphlab.recommender.item_similarity_recommender.create(m,user_id ='UserId',item_id ='ItemId',target ='Rating ',similarity_type ='cosine') recs = result.recommend() print recs – user6127405