推薦系統的數據源與數據預處理
本文轉載自微信公眾號「數據與智能」,作者gongyouliu。轉載本文請聯系數據與智能公眾號。
大家好,我是強哥。一個熱愛暴走、讀書、寫作的人!
一、推薦系統的數據源
1. 根據產品功能要素來劃分
(1)用戶行為數據
(2)用戶畫像數據
(3)物品畫像數據
(4)場景化數據
2. 根據數據載體來劃分
(1)數據價值
(2)類別數據
(3)文本數據
(4)圖片數據
(5)音視頻數據
3. 根據數據組織形式來劃分
(1)結構化數據
(2)半結構數據
(3)非結構化數據
二、數據預處理
1. 抽提(Extract)
2. 轉換(Transform)
3. 加載(Load)
總結
推薦系統是機器學習的子領域,跟一般的機器學習算法一樣,推薦算法依賴數據來構建推薦模型,有了模型后需要進行模型訓練,最終為用戶提供個性化的推薦服務(模型推斷)。推薦系統由于其解決的問題的特性(推薦系統解決的是信息過濾與資源匹配的問題)以及自身的強業務相關性,構建推薦系統的數據來源及數據處理方式有自身的特點,本章我們就對推薦系統涉及到的數據源及數據預處理相關的知識進行介紹,方便我們在后續章節中構建推薦算法模型。
一、推薦系統的數據源
推薦系統根據用戶在產品(APP、網站等)上的操作行為,挖掘用戶的興趣點,預測用戶的興趣偏好,最終為用戶做個性化推薦。在整個推薦過程中,涉及到的要素有用戶、物品、用戶的操作行為、用戶當前所處的場景等4類。這每類要素都是具備對應數據的。按照這種要素劃分,推薦算法可以利用4類數據。另外,根據數據自身的特性,數據也可以分為數值數據、類別數據、文本數據、圖片數據、音視頻數據等5類。最后,根據推薦系統依賴的數據的組織形式(數據范式),又可以將數據分為結構化數據、半結構化數據、非結構化數據3大類。下面我們分別按照這3種分類方式來詳細描述推薦系統所依賴的數據及這些數據的特點。
1. 根據產品功能要素來劃分
根據數據來源的產品功能要素來分,推薦系統依賴的數據分為用戶行為數據、用戶畫像數據、物品畫像數據、場景化數據4大類,見下面圖1,下面我們分別介紹各類數據及其特點。
圖1:推薦系統依賴的4類數據源
(1) 用戶行為數據
行為數據是用戶在產品上的各種操作行為,比如瀏覽、點擊、播放、購買、搜索、收藏、點贊、評論、轉發、加購物車、甚至滑動、暫定、快進快退等等一切操作行為。用戶在產品上的操作行為為我們了解用戶提供了線索,用戶的操作行為也是用戶真實意圖的反饋。通過挖掘用戶行為,我們可以獲得對用戶興趣偏好的深刻洞察。
根據用戶的行為是否直接表明用戶對物品的興趣偏好,用戶行為一般分為顯式行為和隱式行為。顯式行為是直接表明用戶興趣的行為,比如點贊、評分等。隱式行為雖不是直接表示用戶的興趣,但是該行為可以間接反饋用戶的興趣變化,只要不是用戶直接評分、點贊的操作行為都算隱式反饋,包括瀏覽、點擊、播放、收藏等等。
用戶行為數據是最容易收集、數據量最多的一類數據(因為用戶的任何操作行為,我們都可以進行埋點收集)。這類數據需要我們進行收集、預處理才能最終被推薦算法使用。這類數據獲取也相對容易,只要我們按照規范進行埋點就能夠保證數據范式正確,當然埋點也是需要經驗的,目前有很多第三方服務商提供埋點實施方案,在這方面沒有經驗的企業是可以進行采購的。
有些產品由于自身特性,往往是很難收集到除了用戶行為外的其他數據的(或者即使可以收集到,但是成本太大,比如UGC產生的數據可能就非常臟亂),因此,充分利用用戶行為數據對構建高質量的推薦系統是非常關鍵的。
目前個人信息保護法正式實施了(2021年9月1日正式實施),另外國家也會開始管控算法業務,未來用戶是可以關閉日志收集等相關服務的,這對未來的推薦算法落地是有比較大的挑戰的。
(2)用戶畫像數據
用戶畫像數據是對用戶相關信息的客觀描述。包含用戶自身所帶的屬性,比如年齡、身高、體重、性別、學歷、家庭組成、職業等等。這些數據一般是穩定不變(如性別)或者緩慢變化(如年齡)的。而有些用戶畫像數據是通過用戶的行為來刻畫的,通過用戶行為給用戶打上相關標簽,這些標簽也成為用戶畫像的一部分,比如動漫迷、果粉、健身達人等等。
人類是一個社會化物種,用戶的不同屬性決定了用戶所處的階層或生活圈層。不同的階層或生活圈又有不同的行為特征、生活方式、偏好特點,在同一圈層的用戶具備一定的相似性,這種相似性為我們做個性化推薦提供了特有的方法和思路(比如基于社交關系的推薦就可以很好利用用戶畫像相關的信息)。
另外,通過用戶對物品的操作行為,我們可以將物品所具備的特征按照某種權重賦予用戶,這些特征就構建了用戶的興趣畫像,相當于給用戶打上了相關的標簽(比如喜歡看“恐怖片”的人)。從這些興趣偏好出發,我們可以給用戶做個性化推薦。
有些產品由于業務特性是可以很好地收集到用戶畫像信息的,比如支付寶、微信等需要用戶用身份證或者綁定銀行卡,這就可以獲得比較完整、隱私的用戶個人信息了。而有些產品(比如今日頭條、快手等),用戶不需要注冊就可以使用,比較難獲得用戶自身相關的信息。不管怎樣,用戶在產品上都會留下行為軌跡,基于這些行為軌跡,我們都可以挖掘出用戶行為刻畫出的畫像特征。
(3)物品畫像數據
推薦系統中最重要的一個“參與方”是待推薦的物品,物品自身是包含很多特征和屬性的。對于商品來說,品類、價格、產地、顏色、質地、外觀、品牌、保質期等等都是商品的元數據。如果有關于物品的描述信息(如電影的劇情介紹),我們還可以利用NLP技術從描述信息中提取關鍵詞來作為畫像特征。另外,圖片、音頻、視頻中,我們通過深度學習等技術也是可以提取關鍵詞來作為畫像特征的。
物品畫像也可以通過用戶行為來刻畫。比如某個物品是比較熱門的物品,我們可以給該物品打上“熱門”的標簽。某個物品很受某類人喜歡,也可以給該商品打上相關標簽,比如“白領專用”。
(4) 場景化數據
場景化數據是用戶在對物品進行操作時所處的環境特征及狀態的總稱,比如用戶所在地理位置、當時的時間、是否是工作日、是否是重大節日、是否有重大事件(比如雙十一)、當時的天氣、用戶當時的心情、用戶所在產品的路徑等等。這些場景化信息對用戶的決策是非常重要的、甚至是起決定作用的。比如,美團餓了么這類基于地理位置服務的產品,給用戶推薦餐廳是一定是在用戶所在位置或者用戶指定收貨地點附近的。
恰當地使用場景化數據,將該類數據整合到推薦算法中,可以更加精準地為用戶進行個性化推薦,產生更好的使用體驗和商業化價值。
按照產品功能要素來劃分是一種比較偏業務的劃分方式,可以讓我們更清晰地看到問題。我們在第三篇中講解召回算法時,就是按照這4類產品功能要素(即用戶行為召回、用戶畫像召回、物品畫像召回、場景信息召回)來展開的。
2. 根據數據載體來劃分
隨著互聯網與科技的發展,網絡上傳輸、交換、展示的數據種類越來越多樣化,從最初的數字、類別、文本到圖片,再到現在主流的音視頻,基于這些數據載體的不同,推薦系統建模依賴的數據可以分為5類,見下面圖2。
圖2:推薦系統依賴的5種數據載體
(1)數值數據
推薦系統算法用到的可以用數值來表示的數據都屬于這一類,比如用戶年齡、收入、商品價格、配送距離等等。數值數據也是計算機最容易處理的一類數據,基本上是直接可以用于算法中的。其他類型的數據要想很好地被推薦算法利用,一般會先利用各種方法轉化為數值數據(我們會在特征工程那一章講解具體的方法和策略)。
(2)類別數據
類別數據是這類具備有限個值的數據,類似計算機編程語言中的枚舉值,比如用戶性別、學歷、物地域、商品品牌、商品尺碼等等。類別數據也比較容易處理,一般用one-hot編碼或者編號就可以轉化為數值型數據。當然如果類別數量巨大,用one-hot編碼會導致維度很高、數據過于稀疏等問題,這時可以采用hash編碼或者嵌入的方法了。
(3)文本數據
文本數據是互聯網中數量最多的、最普遍的一類數據,物品的描述信息、新聞文本、歌詞、劇情簡介等都是文本數據。處理文本類數據需要借助自然語言處理相關技術。比如TF-IDF、LDA等都是比較傳統的處理文本數據的方法,當前比較流行的Embedding方法可以獲得比較好的效果。
(4)圖片數據
隨著智能手機攝像頭技術的成熟,圖像處理軟件的發展,以及各類APP的流行,拍照和分享照片更加容易了。另外圖片比文本更容易傳達信息,因此當前互聯網上到處充斥著各種圖片,圖片數據是互聯網上的主流數據類型,商品的展示圖、電影的縮略圖、用戶朋友圈的照片等等都以圖片的形式存在。
對于圖片類數據的處理,目前的深度學習技術相對成熟,包括圖片的分類、對象識別、OCR、圖片的特征提取等等,精度已經足夠用于產品了,在某些方面(如圖片分類)甚至超越了人類專家的水平。
(5)音視頻數據
音視頻數據我們并不陌生,甚至在移動互聯網爆發之前都已經存在了很多年了(錄音機和攝像機可以記錄聲音和視頻)。但只有當移動網絡及軟硬件成熟后,以這兩類數據為載體的產品才發展壯大。音頻類的產品有喜馬拉雅、荔枝FM等,視頻類除了愛奇藝、騰訊視頻、優酷等長視頻APP外,目前大火的抖音、快手等短視頻應用非常受歡迎。游戲直播、電商導購直播等應用也是視頻類數據的輸出媒介。音樂的數字化,各類音頻學習軟件(如樊登讀書、得到APP等)也促進了音頻數據的增長。
音視頻數據的價值密度小,占用空間多,處理相對復雜,在深度學習時代,這些復雜數據的處理也變得可行了。音頻數據可以通過語音識別轉換為文字,最終歸結為文本數據的處理問題,視頻數據可以通過抽幀轉換為圖片數據來處理。目前比較火的多模態技術也可以直接處理原始的音視頻數據。
圖片、音視頻數據屬于富媒體數據,隨著傳感器種類的豐富(手機、無人機、激光雷達等)、精度的增強(比如拍照能力越來越強)、相關互聯網應用的繁榮(如抖音、快手等都是基于富媒體數據的應用),網絡上出現了越來越多的富媒體數據,并且占據了互聯網數據的絕大多數,因此是非常重要的一類數據,也是未來的推薦系統需要重點關注的數據。
按照數據載體來劃分數據的好處是方便對數據進行處理,從中提取構建推薦算法需要的特征。我們在第15章講解特征工程時,就是按照數據的這種劃分方式來講解的。
3. 根據數據組織形式來劃分
按照數據組織形式不同,不同類型的數據處理起來難易程度是不一樣的。人類是比較善于理解和處理二維表格類數據(結構化數據)的,這就是為什么關系型數據庫(主要是處理表格類數據)在計算機發展史上具有舉足輕重地位的原因。隨著互聯網的發展,數據形式越發豐富,不是所有數據都是結構化的,有些數據是半結構化甚至是無結構化的(具體見下面圖3),下面分別對這3類數據加以說明。
圖3:三種數據組織形式
(1)結構化數據
所謂結構化數據就是可以用關系型數據庫中的一張表來存儲的數據,每一列代表一個屬性/特征,每一行就是一個數據樣本。一般用戶畫像數據和物品畫像數據都可以用一張表來存儲,用戶和物品的每一個屬性都是表的一個字段,因此是結構化數據。下表就是商品的結構化表示。
商品 |
品牌 |
價格 |
品類 |
顏色 |
iPhone13 Pro |
蘋果 |
9888元 |
手機 |
遠峰藍、石墨色、銀色、金色 |
尼康 D7500 |
尼康 |
7299元 |
數碼 |
黑色 |
浪琴(Longines)瑞士手表 康卡斯潛水系列 機械鋼帶男表 L37824066 |
浪琴 |
13000元 |
鐘表 |
L37824766、L37824566等 |
表1:商品畫像數據的結構化表示
結構化數據是一類具備Schema的數據,也就是每一列數據的類型、值的長度或者范圍是確定的,一般可以用關系型數據,如MySQL、ProgreSQL、Hive等來存儲,這類數據可以用非常成熟的SQL語言來進行查詢、處理。
(2)半結構數據
半結構化數據雖不具備關系型數據庫這么嚴格的Schema,但數據組織是有一定規律或者規范的,利用特殊的標記或者規則來分隔語義元素或對記錄和字段進行區隔。因此,也被稱為自描述的數據結構。常見的XML、Json、HTML等數據就屬于這一類。
對于用戶在產品上的操作行為,我們一般按照一定的規則來對相關字段進行記錄(比如可以用Json格式來記錄日志,或者按照規定的分割字符來分割不同字段,再拼接起來記錄日志),這類數據也屬于半結構化數據,一些半結構化數據是可以通過一定的預處理轉化為結構化數據的。
半結構化數據對推薦系統是非常關鍵的。推薦系統最終的推薦結果可以采用Json的格式進行存儲或者以Json的形式在互聯網上傳輸最終展示給終端用戶。很多推薦模型也是采用固定的數據格式存儲的,比如ONNX(Open Neural Network EXchange,開放神經網絡交換)格式,是一種用于表示深度學習模型的標準,可使模型在不同框架之間進行遷移。
半結構化的數據一般有比較松散的范式,這類數據也有適合的數據存儲工具,一般會用key-value形式的NoSQL數據庫存儲,比如HBase、Redis、MongoDB、Elastic Search等等。
(3)非結構化數據
非結構化數據,是數據結構不規則或不完整,沒有預定義的數據模型,不方便用數據庫二維邏輯表來存儲的數據,也沒有半結構化數據這種有一定的規律或者規范。非結構化數據包括文本、圖片、各類數據報表、圖像和音視頻數據等等。非結構化數據由于沒有固定的數據范式,也是最難處理的一類數據。
文本、短視頻、音頻、商品等都包含大量的非結構化數據。即使物品本身是非結構化的(比如抖音上的短視頻),我們也可以從幾個已知的維度來定義物品,從而形成對物品結構化的描述,如上面表1中就是針對商品從多個維度來構建結構化數據。
隨著移動互聯網、物聯網的發展,各類傳感器日益豐富,功能多樣,人際交往也更加密切,人們更愿意表達自我,人類的社交和生產活動產生了非常多的非結構化數據,非結構化數據量成幾何級數增長。
怎么很好地處理非結構化數據,將非結構化數據中包含的豐富信息挖掘出來,并應于算法模型中,是具備極大挑戰的,但是如果利用的好,是可以大大提升推薦算法的精準度、轉化率等用戶體驗、商業化指標的。隨著NLP、圖像處理、深度學習等AI技術的發展與成熟,我們現在有更多的工具和方法來處理非結構化數據了。推薦系統也享受到了這一波技術紅利,在這些新技術的加持下,推薦效果越來越好。
非結構化的數據由于沒有固定的范式,一般可以采用對象存儲工具進行存儲,如Apache Ozone(https://ozone.apache.org/)等。目前基本所有的云服務廠商都會提供對象存儲工具,方便客戶存儲非結構化的對象文件。
上面從3個不同的分類角度來介紹了推薦系統的數據源,我們知道了哪些數據是對推薦系統有用的,當我們獲取了這些數據之后我們就需要對它們進行適當的預處理并存儲下來,方面后續的推薦系統建模使用。下面一節我們來簡介介紹一下數據預處理相關的知識點。
二、數據預處理
數據預處理一般稱為ETL(Extract-Transform-Load),用來描述數據從來源到最終存儲之間的一系列處理過程,一般經過抽提、轉換、加載3個階段。數據預處理的目的是將企業中的分散、零亂、標準不統一的數據整合到一起,將非結構化或者半結構化的數據處理為后續業務可以方便處理使用的(結構化)數據,為企業的數據驅動、數據決策、智能服務提供數據支撐。
數據基礎設施完善的企業一般會構建層次化的數據倉庫系統,數據預處理的最終目的也是將雜亂的數據結構化、層次化、有序化,最終存入數據倉庫。對于推薦系統來說,通過ETL將數據處理成具備特殊結構(可能是結構化的)的數據,方便進行特征工程,最終供推薦算法學習和模型訓練使用。下面分別對ETL3個階段的作用進行簡單介紹。
1. 抽提(Extract)
這一階段的主要目的是將企業中分散的數據聚合起來,方便后續進行統一處理,對于推薦系統來說,依賴的數據源多種多樣,因此是非常有必要將所有這些算法依賴的數據聚合起來的。推薦系統的數據源比較多樣,不同的數據抽取的方式不一樣,下面分別簡單介紹。
用戶行為數據一般通過在客戶端埋點,通過HTTP協議上傳到日志收集web服務(如Nginx服務器),中間可能會通過域名分流或者LB負載均衡服務來增加日志收集的容錯性、可拓展性。日志一般通過離線和實時兩條數據流進行處理。離線數據通過預處理(比如安全性校驗等)進入數倉,實時流經Kafka等消息隊列,然后被實時處理程序(如Spark Streaming、Flink等)處理或者進入HBase、ElasticSearch等實時存儲系統供后續的業務使用。用戶行為日志的收集流程見下面圖4。
圖4:用戶行為日志收集流程(右上角進入DW的屬于離線數據,右下角經過Kafka的屬于實時流)
對于用戶畫像數據、物品畫像數據一般是存放在關系型數據庫中的,實時性要求不高的推薦業務可以采用數據表快照(按天從業務系統中將數據庫同步到Hive中)進行抽取,對實時性有要求的信息流推薦可以采用binlog實時同步或者消息隊列的方式抽取。
場景化相關數據一般是描述用戶當前狀態的數據,一般是通過各種傳感器或者埋點收集的,這類數據也生成于客戶端。通過上面圖4右下角的實時日志收集系統進入消息隊列,供后端的實時統計(如時間序列數據庫、ES進行存儲進而查詢展示)或者算法(通過Spark Streaming或者Flink等)進行處理。
2.轉換(Transform)
這個階段是ETL的核心環節,也是最復雜的一環。它的主要目標是將抽取到的各種數據,進行數據的清洗、格式的轉換、缺失值填補、剔除重復等操作,最終得到一份格式統一、高度結構化、數據質量高、兼容性好的數據,提供給推薦算法的特征工程階段進行處理。
清洗過程包括剔除掉臟數據、對數據合法性進行校驗、剔除無效字段、字段格式檢查等過程。格式轉換是根據推薦算法對數據的定義和要求將不同來源的同一類數據轉為相同的格式,使之統一化、規范化的過程。由于日志埋點或者數據收集過程中存在的各種問題,真實業務場景中,字段值缺失是一定存在的,缺失值填補可以根據平均數或者眾數進行填補或者利用算法來學習填充(如樣條差值等)。由于網絡原因日志一般會有重傳策略,導致重復數據,剔除重復就是將重復的數據從中過濾掉,從而提升數據質量,以免影響最終推薦算法的效果(如果一個人有更多的數據,那么在推薦算法訓練過程中,相當于他就有更多的投票權,模型學習會向他的興趣傾斜,導致泛化能力下降)。
3. 加載(Load)
加載的主要目標是把數據存放至最終的存儲系統,比如數據倉庫、關系型數據庫、key-value型NoSQL中等。對于離線的推薦系統,訓練數據放到數倉中,畫像數據存放到關系型數據庫或NoSQL中。
用戶行為數據通過數據預處理一般可以轉化為結構化數據或者半結構化數據,行為數據是最容易獲得的一類數據,也是數據量最大的一類數據,這類數據一般存放在分布式文件系統中,原始數據一般放到HDFS中,通過處理后的行為數據都會統一存放到企業的數據倉庫中,離線數據基于Hive等構建數倉,而實時數據基于HBase等構建數倉,最終形成統一的數據服務,供上層的業務使用。
某些數據,比如通過特征工程轉化為具體特征的數據,這類數據可能需要實時獲取、實時更新、實時服務于業務,一般可以存放在HBase或者Redis等NoSQL中。
用戶畫像、物品畫像數據一般屬于關系型數據,這類數據比較適合存放在關系型數據庫(如MySQL)或者NoSQL中。
對于圖片、音視頻這類比較復雜的非結構化的數據,一般適合存放在對象存儲中。當前比較火的數據湖技術(如Delta Lake、Iceberg、Hudi等)就是希望整合以數倉為主導的傳統結構化數據存儲與以圖像音視頻為主的非結構化數據。在數據湖體系下,推薦系統依賴的所有數據源都可以存儲在數據湖中。
總結
推薦系統是機器學習的一個分支,因此推薦算法依賴數據來構建模型,最終為用戶提供個性化的物品推薦。本章簡單梳理了推薦系統的數據源及數據預處理相關的知識點。
推薦系統數據源可以按照3種形式來分類。按照推薦產品功能要素來劃分,可以分為用戶行為數據、用戶畫像數據、物品畫像數據和場景化數據四類。按照數據載體來劃分,可以分為數值數據、類別數據、文本數據、圖片數據、音視頻數據等5類。按照數據組織形式來劃分,可以分為結構化數據、半結構化數據與非結構化數據。
當我們獲得了各類不同的、可以用于推薦系統模型構建的數據,我們還需要將這些數據收集、轉運、預處理并存儲到數據中心。當所有的數據都準備就緒了,后面我們才可以基于這些數據去構建算法模型。我們會在后續章節具體介紹推薦系統相關的算法模型。