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