











關鍵詞:菜品推薦;Spark;協同過濾算法;HDFS
0 引言(Introduction)
隨著社會信息化水平的不斷提高,大數據技術越來越多地被運用到人們的生產和生活中?;诨ヂ摼W的智能推薦系統在人們的生活中扮演越來越重要的角色[1]。以往在點菜過程中,顧客大多是通過服務人員介紹的方式選擇菜品,耗費的時間較長,靈活程度不高,受服務人員主觀因素的限制較大,占據較多的服務資源,而且不能精準地把握客人的喜好,因此有必要借助計算機和大數據技術完成對菜品的合理推薦。
餐飲企業通過信息技術和設備實現對菜品信息的管理,可以提高工作效率,也能更加精準地把握顧客對菜品的喜好。此處,還可以設計一款智能菜品推薦系統,既能讓顧客品嘗到自己心儀的美味,又節省了選菜時間,提高了商家的服務效率和顧客的滿意度。
1 系統概要設計(System outline design)
1.1 總體結構設計
以通過系統實現菜品的智能推薦為研究對象進行分析與設計,旨在抓住顧客的喜好和提高顧客滿意度以及減少選菜時間。餐飲推薦系統采集到的評分數據存儲在HDFS上,使用推薦模塊中的推薦模型輸出符合要求的推薦數據。餐飲推薦系統結構圖如圖1所示。
1.2 用戶功能
(1)用戶注冊:用戶進行賬號注冊時,系統會要求用戶填寫郵箱和密碼,之后系統會驗證這些信息的有效性,并將是否已注冊成功的結果返回給用戶,注冊成功則回到登錄頁面。
(2)用戶登錄:用戶在登錄頁面填寫真實的郵箱和密碼,由系統與自身數據庫進行比對與校驗。校驗通過后,將自動跳轉到推薦網頁,否則將被提示校驗失敗。
(3)菜品搜索:用戶可以在網頁頂部的搜索框中搜索想要品嘗菜品的名稱或者關鍵詞,系統會根據這些關鍵詞查找相應的菜品,并將查找到的結果返回給用戶。
(4)菜品評分:用戶查看菜品的平均評分以及菜品推薦信息,評價分值的范圍是0~5分。
(5)查看菜品:用戶可以查看推薦的菜品、爆款菜品以及所有菜品。
(6)退出登錄:用戶點擊“退出”,就會從已存在的賬號中退出,并自動進入登錄網頁。若想再次進入系統,就得重復登錄操作。
1.3 推薦功能及方案設計
(1)推薦功能是根據菜品評分,通過推薦算法向用戶推薦菜品信息。為提高用戶的交互體驗,推薦模塊中包含了爆款數據。
(2)詳情頁推薦是在用戶感興趣菜品的基礎上再次進行推送。進行符合用戶喜好的推送,往往會達到更好的推薦效果。
推薦系統的核心是推薦算法,它是整個系統的根基,推薦算法的性能好壞直接關系到系統的運行狀態。目前,主要有基于內容、關聯規則、知識推薦以及協同過濾等已經廣泛應用的推薦算法。
1.3.1 基于內容的推薦
基于內容的推薦可以在不依賴其他用戶信息的情況下,比較準確地識別用戶興趣,信息直觀易懂,具有較強的解釋性。只要用戶在網上發生了瀏覽記錄或購買行為,系統就可以根據已知項目的特征標簽推測用戶喜歡的物品。這種方法依賴于項目標記特征,因此系統推薦的商品不能保證產品的質量,并且推薦范圍狹窄、缺乏新穎性,獲取內容來源和特征提取相對困難,因此相對小眾[2]。
基于內容的推薦方法通常會建立一個用戶興趣模型和一個項目特征模型,并使用相似度測度衡量兩種模式之間的相似性,然后通過相似度排序,由高到低地向目標用戶推薦物品。基于內容的推薦通常會忽略用戶行為,只考慮物品之間的相似性。因此,與協同過濾推薦算法相比,它可以解決協同過濾算法中一些不可避免的問題,如冷啟動問題、評分數據稀疏問題等。此外,基于對物品內容的分析,它可以提供推薦物品的內容特征,并向用戶提供推薦的理由[3]。
1.3.2 協同過濾推薦
協同過濾算法是目前最成熟、使用最早、應用最廣泛的一種推薦方法,它通常采用最近鄰技術,獲取用戶與物品的共現矩陣,以用于計算用戶間或物品間的距離,并使用已被確定為最偏好用戶的項目,然后根據最接近目標用戶的項目得分權重對該產品進行預測。盡管協同過濾技術是目前最具代表性的推薦方法之一,但其也存在不少缺點,典型的問題有稀疏問題和可擴展問題等[4]。
1.3.3 基于知識推薦
在某些特定的場景,使用者的行為會在很短的時間內發生,例如購買電腦后,會持續使用此種電子產品,通常幾年內不會再次購買,因此在此類場景下,基于用戶過去的行為是無法進行推薦的。基于知識的推薦則可以根據用戶及產品的信息,得出哪種產品應該推薦給哪個用戶,從而完成推薦[5]。
1.3.4 主要推薦方法對比
各種推薦方法的優點和缺點如表1所示。
綜合以上各種推薦方法的優點和缺點,考慮到新興趣點發現與推薦個性化方面的表現,本設計選擇協同過濾推薦方法。
1.4 數據庫設計
系統中主要包含的對象為用戶和菜品,除用戶和菜品的基本屬性外,還有兩者間產生的交互屬性,需要使用數據庫存儲。系統對數據的存儲主要使用MongoDB,存儲用戶信息表(User)和菜品信息表(Menu),以及用戶的日志數據,其中日志數據以json的形式進行存儲,在用戶信息表中可以查到相應的信息,如表2所示;在菜品信息表中可以查到相應的信息,如表3所示。
2 推薦系統實現(Implementation of recommendationsystem)
2.1 數據采集
本系統需要與菜品網站數據庫結合使用,因此數據來源分為兩個部分,一部分從黃河交通學院東、西兩個校區(4個年級的學生、餐飲公司負責人、學校后勤人員、教師、校外商家等)收集真實有效的數據,另一部分通過爬蟲技術爬取“美團”數據采集原數據,以json格式存儲,原數據如圖2所示。
2.2 數據預處理
原始數據中存在很多異常數據,需要對其進行異常數據處理。為了便于存儲以及加快數據處理效率,需要對原始的數據格式進行編碼處理。將數據集劃分為訓練集、校驗集和測試集,從而對推薦模型進行評估。因為系統開發處于探索與分析階段,所以選擇在 Spark Shell環境下進行編程實現。
2.2.1 異常值數據處理
對重復評分的數據進行統計,并且使用時間戳對重復數據進行判斷,最新的評分被認定為該用戶對菜品的最終評分,刪除舊數據,實現異常值處理(圖3)。
2.2.2 數據變換處理
數據變換是將文件內容轉換成系統需要的格式以便于下一步調用。由于用戶和菜品的ID都是以字符串的形式表示,存儲空間較大,并且在調用計算時效果差、效率低,因此將其轉換為數值類型。將用戶和菜品的ID編碼都轉換為Integer類型。編碼步驟如下:(1)對用戶數據與菜品數據進行去重后,再進行排序;(2)使用排序后的原始用戶與菜品的下標值代替該用戶或菜品;(3)使用編碼后的值替換原始數據中的值。
編碼后的用戶評分數據格式為(用戶編碼,菜品編碼,評分,評分時間戳),編碼數據圖如圖4所示。
2.2.3 數據集分割
在對數據集進行編碼后,再將其進行分割、存儲,將訓練集、校驗集、測試集按時間戳的次序進行分割。原數據與編碼之后的數據全部存儲在HDFS中。
2.3 推薦模型建立
系統選取了分別基于用戶、項目和Spark ALS的3種不同的協作過濾算法,建立了相應的推薦模型并進行了比較,對推薦模型進行總體評價后,再決定選擇哪一個模型。
2.3.1 以基于用戶的協同過濾算法建模
基于用戶的協同過濾算法是根據消費者對相同產品的不同評價判定其是否具有相似度,從而找到最接近目標商戶的用戶,然后將評價最高的商品按距離最近的商戶推送給目標客戶。
通過每個用戶的得分向量統計用戶間的接近程度。通過統計各個用戶間的相似程度,能夠找出與目標用戶相似程度較大的用戶,進而按照相似程度得分對這些用戶進行排列,從而得出前k 個近鄰用戶。給目標用戶介紹前k 個近鄰用戶的高分項目,算法流程圖如圖5所示。
2.3.2 以基于菜品的協同過濾算法建模
在計算過程中,基于物品的推薦方法和基于用戶的推薦方法類似,但不同之處在于基于物品的推薦方法是通過項目之間的相似性推薦與目標用戶喜歡的物品相似的物品[6],其基本思想是消費者對某一產品的預期評估可以基于其對某一產品的加權平均數,計算得出相似性最大的k 個近鄰商品的評價,基于此建立本系統的菜品推薦模型。
2.3.3 以基于Spark ALS的協同過濾算法建立模型
交替最小二乘法(Alternating Least Squares, ALS)屬于Spark機器學習組件Spark MLlib的內置算法,是Spark MLlib中最重要的算法,也是協同過濾算法的重要思想[7]。ALS的基本思想是利用用戶對各類美食進行評分獲得的矩陣,在用戶群中尋找高度相似的用戶群,然后綜合這些用戶對同一信息的評價,預測指定用戶對此信息的喜好程度[8],用P (m ×k)和Q(n×k)的積近似表達m×n 的得分矩陣R,然后不斷最優化兩個小矩陣,最大化地還原原始評分矩陣R,從而填充評分缺失值,降低數據的稀疏性,提高算法的推薦質量[9]。這樣,就得到了一個基本模型,利用這個模型可以對未出現的用戶或者物品進行評分預測[10]。ALS矩陣分解圖如圖6 所示。
采用基于用戶、基于菜品、基于Spark ALS的3種不同的協同過濾算法建立推薦模型,其中基于用戶和基于菜品的算法是采用直接編碼的方法來完成的,這兩種算法雖然簡單直觀,但是在處理大數據集時,資源占用較大[11]。與其他算法比較,Spark ALS算法內置在Spark MLlib中,不用通過編碼實現,因此調用速度快、效率高。而且,由于Spark ALS算法在矩陣計算時應用了降維處理,因此在相同的計算條件下可以處理更大的數據量。
2.4 推薦模型的評測
對建立的模型進行評測,有利于更好地選擇模型,并能夠提高推薦準確度。因為模型是通過離線數據集構建的,所以本研究選擇離線測試。離線測試是根據真實的菜譜系統對各個算法進行評分,再利用所建立的不同的推薦算法對其進行評估。該方法不需要真正的使用者參與,方便了測試過程。
測評指標:由于不同推薦模式的樣本集呈現的評價指數不同,根據不同的呈現模式,其測評指標公式如表4所示。
主要評價指標為均方根誤差(RMSE)和平均絕對誤差(MAE)。其中,rui 為用戶u 在項目i 上的真正分數,rui 為用戶ui 的預測分數,N 為實際參與評分的項目的總分。RMSE的值越小,說明推薦結果越接近實際評分值。MAE 的值越小,說明推薦算法的準確度越高[12]。RMSE 和MAE 為評價推薦質量提供了直觀的度量方法,是兩種比較常用的評估模型[13]。
精確率(P)表示推薦物品被用戶認可的程度和準確度;召回率(R)表示消費者想要某一種產品的程度;F1指數綜合考慮精確率與召回率,能夠更客觀地評估推薦方法的優點和缺點(F1值越大,則該方法越優)。其公式如公式(1)至公式(3)所示,分類準確度指標表如表5所示。
由于基于用戶和物品的協同過濾算法的預測結果并沒有直接預測出評分,因此根據實際情況選用以上兩種測評方式中的分類器評估法,通過此測評方法和指標對三種推薦模型進行測評,結果如下。
(1)對基于用戶的推薦模型進行評測,加載推薦模型與測試數據集,為每個用戶選取k 個推薦結果,與測試數據集的實際記錄進行匹配。
(2)對基于菜品的推薦模型進行評測,首先加載推薦模型與測試數據集,為每個用戶選取k 個推薦結果;其次與測試數據集的實際記錄進行匹配。
(3)對基于Spark ALS的推薦模型進行評測,首先加載推薦模型與測試數據集,為每個用戶選取k 個推薦結果;其次與測試數據集的實際記錄進行匹配。
對評測結果進行對比,選出適合的算法模型,評測結果對比表如表6所示。
由表6可知,單純以綜合指標F1值評判,基于物品的推薦模型表現是最適合本次設計的,但當訓練數據中的用戶數很大而物品數相對較小時,適合使用基于物品的協同過濾。如果訓練數據中的用戶數相對較小,而物品數較大時,則適合使用基于用戶的協同過濾。此外,如果數據量非常大或為了提高計算效率,則考慮使用Spark ALS進行建模?;谝陨辖Y果,選取基于物品的推薦模型為主、基于Spark ALS的推薦模型為輔,分別向用戶進行菜品推薦。
2.5 推薦模型實現
展示推薦結果首先要根據日志評分數據,使用選定好的推薦模型生成推薦數據,推薦數據運行圖如圖7所示;其次需要將推薦結果通過Flume傳輸到菜品平臺上,根據推薦結果和MongoDB數據庫中的菜品信息來進行結合展示。
為了更好地服務用戶,注冊菜品推薦系統賬號進入系統后,采用基于項目的推薦模型為用戶提供定制化的推薦信息;使用Spark ALS推薦模型為用戶推薦熱門菜肴并使用戶能夠查看完整菜單,支持用戶點擊進入菜品詳情頁,同時用戶可查詢該菜品的平均評分、菜品評價、菜品用料等。根據頁面停留時間、菜品瀏覽記錄、歷史訂單等數據,可以對系統進行優化,以達到更精確的菜品推送目標。
3 結論(Conclusion)
基于Spark的餐飲平臺菜品智能推薦系統專注于解決顧客點餐時菜品選擇難的問題,可以為顧客智能化地推薦符合其偏好的菜品,提高顧客點餐效率,從而提高顧客滿意度及回頭率,同時也能提高餐廳的備餐效率。當然,該系統仍然存在欠缺之處,例如對商家的惡意評分,無法通過系統自動判斷并刪除,因此需要進一步改進。