作者丨gongyouliu
編輯丨lily
【導讀】推薦系統是機器學習的一個子領域,並且是一個偏工程化、在工業界有極大商業價值的方向。大量應用於提供toC類產品的網際網路企業服務中,通過推薦系統為用戶提供精準的個性化服務。推薦系統通過推薦算法來為用戶生成個性化推薦結果,而推薦算法依賴數據輸入來構建算法模型。本篇文章我們來講解推薦系統所依賴的數據,怎麼處理這些數據,讓數據轉換成推薦算法可以直接使用的形式,最終我們就可以構建高效、精準的推薦模型,這些處理好的適合機器學習算法使用的數據即是特徵,而從原始數據獲得特徵的過程就是特徵工程。
具體來說,我們會從推薦算法建模的一般流程、推薦系統依賴的數據源介紹、數據處理與特徵工程簡介、常用推薦算法之數據與特徵工程、推薦系統數據與特徵工程未來趨勢等5個部分來介紹相關知識點,期望本文的講解能夠讓讀者更加深入地理解推薦系統依賴的數據源的特點、數據預處理方法以及基於這些數據之上的特徵工程方法與技巧。
一、推薦算法建模的一般流程
在引入推薦系統數據源與特徵工程之前,我們先介紹一下推薦算法建模的一般流程,這樣我們就可以更好地理解數據與特徵工程在整個推薦系統業務流程中的地位和作用。
推薦系統是機器學習的一個子領域,因此推薦系統處理問題的方式遵循機器學習的一般思路。我們可以將機器學習過程看成一個打造生產某種產品的機器的過程,我們根據過往的生產經驗來製造一款生產該產品的機器,過往的生產經驗就是我們的訓練集,構建好的機器就是我們的機器學習模型。我們將原材料加工好,按照某種方式灌入這個機器,這個機器的最終輸出就是我們需要的預測結果,構建的機器是否完善、能否生產出誤差在可接受範圍內的商品,代表了我們模型的精準度。
根據上面的簡單類比,推薦算法為用戶進行個性化推薦的一般流程如下面圖1。我們通過收集不同來源的數據匯聚成推薦算法需要的原始數據,通過特徵工程對原始數據處理生成最終特徵,再通過選擇合適的推薦算法對特徵進行訓練獲得最終的推薦模型,在預測/推斷階段,我們根據某個用戶的特徵,將特徵灌入模型獲得該用戶的推薦結果。
圖1:推薦算法建模的一般流程
從上圖可以看出,數據和特徵工程在整個推薦系統業務流的起點,因此是非常重要的。數據是原材料,原材料(推薦數據源)是否齊備、質量是否優良直接決定是否可以生產出好的產品,而對原材料的處理加工(特徵工程)決定了我們是否可以高效、快速、高質量地生產出好的產品。
下面我們會對推薦系統的數據及特徵工程這兩個部分詳細講解,模型構建及預測不在我們本文的討論範圍。
二、推薦系統依賴的數據源介紹
推薦系統根據用戶在產品(APP、網站等)上的操作行為,猜測用戶的興趣偏好,最終給用戶做個性化推薦。在整個推薦過程中,涉及到可能產生數據的地方有用戶自身、標的物、用戶的操作行為、用戶所在的場景(上下文)等4個部分。因此推薦算法根據這4個觸點,依賴4類數據。根據承載數據的載體,又可以分為數值類數據、文本類數據、圖片類數據、音視頻數據等4類。根據推薦系統依賴的數據的組織形式(數據格式),又可以分為結構化數據、半結構化數據、非結構化數據3大類。下面我們分別按照這三種分類方式來詳細描述推薦系統所依賴的數據及這些數據的特點。
1 根據數據來源來劃分
根據數據來源的觸點來分,推薦系統依賴的數據分為用戶行為數據、用戶屬性數據、標的物(物品)屬性數據、上下文數據4大類,見下面圖2,下面我們分別介紹各類數據及其特點。
圖2:推薦系統依賴的4類數據源
1.1(用戶)行為數據
就是用戶在產品上的各種操作,比如瀏覽、點擊、播放、購買、搜索、收藏、點讚、轉發、加購物車、甚至滑動、在某個位置的停留時長、快進等等一切操作行為。用戶在產品上的操作行為為我們了解用戶提供了「蛛絲馬跡」,用戶的操作行為也是用戶最真實意圖的反饋,這些行為反應了用戶的興趣狀態,通過分析用戶行為,我們可以獲得對用戶的興趣偏好的深刻洞察。
根據用戶的行為是否直接表明用戶對標的物的興趣偏好,用戶行為一般分為顯式行為和隱式行為。顯式行為是直接表明用戶興趣的行為,比如點讚、評分等。隱式行為雖不是直接表示用戶的興趣,但是該行為可以間接反饋用戶的興趣變化,只要不是用戶直接評分、點讚的操作行為都算隱式反饋,包括瀏覽、點擊、播放、收藏、評論、轉發等等。
用戶行為數據是最重要、最容易收集、數據量最多的一類數據,在構建推薦系統算法中起著舉住輕重的作用。這類數據往往種類繁多,需要我們進行收集、預處理才能最終被推薦算法使用。
1.2 用戶屬性數據
用戶屬性數據也叫做用戶人口統計學數據,就是用戶自身所帶的屬性,比如年齡、性別、地域、學歷、家庭組成、職業等等。這些數據一般是穩定不變(如性別)或者緩慢變化(如年齡)的。
人類是一個社會化物種,用戶的不同屬性決定了用戶處在不同的階層或者生活圈,不同的階層或生活圈又有不同的行為特徵、生活方式、偏好特點,在同一圈層具備一定的相似性,這種相似性為我們做個性化推薦提供了一定的保證。
1.3 標的物屬性數據
推薦系統中最重要的一個「參與方」是待推薦的標的物(物品),物品自身是包含很多特徵和屬性的。對於視頻來說,出品方、導演、演職員、主演、國別、年代、語言、是否獲獎、劇情、海報圖等等都是視頻的元數據。對於電商商品來說,品類、用途、價格、產地、品牌等等也是非常重要的屬性。
通過用戶對物品的操作行為,我們可以將物品所具備的特徵按照某種權重賦予用戶,這些特徵就構建了用戶的興趣偏好,相當於給用戶打上了相關的標籤(比如喜歡看「恐怖片」的人)。從這些興趣偏好出發,我們又可以給用戶進行個性化推薦。
1.4 上下文數據
上下文數據是用戶在對物品進行操作時所處的環境特徵及狀態的總稱,比如用戶所在地理位置、當時的時間、當時的天氣、用戶當時的心情、用戶所在產品的路徑等等。這些上下文數據對用戶的決策是非常重要的、甚至是起決定作用的。比如,美團餓了麼這類基於地理位置服務的產品,給用戶推薦餐廳是一定要是在用戶所在位置或者用戶指定位置附近的。
合適地使用上下文數據,將該類數據整合到推薦算法中,可以更加精準、場景化地為用戶進行個性化推薦。
2 根據數據載體來劃分
隨著網際網路的發展,網絡上傳輸、交換、展示的數據種類越來越多樣化,從最初的數字、文本到圖片再到現在主流的音視頻,基於這些數據載體的不同,推薦系統建模依賴的數據也可以分為4類,見下面圖3。
圖3:推薦系統依賴的4種數據載體
2.1 數值類數據
所有推薦系統用到的、可以用數值來表示的數據都屬於這一類,比如用戶年齡、用戶評分、物品價格、播放次數等等。數值數據也是計算機最容易處理的一類數據,其他類型的數據要想很好地被計算機處理,一般也會利用各種方法轉化為數值數據。
2.2 文本數據
文本數據是網際網路中數量最多的、最普遍的一類數據,標的物的類別、標的物的描述信息、甚至整個標的物可能都是文本(如新聞等)、用戶地域、用戶性別等等都是用文本來描述的。如果某個特徵可以取的所有值是有限的(比如性別只有男女兩種),也可以非常容易地轉化為數值類數據。處理文本類數據需要藉助自然語言處理相關技術。
2.3 圖片數據
隨著智慧型手機攝像頭技術的成熟以及相關圖像應用的爆發增長,媒體及投資人的推波助瀾,圖片數據是網際網路上的主流數據類型,商品的海報圖、電影的縮略圖等等都以圖片的形式存在。
對於圖片類數據的處理,目前的深度學習技術相對成熟,包括圖片的分類、圖片的特徵提取等等,精度已經到達了產品可用的成熟度,在某些方面(如圖片分類)甚至超越了人類專家的水平。
2.4 音視頻數據
在網際網路視頻出現以來就有了音視頻數據,直到現在音視頻數據才應用到更多的領域和產品中,音視頻數據火爆背景跟圖片類似,目前的抖音、快手等短視頻應用非常受歡迎,遊戲直播、電商導購直播等應用也是視頻類數據的產出方。音樂的數位化,各類音頻學習軟體(如樊登讀書、蜻蜓FM等)也促進了音頻數據的增長。
音視頻數據的價值密度小,佔用空間多,處理相對複雜,在深度學習時代,這些複雜數據的處理也變得可行了。音頻數據可以通過語音識別轉換為文字,最終歸結為文本數據的處理,視頻數據可以通過抽幀轉換為圖片數據來處理。
圖片、音視頻數據屬於富媒體數據,隨著傳感器種類的豐富、精度的增強(比如拍照能力越來越強)、相關網絡應用的繁榮(如抖音、快手等都是基於富媒體數據的應用),網絡上出現了越來越多的富媒體數據,並且佔據了網際網路數據整體的絕大多數,因此是非常重要的一類數據。
3 根據數據組織形式來劃分
按照數據組織形式不同,不同類型的數據處理起來難易程度是不一樣的,人類是比較善於理解和處理二維表格類數據的,這就是為什麼關係型資料庫(主要是處理表格類數據)在計算機發展史上具有舉足輕重地位的原因。隨著網際網路的發展,數據形式越發豐富,不是所有數據都是結構化的,有些數據是半結構化甚至是無結構化的(具體見下面圖4),下面分別對這三類數據加以說明。
圖4:推薦系統依賴的三種數據組織形式
3.1 結構化數據
所謂結構化數據就是可以用關係型資料庫中的一張表來存儲的數據,每一列代表一個屬性/特徵,每一行就是一個數據樣本。一般用戶屬性數據和物品屬性數據都可以用一張表來存儲,用戶和物品的每一個屬性都是表的一個欄位,因此是結構化數據。下表就是視頻的結構化表示。
表1:視頻屬性數據的結構化表示
結構化數據是一類具備Schema的數據,也就是每一列數據的類型、值的長度或者範圍是確定的,一般可以用關係型數據,如MySQL、ProgreSQL等來存儲,這類數據可以用非常成熟的SQL語言來進行查詢處理。
3.2 半結構化數據
半結構化數據雖不符合關係型資料庫這麼嚴格的結構,但數據組織是有一定規律或者規範的,利用特殊的標記或者規則來分隔語義元素以及對記錄和欄位進行分層。因此,也被稱為自描述的結構。常見的XML或者Json類數據就屬於這一種。
對於用戶在產品上的操作行為,我們一般按照一定的規則來對相關欄位進行記錄(比如可以用Json格式來記錄日誌,或者按照規定的分割字符來分割不同欄位,再拼接起來記錄日誌),這類數據也屬於半結構化數據,一些半結構化數據通過一定的預處理是可以轉化為結構化數據的。
3.3 非結構化數據
非結構化數據,是數據結構不規則或不完整,沒有預定義的數據模型,不方便用資料庫二維邏輯表來表示的數據,也沒有半結構化數據這種有一定的規律或者規範。包括文本、圖片、HTML、各類數據報表、圖像和音視頻信息等等。非結構化數據由於沒有固定的數據範式,也是最難處理的一類數據。
文本類標的物(如新聞資訊)、短視頻、音頻、商品等都包含大量的非結構化數據。即使是非結構化的標的物,我們可以從幾個已知的屬性來構建對標的物的描述,從而形成對標的物結構化的描述,如上面表1中就是針對視頻從多個維度來構建結構化數據。
隨著移動網際網路、物聯網的發展,各類傳感器日益豐富,功能多樣,人際交往也更加密切,人們更願意表達自我,人類的社交和生產活動產生了非常多的非結構化數據,非結構化數據量成幾何級數增長。怎麼很好地處理非結構化數據,將非結構化數據中包含的豐富信息挖掘出來,並應於算法模型中,是可以大大提升推薦算法的精準度、轉化率等用戶體驗、商業化指標的。隨著NLP、深度學習等AI技術的發展與成熟,我們現在有更多的工具和方法來處理非結構化數據了,推薦系統也享受了這一波技術紅利,在這些新技術的加持下,效果越來越好。
上面從3個不同的分類角度來介紹了推薦系統的數據源,那麼我們怎麼利用這些數據源,將這些數據處理為推薦算法可以使用的原材料呢?這就需要數據處理與特徵工程相關知識,我們在下一節進行詳細介紹。
三、數據處理與特徵工程簡介
在本節我們來詳細介紹推薦系統依賴的數據是怎麼產生的、我們怎麼轉運、怎麼存儲這些數據,最終通過ETL和特徵工程加工成推薦算法可以直接使用的數據,我們分數據生成、數據預處理、特徵工程三個部分來介紹。
1 數據生成
下面我們根據行為數據、用戶屬性數據、標的物屬性數據、上下文數據4類數據來分別說明數據生成過程。
1.1 行為數據
對於用戶行為數據,我們事先定義收集的日誌格式,當用戶在產品上進行各種操作時,客戶端(APP或者網頁)按照日誌規範記錄用戶行為(俗稱日誌埋點),並將用戶行為上報到雲端數據中心,這即獲得了用戶行為數據。
用戶在什麼時間點、進行什麼操作需要進行日誌埋點取決於具體的業務場景、交互形式以及具體的數據分析需求。一般來說,用戶觸點多的路徑、對用戶體驗有比較大影響的功能點、涉及到商業價值的功能點是需要進行日誌埋點的,因為這些數據對產品的迭代與發展非常關鍵,是非常有價值的數據。上傳更多的數據需要定義更多的日誌規範並進行埋點,還需要進行收集、處理、存儲,因此會佔用更多的人力、算力、存儲資源,但是可以讓我們從更多的維度進行分析,所以是有一定價值的,《大數據時代》的作者維克託邁爾-舍恩伯格博士認為數據收集越多越好,我們在實際工作中也是按照這個思路進行收集的,儘量收集用戶的所有行為,但是發現很多日誌事後是沒有時間、精力去分析的,甚至沒有業務方有這方面的分析需求,因此,個人建議儘量收集前面提到的核心數據,其他數據在真的確定需要的時候再去埋點分析。
行為數據的上傳、收集需要考慮很多現實中的特殊問題,需要保證數據上傳的有效性、正確性、不重複性,對於在網絡不穩定或者出現軟體故障時,需要進行數據重試與補傳。同時數據上傳需要有很多策略,比如按照固定條數上傳、固定一段時間上傳、每產生一條數據就立即上傳等,也需要對數據進行加密,避免網絡惡意攻擊或者髒數據的引入。
1.2 用戶屬性數據
一般用戶地域是可以藉助用戶的IP位址輕易獲取得到的,而其他用戶屬性是很難收集到的,特別是現在數據安全性越來越受到法律的保護,個人風險意識也逐漸增強,收集用戶信息是更加困難的事情。安全有效地收集用戶屬性數據一般可以有如下方法:
a 產品在用戶剛註冊時,提供用戶輸入相關信息的界面,讓用戶主動輸入相關信息,但是一般用戶是比較懶的,所以輸入的信息一定是比例非常少的,過多增加這種讓用戶操作的步驟,在增加用戶使用成本的同時,也增加了用戶放棄你的產品的概率;
b 通過各種運營活動,讓用戶填寫相關信息參與活動,從而獲得相關信息;
c 通過用戶在產品上的行為或者聊天記錄,根據機器學習算法來推斷用戶的熟
悉,比如根據用戶購買行為推斷用戶的性別、年齡等;
d 有些具備金融牌照、遊戲牌照的產品,可以要求用戶填寫身份證等敏感信息,從而獲得用戶更多的信息;
e 某些公司有多個產品(比如阿里的支付寶、淘寶、餓了麼等),可以通過產品之間的打通,獲得用戶更多的屬性信息;
f 通過合規的第三方數據交換來獲得自己產品缺失而第三方具備的屬性信息;
用戶屬性信息對構建優秀的推薦系統是非常重要的一類信息,這類信息企業需要保管好,避免洩露出去造成重大事故。
1.3 標的物屬性數據
物品屬性數據的獲取相比用戶屬性數據容易一些,物品的生產方/提供方一般是具備一定的物品屬性數據的,比如視頻在製作時包含基本屬性數據,視頻版權被視頻網站購入時,自然就附帶了這些屬性,淘寶上的賣主在上架商品時也會按照淘寶制定的類目等屬性要求填充相關數據。還有一些標的物,如新聞資訊,是從第三方利用爬蟲技術爬過來的,在爬的過程中也可以將屬性數據爬過來,一併注入到自己的媒資庫中。
對於標的物數量不大、單位時間產出不多的標的物(如電影),還可以利用編輯團隊或者外包人工填充相關數據。對於數量較大、單位時間產量多的標的物(如新聞),可以藉助NLP等機器學習技術生成相關屬性數據。
1.4 上下文數據
上下文數據一般是動態變化的,是用戶在某個場景下的特定時間點、特定位置所產生的數據,所以一般是實時獲得的,也一般應用於實時推薦系統中。
2 數據預處理
數據預處理一般稱為ETL(Extract-Transform-Load),用來描述數據從生產源到最終存儲之間的一系列處理過程,一般經過抽提、轉換、加載3個階段。 目的是將企業中的分散、零亂、標準不統一的數據整合到一起,將非結構化或者半結構化的數據處理為後續業務可以方便處理使用的結構化數據,為企業的數據驅動、數據決策提供數據基礎。數據基礎設施完善的企業一般會構建層次化的數據倉庫系統,數據預處理的最終目的也是將雜亂的數據結構化、層次化、有序化,最終進入數據倉庫。對於推薦系統來說,通數ETL將數據處理成具備特殊結構(可能是結構化的)的數據,方便進行特徵工程,最終供推薦算法學習和訓練之用。下面分別對ETL三個階段的作用進行簡單介紹。
2.1 抽提(Extract)
這一階段的主要目的是將企業中分散的數據聚合起來,方便後續進行統一處理,對於推薦系統來說,依賴的數據源多種多樣,因此是非常有必要將所有這些算法依賴的數據聚合起來的。推薦系統的數據源比較多樣,不同的數據抽取的方式不一樣,下面分別簡單介紹。
用戶行為數據一般通過在客戶端埋點,通過http協議上傳到日誌收集web服務(如Nginx伺服器),中間可能會通過域名分流或者LB負載均衡服務來增加日誌收集的容錯性、可拓展性。日誌一般通過離線和實時兩條流進行處理,離線通過ETL進入數倉,實時流通過Kafka等消息隊列被實時處理程序(如Spark Streaming)處理或者進入HBase、ElasticSearch等實時存儲供後面的業務查詢。整個用戶行為日誌的收集過程見下面圖5。
圖5:用戶行為日誌收集流程(右上角進入DW的屬於離線數據,右下角經過Kafka的屬於實時流)
對於用戶屬性數據、物品屬性數據一般是存放在關係型資料庫中的,實時性要求不高的推薦業務可以採用數據表快照進行抽取,對實時性有要求的信息流推薦可以採用binlog實時同步或者消息隊列的方式抽取。
上下文相關數據一般是描述用戶當前狀態的數據,一般是通過各種傳感器收集的,這類數據也生成於客戶端。通過上面圖5右下角的實時日誌收集系統進入消息隊列,供後端的實時統計(如時間序列資料庫、ES進行存儲進而查詢展示)或者算法(通過Spark Streaming或者Flink)進行處理。
2.2 轉換(Transform)
這個階段是ETL的核心環節,也是最複雜的一環。它的主要目標是將抽取到的各種數據,進行數據的清洗、格式的轉換、缺失值填補、剔除重複等操作,最終得到一份格式統一、高度結構化、數據質量高、兼容性好的數據,供推薦算法的特徵工程處理。
清洗過程包括剔除掉髒數據、對數據合法性進行校驗、剔除無效欄位、欄位格式檢查等過程。格式轉換是根據推薦算法對數據的定義和要求將不同來源的同一類數據轉為相同的格式,使之統一規範化的過程。由於日誌打點存在的問題或者數據收集過程中存在的各種問題(比如用戶一般不會填寫完整的數據),真實業務場景中,欄位值缺失是一定存在的,缺失值填補可以根據平均數或者眾數進行填補或者利用算法來學習填充。由於網絡原因日誌一般會有重傳策略,導致重複數據,剔除重複就是將重複的數據從中剔除,從而提升數據質量,以免影響最終推薦算法的效果(如果一個人有更多的數據,那麼在推薦算法訓練過程中,相當於他就有更多的投票權,模型學習會向他的興趣傾斜,導致泛化能力下降)。
數據轉換的過程算是廣義的特徵工程中的一部分,這裡介紹的處理過程可能部分會跟下面特徵工程部分的介紹有一定重複,我們在特徵工程章節會更加細緻介紹。
2.3 加載(Load)
這部分的主要目標是把數據加載至最終的存儲,比如數據倉庫、關係型資料庫、key-value型NoSQL中等。對於離線的推薦系統,訓練數據放到數倉中,屬性數據存放到關係型資料庫中。
用戶行為數據通過數據預處理一般可以轉化為結構化數據或者半結構化數據,行為數據是最容易獲得的一類數據,也是數據量最大的一類數據,這類數據一般存放在分布式文件系統中,原始數據一般放到HDFS中,通過處理後的數據一般會根據業務需要構建層次化的數據模型。
所有行為數據都會統一存放到企業的數據倉庫中,離線數據基於Hive等構建數倉,而實時數據基於HBase等構建數倉,最終形成統一的數據服務,供上層的業務方使用。
某些數據,比如通過特徵工程轉化為具體特徵的數據,這類數據可能需要實時獲取、實時更新,一般可以存放在HBase或者Redis等NoSQL中。
用戶屬性數據一般屬於關係型數據,這類數據比較適合存放在關係型資料庫(如MySQL)中。物品屬性數據一般屬於關係型數據,也存放在關係型資料庫中。對於圖片、音視頻這類比較複雜的數據,一般適合存放在對象存儲中。
關於數據預處理相關知識點可以參考《大數據分析工程師入門14-數據分析架構 》和《大數據分析工程師入門16-ETL工程》這兩篇篇文章,進行更深入的學習和了解,本文不做過多講解。
3 特徵工程
特徵(Feature)是建立在原始數據之上的特定表示,它是一個單獨的可度量屬性,通常用結構化數據集中的一列表示。對於一個通用的二維數據集,每個觀測值由一行表示,每個特徵由一列表示,對於每一個觀測具有一個特定的值。下面圖6就是用戶基本屬性表,其中每一列就是一個特徵,其中年齡、身高、體重是數值的,是數值特徵,數值特徵也叫做連續特徵,而性別是用文本描述的,並且只有男女兩種取值,是離散特徵。
圖6:用戶屬性特徵
通過上面的簡單介紹,我們知道了什麼是特徵,知道有連續特徵和離散特徵,那麼特徵具體怎麼分類呢?一般從特徵的取值類型可以分為5類:
(1) 離散特徵
離散特徵一般分為類別特徵和有序特徵,類別之間是無序關係的, 比如性別,有序特徵之間是有序關係的,比如收入的低、中、高三個等級,之間是有序的。
(2) 連續(數值)特徵
能夠用實數或者整數等數值度量的特徵就是連續特徵,比如身高、通過算法獲得的嵌入特徵等都屬於連續特徵。
(3) 時空特徵
在某些模型中時間是非常重要的特徵,時間一般是相對的,具有周期性。對基於地理位置的服務,位置是非常重要的特徵,位置也可能跟用戶的行為有關(如東北地區的喜歡看二人轉),地理位置可以用行政區劃的層級關係表示,也可以用相對距離來表示。
(4) 文本特徵
文本是非常重要的一類數據,我們可以從文本中抽提特徵,比如利用TF-IDF等獲得的特徵,文本特徵一般可以通過轉化為向量來表示。
(5) 富媒體特徵
包括從圖片、視頻、音頻、HTML、甚至程序語言等富媒體中抽提的特徵,這些特徵也一般用數值向量來表示。
從特徵的可解釋性來分類,可以分為顯式特徵和隱式特徵:
(1) 顯示特徵
顯示特徵是具有實際意義的特徵,人們可以理解,可以用語言來說明和解釋。類別、數值、時空、TF-IDF、LDA等特徵都屬於這一類。
(2) 隱式特徵
隱式特徵是不具備實際意義,難於在現實中找到對應的特徵,一般通過算法生成的嵌入特徵都屬於這一類,如word2vec、矩陣分解等模型生成的嵌入特徵。
講完了什麼是特徵,特徵的兩種分類方法及對應不同特徵的介紹,那麼大家肯定會關心特徵是怎麼生成的,有什麼方法和技巧,這就是特徵工程要解決的問題。
特徵工程(Feature Engineering)是將原始數據轉化為特徵的過程,這些特徵可以很好地測量或者描述輸入輸出之間的內在關係,通過這些特徵來構建數學模型,從而提高模型對未知數據預測的準確性。特徵工程在整個算法模型生命周期中所處的階段見下面圖7。
圖7:特徵工程在算法建模中所處的階段
特徵工程在整個機器學習流程中是非常重要的一環,有很多枯燥、繁雜的工作需要處理,看起來不那麼高大上,並且很多特徵工程的技巧是需要經驗積累的,也是領域相關的(不同領域有自己的一套做特徵工程的獨特的方法和思路)。特徵工程的質量往往直接決定了機器學習的最終效果,在機器學習圈有一句很出名的話很好地說出了特徵工程的價值,這句話大致意思是「特徵工程的好壞決定了機器學習能力的上限,而算法和模型只是無限逼近這個上限」。
特徵工程是一個比較花費人力的工作,雖然跟問題和領域相關,但是有一般的方法思路可供參考,下面簡單介紹一下特徵工程的一般流程和步驟,以及相關的方法與技巧。
3.1 特徵預處理
在真實業務場景中,數據一般會存在各種各樣的問題,不是直接可以用於構建特徵,在構建特徵之前需要對數據進行適當的處理,下面講解一些常見的數據問題及預處理方法:
a 缺失值處理
實際上我們收集到的很多數據是存在缺失值的,比如某個視頻缺少總時長,對於用戶屬性數據來說,很多用戶可能也不會填寫完備的信息。一般缺失值可以用均值、中位數、眾數等填充,或者直接將缺失值當做一個特定的值來對待。還可以利用一些複雜的插值方法,如樣條插值等來填充缺失值。
b 歸一化
不同特徵之間由於量綱不一樣,數值可能相差很大,直接將這些差別極大的特徵灌入模型,會導致數值小的特徵根本不起作用,一般我們要對數值特徵進行歸一化處理,常用的歸一化方法有min-max歸一化、分位數歸一化、正態分布歸一化、行歸一化等。下面分別簡單介紹。
min-max歸一化是通過求得該特徵樣本的最大值和最小值,採用如下公式來進行歸一化,歸一化後所有值分布在0-1之間。
分位數歸一化,是將該特徵所有的值從小到大排序,假設一共有N個樣本,某個值x排在第k位,那麼我們用下式來表示x的新值。
正態分布歸一化,是通過求出該特徵所有樣本值的均值
和標準差
,再採用下式來進行歸一化。
行歸一化,就是採用某種範數(比如L2範數),讓整行的範數為1,假設該列特徵所在的列向量為
,那麼基於L2範數的行歸一化的公式如下:
c 異常值與數值截斷
對於數值型特徵,可能會存在異常值,包括異常大和異常小的值。在統計數據處理中有所謂3σ準則,即對於服從正態分布的隨機變量,該變量的數值分布在(μ-3σ,μ+3σ)中的概率為0.9974,這時可以將超出該範圍的值看成異常值,採用向上截斷(用μ-3σ)和向下截斷(用μ+3σ)的方法來為異常值賦予新的值。對於真實業務場景,可能還要根據特徵變量的實際意義來進行處理,在我們做視頻推薦過程中,經常會發現日誌中視頻的總時長是一個非常非常大的值(可能是在日誌埋點時將時間戳混雜到時長中了),我們一般會用戶180分鐘來截斷電影的總時長,用45分鐘來截斷電視劇單集的總時長。
如果異常值所佔樣本比例非常小,也可以直接將包含異常值的樣本剔除掉,但是有很多真實業務場景利用非常多的特徵,雖然每個特徵異常值很少,但是如果特徵總數很多的話,包含異常值的樣本(只要包含某一個異常值的都算異常樣本)總數可能是非常大的,所以直接丟棄的方法有時是不合適的。
d 非線性變換
有時某個屬性不同值之間差別較大(比如年收入),有時為了讓模型具備更多的非線性能力(特別是對於線性模型),這兩種情況下都需要對特徵進行非線性變換,比如值取對數(值都是正的情況下)作為最終的特徵,也可以採用多項式、高斯變換、logistic變換等轉化為非線性特徵。上面提到的分位數歸一化、正態分布歸一化其實都是非線性變換。
3.2 特徵構建
所謂特徵構建是從原始數據中提取特徵,將原始數據空間映射到新的特徵向量空間,使得在新的特徵空間中,模型能夠更好地學習數據中的規律。下面我們分別對前面提到的離散(類別)特徵、連續(數值)特徵、時空特徵、文本特徵、富媒體特徵等5類非常重要的特徵來介紹怎麼從原始數據構建相關的特徵。隨著Word2Vec及深度學習技術在推薦系統中的大規模應用,嵌入方法越來越受到歡迎,我們也會單獨講一下嵌入特徵,文本、富媒體一般可以轉化為嵌入特徵。
a 離散特徵
離散特徵是非常常見的一類特徵,用戶屬性數據、標的物屬性數據中就包含大量的類別特徵,如性別、學歷、視頻的類型、標籤、導演、國別等等。對於離散特徵,一般可以採用如下幾種方式對特徵進行編碼。
1) one-hot編碼
one-hot編碼通常用於類別特徵,如果某個類別特徵有k類,我們將這k類固定一個序關係(隨便什麼序關係都無所謂,只是方便確認某個類在哪個位置),我們可以將每個值映射為一個k維向量,其中這個值所在的分量為1,其他分量為0。該方法當類別的數量很多時,特徵空間會變得非常大。在這種情況下,一般可以用 PCA 等方法進行降維。
對於標籤這種類別特徵,可能每個視頻有多個標籤,這時one-hot編碼可以拓展為n-hot編碼,就是該視頻在它包含的所有標籤對應的分量為1,其他為0。
2) 散列編碼
對於有些取值特別多的類別特徵(比如視頻標籤,可以有幾萬個),使用one-hot編碼得到的特徵矩陣非常稀疏,如果再進行特徵交叉,會使得特徵維度爆炸式增長。特徵散列的目標就是是把原始的高維特徵向量壓縮成較低維特徵向量,且儘量不損失原始特徵的表達能力,其優勢在於實現簡單,所需額外計算量小。降低特徵維度,也能加速算法訓練與預測,降低內存消耗,但代價是通過哈希轉換後學習到的模型變得很難檢驗(因為一般哈希函數是不可逆的),我們很難對訓練出的模型參數做出合理解釋。特徵散列的另一個問題是可能把多個原始特徵哈希到相同的位置上,出現哈希衝突現象,但經驗表明這種衝突對算法的精度影響很小,通過選擇合適的hash函數也可以減少衝突概率。
3) 計數編碼
就是將所有樣本中該類別出現的次數或者頻次作為該值的編碼,這類方法對異常值比較敏感(拿電影的標籤來說,很多電影包含「劇情」這個標籤,計數編碼會讓劇情的編碼值非常大),也容易產生衝突(兩個不同類別的編碼一樣,特別是對於出現很稀少的標籤,編碼值一樣的概率非常大)。
4) 離散特徵之間交叉
就是類別特徵之間通過笛卡爾積(或者笛卡爾積的一個子集)生成新的特徵,通過特徵交叉有時可以捕捉細緻的信息,對模型預測起到很重要的作用。這裡舉個例子,比如用用戶地域與視頻語言做交叉,大家肯定知道廣東人一般更喜歡看粵語劇,那麼這個交叉特徵對預測粵語視頻的點擊是非常有幫助的。類別交叉一般需要對業務有較好的理解,需要足夠多的領域知識,才可以構建好的交叉特徵。
上面講的是2個類別特徵的交叉,當然還可以做3個、4個、甚至更多類別特徵的交叉,兩個類別交叉最多可以產生這兩個類別基數的乘積這麼多的新特徵,所以交叉讓模型的維數爆炸性增長,增加了模型訓練的難度。同時,更多的特徵需要更多的樣本來支撐,否則極容易過擬合。對於樣本量不夠多的場景,不建議採用超出2個類別的交叉,也不建議用2個基數特別大的類別進行特徵交叉。
5) 離散特徵與連續特徵交叉
跟上面4)中講的類似,我們也可以進行類別特徵與數值特徵之間的交叉,只不過這種交叉一般是統計某個類別具體值對應的數值特徵的統計量(次數、和、均值、最值、方差等等)。拿電影的語言和用戶的年齡兩個特徵交叉來說,我們可以分別統計看過語言是中文、英語等的電影中用戶的平均年齡,根據大家的經驗,我們知道年輕人受教育程度高,英語會更好,所以看過英語電影的人的平均年齡比看中文的平均年齡低。這類特徵的交叉也需要基於具體業務場景及領域知識來做,否則獲得的交叉特徵可能無效,甚至給模型引入噪音。
對於有序離散特徵,我們可以用0、1、2、... 等自然數來為他們編碼,自然數的大小關係保證了它們之間的序關係。
b 連續(數值)特徵
連續型數據是機器學習算法直接可以使用的數據,對於連續型數據,我們一般可以通過如下幾種方式來構建特徵:
1) 直接使用
機器學習算法是可以直接處理數值特徵的,數值特徵可能經過上面一節講的特徵預處理中的部分步驟再灌給模型使用。
2) 離散化
有時連續特徵需要進行離散化處理,比如視頻在一段時間內的播放量對於視頻點擊CTR預估可能是一個重要的特徵,因為播放次數跟視頻的熱度有很強的相關性,但是如果不同視頻的播放次數的數量級相差巨大(實際情況確實是這樣,熱門視頻比冷門視頻播放量大若干個數量級),該特徵就很難起作用(比如 LR 模型,模型往往只對比較大的特徵值敏感)。對於這種情況,通常的解決方法是進行分桶。分桶操作可以看作是對數值變量的離散化,之後再進行 one-hot 編碼。
分桶的數量和寬度可以根據業務知識和經驗來確定,一般有三種分桶方式:(1)等距分桶,每個桶的長度是固定的,這種方式適用於樣本分布比較均勻的情況;(2)等頻分桶,即每個桶裡樣本量一樣多,但也會出現特徵值差異非常大的樣本被放在一個桶中的情況;(3)模型分桶,使用模型找到最佳分桶,例如利用聚類的方式將特徵分成多個類別,或者利用樹模型,這種非線性模型天生具有對連續型特徵切分的能力,利用特徵分割點進行離散化。
分桶是離散化的常用方法,連續特徵離散化是有一定價值的:離散化之後得到的稀疏向量,運算速度更快,計算結果易於存儲。離散化之後的特徵對於異常值也具有更強的魯棒性。需要注意的是:1)每個桶內都有足夠多的樣本,否則不具有統計意義;2)每個桶內的樣本儘量分布均勻。
3) 特徵交叉
對於連續特徵x、y,通過非線性函數f的作用,我們將z=f(x,y)作為交叉特徵,一般f可以是多項式函數,最常用的交叉函數是f=xy,即兩個特徵對應的值直接相乘。通過特徵交叉可以為模塊提供更多的非線性,可以更細緻地擬合輸入輸出之間的複雜關係,但非線性交叉讓模型計算處理變得更加困難。
c 時空特徵
時間和地理位置也是兩類非常重要的特徵,下面分別來說明怎麼將它們轉化為模型特徵。
對於時間來說,一般有如下幾種轉換為特徵的方式:
1) 轉化為數值
比如將時間轉化為從某個基準時間開始到該時間經歷的秒數、天數、月數、年數等。用更大的單位相當於對小單位四捨五入(比如用到當前時間經歷的年數,那麼不足一年的時間都忽略了)。
2) 將時間離散化
比如我們可以根據當前時間是不是節假日,將時間離散化為0-1二值(1是假日,0是工作日)。再比如如果我們構建的模型是與周期性相關的,我們可能只需要取時間中的周幾這個量,那麼時間就可以離散化為0-6七個數字(0代表星期天,1代表星期一,如此類推)。
對於地理位置來說,我們有行政區劃表示,還有經緯度表示,以及到某個固定點的距離等表示方式,下面分別說明。
1) 行政區劃表示
典型的是用戶所在地區,因為地區是固定的,數量也是有限的,這時地理位置就轉化為離散特徵了。
2) 經緯度表示
地理位置也可以用經緯度表示,這時每個位置就轉化為一個2維向量了(一個分量是經度,另一個分量是緯度)。
3) 距離表示
對於像美團、滴滴這類基於LBS服務的產品,一般用商家或者司機到用戶的距離來表示位置,這時地理位置就轉化為一個一維的數值了。
d 文本特徵
對於文本一般可以用NLP相關技術進行相關處理轉化為數值特徵。對於新聞資訊等文檔,可以採用TF-IDF、LDA等將每篇文檔轉化為一個高維的向量表示。或者基於Word2Vec等相關技術將整篇文檔嵌入(doc2vec)到一個低維的稠密向量空間。
e 富媒體特徵
對於圖片、音頻、視頻等富媒體,一般也可以基於相關領域的技術獲得對應的向量表示,這種向量表示就可以作為富媒體的特徵了。這裡不細介紹,感興趣的讀者可以自行搜素學習。
f 嵌入特徵
上面文本、富媒體中提到的嵌入技術是非常重要的一類提取特徵的技術,所謂嵌入,就是將高維空間的向量投影到低維空間,降低數據的稀疏性,減少維數災難,同時提升數據表達的魯棒性。隨著Word2Vec及深度學習技術的流行,嵌入特徵越來越重要。
標的物嵌入分為基於內容的嵌入和基於行為的嵌入。前者使用標的物屬性信息(如視頻的標題、標籤、演職員、海報圖,視頻、音頻等信息),通過 NLP、CV、深度學習等技術生成嵌入向量,後者是基於用戶與標的物的交互行為數據生成嵌入,拿視頻來舉例,用戶在一段時間中前後點擊的視頻存在一定的相似性,通常會表現出對某類型視頻的興趣偏好,可能是同一個風格類別,或者是相似的話題等,因此我們將一段時間內用戶點擊的視頻 id 序列作為訓練數據(id可以類比word,這個序列類比為一篇文檔),使用 skip-gram 模型學習視頻的嵌入特徵。由於用戶點擊行為具有相關關係,因此得到的嵌入特徵有很好的聚類效果,使得在特徵空間中,同類目的視頻聚集在一起,相似類目的視頻在空間中距離相近。在電視貓的相似視頻推薦中,我們就是採用這種嵌入,並且聚類,將同一類別中的其他視頻作為相關推薦的,效果還是非常好的。
對於用戶嵌入,我們也可以有很多方法,下面是兩種比較基礎的方法。
可以將一段時間內用戶點擊過的視頻的平均嵌入特徵向量作為該用戶的嵌入特徵,這裡的「平均」可以是簡單的算術平均,可以是element-wise max,也可以是根據視頻的熱度和時間屬性等進行加權平均或者嘗試用 RNN 替換掉平均操作。我們可以通過選擇時間周期的長短來刻畫用戶的長期興趣嵌入和短期興趣嵌入。
另外參考YouTube推薦系統(見參考文獻6)的思路,我們可以把推薦問題等價為一個多類別分類問題,使用 softmax 損失函數學習一個 DNN 模型,最終預測在某一時刻某一上下文信息下用戶觀看的下一個視頻的類別,最後把訓練好的 DNN 模型最後一層隱含層輸出作為用戶的嵌入。
3.3 特徵選擇
特徵選擇是指從所有構建的特徵中選擇出一個子集,用於模型訓練與學習的過程。特徵選擇不光要評估特徵本身,更需要評估特徵與模型的匹配度,評估特徵對最終的預測目標的精準度的貢獻。特徵沒有最好的,只有跟應用場景和模型合適的,特徵選擇對於構建機器學習應用是非常重要的一環。特徵選擇主要有以下兩個目的:
簡化模型,節省存儲和計算開銷,讓模型更易於理解和使用;減少特徵數量、降維,改善通用性、降低過擬合的風險。知道了什麼是特徵選擇以及特徵選擇的價值,下面我們提供進行特徵選擇的具體方法,主要有基於統計量的方法和基於模型的方法。
a 基於統計量選擇
基於統計量選擇主要有如下幾種方式,我們分別介紹:
1)選擇方差大的特徵
方差反應了特徵樣本的分布情況,我們可以分析特徵的數據分布,分布均勻的特徵,樣本之間差別不大,該特徵不能很好區分不同樣本,而分布不均勻的特徵,樣本之間有極大的區分度,因此通常可以選擇方差較大的特徵,去掉方差變化小的特徵。具體方差多大算大,可以事先計算出所有特徵的方差,選擇一定比例(比如20%)的方差大的特徵,或者可以設定一個閾值,選擇方差大於閾值的特徵。
2)皮爾遜相關係數
皮爾森相關係數是一種簡單的,能幫助理解特徵和目標變量之間關係的方法,用于衡量變量之間的線性相關性,取值區間為[-1,1],-1 表示完全的負相關,+1 表示完全的正相關,0 表示沒有線性關係。通過分析特徵與目標之間的相關性,優先選擇與目標相關性高的特徵。如果兩個特徵之間線性相關度的絕對值大,說明這兩個特徵是有很強的相關關係的,我們沒必要都選擇,只需要選擇其中一個即可。
3)覆蓋率
特徵的覆蓋率是指訓練樣本中有多大比例的樣本具備該特徵。我們首先計算每個特徵的覆蓋率,覆蓋率很小的特徵對模型的預測效果作用不大,可以剔除。
4)假設檢驗
假設特徵變量和目標變量之間相互獨立,選擇適當檢驗方法計算統計量,然後根據統計量做出統計推斷。例如對於特徵變量為類別變量而目標變量為連續數值變量的情況,可以使用方差分析,對於特徵變量和目標變量都為連續數值變量的情況,可以使用皮爾森卡方檢驗。卡方統計量取值越大,特徵相關性越高。
5)互信息
在概率論和資訊理論中,互信息用來度量兩個變量之間的相關性。互信息越大則表明兩個變量相關性越高,互信息為 0 時,兩個變量相互獨立。因此可以根據特徵變量和目標變量之間的互信息來選擇互信息大的特徵。
b 基於模型選擇
基於模型的特徵選擇,可以直接根據模型參數來選擇,也可用子集選擇的思路選出特徵的最優組合。
1) 基於模型參數
對於線性模型,可以直接基於模型係數大小來決定特徵的重要程度。對於樹模型,如決策樹、梯度提升樹、隨機森林等,每一顆樹的生成過程,都對應了一個特徵選擇的過程,在每次選擇分類節點時,都會選擇最佳分類特徵來進行切分,重要的特徵更有可能出現在樹生成早期的節點,作為分裂節點的次數也越多。因此,可以基於樹模型中特徵出現次數等指標對特徵重要性進行排序。如果我們想要得到稀疏特徵或者說是對特徵進行降維,可以在模型上主動使用正則化技術。使用L1正則,調整正則項的權重,基本可以得到任意維度的稀疏特徵。
2) 子集選擇
基於模型,我們也可以用子集選擇的思路來選取特徵。常見的有前向搜索和反向搜索兩種思路。如果我們先從N個特徵中選出一個最好的特徵,然後讓其餘的N-1個特徵分別與第一次選出的特徵進行組合,從N-1個二元特徵組合中選出最優組合,然後在上次的基礎上,添加另一個新的特徵,考慮3個特徵的組合,依次類推,這種方法叫做前向搜索。反之,如果我們的目標是每次從已有特徵中去掉一個特徵,並從這些組合中選出最優組合,這種方法就是反向搜索。如果特徵數量較多、模型複雜,那麼這種選擇的過程是非常耗時間和資源的。我們在後面講到的自動特徵工程中會提到通過算法自動選特徵的技術方案。
3.4 特徵評估
所謂特徵評估是在將特徵灌入模型進行訓練之前,事先評估特徵的價值,提前發現可能存在的問題,及時解決,避免將有問題的特徵導入模型,導致訓練過程冗長而得不到好的結果。特徵評估是對選擇好的特徵進行整體評價,而不是特徵選擇中所謂的對單個特徵重要性的評判。特徵評估包括特徵的覆蓋率、特徵的維度、定性分析和定量分析等幾種方式。
特徵的覆蓋率是指有多少比例的樣本可以構建出相關特徵,對於推薦系統來說,存在用戶冷啟動,因此對於新用戶,如果選擇的特徵中包含從用戶行為中獲得的特徵,那麼我們是無法為他構建特徵的,從而無法利用模型來為他進行推薦。
特徵的維度衡量的是模型的表達能力,維度越高,模型表達能力越強,這時就需要更多的樣本量和更多的計算資源、優秀的分布式計算框架來支撐模型的訓練。為了達到較好的訓練效果,一般對於簡單模型可以用更多維度的特徵,而對於複雜模型可以用更少的維度。
定性分析是指構建的特徵是否跟用戶行為是衝突的,可以拿熟悉的樣本來做驗證,比如在視頻推薦中,可以根據自己的行為來定性驗證標籤的正確性。我個人最喜歡看恐怖電影,那麼基於標籤構建特徵的話,那麼對於我的樣本,在恐怖這個標籤上的權重應該是比其他標籤權重大的。
定量分析,通過常用的離線評估指標,如Precitson、Recall、AUC等等來驗證模型的效果,當然,最終需要上線做AB測試來看是否對核心用戶體驗、商業化指標有提升。
關於特徵工程的其他介紹讀者還可以參見參考文獻1、2、3,參考文獻8、9也是兩篇比較好的關於特徵工程的介紹文檔。另外,Spark的MLlib中也集成了很多與特徵工程相關的算子,參見參考文獻10。scikit-learn中也包含大量與數據處理、特徵構建、特徵選擇相關的算子,參見參考文獻11。
四、常用推薦算法之數據與特徵工程
在本節我們基於3類主流的推薦產品形態來介紹與之相關的數據與特徵工程。不同產品形態可以有不同的推薦算法實現,我們會根據常用的推薦算法來說明需要什麼樣的數據,以及怎麼基於這些數據通過特徵工程來構建特徵用於推薦模型訓練。
1 排行榜推薦
排行榜推薦是非個性化推薦,也是最簡單的一類推薦算法,一般可以作為獨立產品或者作為其他個性化推薦算法的默認推薦。排行榜推薦一般只依賴於用戶行為數據,根據用戶在過去一段時間(比如過去一周、一月、一年等)的操作行為或者標的物自身相關的屬性特徵,基於某個維度統計最受歡迎的標的物列表作為推薦列表。常用的有最新榜(這個是根據標的物上線時間來統計的)、最熱榜、收藏榜、熱銷榜等等。
這類推薦算法也不需要什麼複雜特徵工程,只需要對數據進行簡單的統計處理就可以了,一般用select sum(N) as num from T group by sid order by num desc limit 100這類SQL就可以搞定,這裡N是標的物的播放量、銷量等,T是通過數據預處理生成的結構化的表,sid是標的物的唯一編碼id)。需要注意的是,對於不同類別的標的物(如電影和電視劇),如果要混合排序的話,需要將統計量(如播放量)歸一化到同一個可比較的範圍中。
2 標的物關聯標的物推薦
標的物關聯標的物推薦,就是我們通常所說的關聯推薦,給每個標的物關聯一系列相關的標的物作為推薦列表。根據所使用算法不同,對數據源、數據處理及特徵工程有不同的要求。下面分別介紹。
2.1 基於內容的關聯推薦
如果是新聞資訊類標的物,一般我們可以用TF-IDF算法來向量化每篇文章,這樣就可以根據向量相似度來計算兩篇文章的相似度了。這時我們利用的數據就是標的物本身的文本信息,該算法也沒有複雜的特徵工程,只需將所有文章進行分詞,構建詞庫,剔除停用詞,得到最終所有詞的corpora,對每篇文章利用TF-IDF算法獲得每篇文章的向量表示,這個向量就可以認為是是最終的特徵。
當然也可以利用向量空間模型,將標的物的每一個屬性轉換為一個特徵,進而獲得特徵表示。如果標的物包含標籤信息,我們可以用每一個標籤表示一個特徵,採用one-hot編碼的方式構建特徵表示。對於標的物圖片、視頻、音頻數據也可以採用嵌入技術構建特徵向量。
2.2 基於協同過濾的關聯推薦
傳統的item-based協同過濾,通過獲取用戶操作行為,構建用戶行為矩陣,該矩陣的每一列就是某個item的特徵向量表示,基於該向量就可以根據cosine餘弦計算相似度。基於矩陣分解的協同過濾,也是通過用戶行為矩陣進行矩陣分解,獲得標的物特徵矩陣,該矩陣的每一列就是標的物的特徵表示。這兩類方法,只需要利用用戶行為數據,獲得的標的物向量表示就是最終的特徵,所以也不存在複雜的特徵工程。
還有一種基於item2vec的方法基於用戶行為數據來獲得標的物的嵌入表示,也不需要進行複雜的特徵工程。
3 個性化推薦
個性化推薦是業界最常用的一種推薦產品形態,下面對常用個性化推薦算法來說明該算法所使用的數據集和相關特徵工程方面的知識點。
3.1 基於內容的個性化推薦
如果我們基於內容算法獲得了每個標的物最相似的標的物列表,可以基於用戶的操作歷史記錄,採用類似基於user-based或者item-based這類線性加權的方式獲得用戶的推薦,或者根據用戶的操作歷史獲得用戶的嵌入向量表示(用戶操作過的標的物的向量表示的加權平均可以作為用戶的嵌入表示),通過計算用戶向量和標的物向量內積來獲得用戶對標的物的評分,根據評分降序排序獲得最終給用戶的推薦列表。這類算法只需要用戶操作行為數據及標的物相關數據,並不需要複雜的特徵工程。
3.2 基於協同過濾的個性化推薦
常規的user-based、item-based、矩陣分解協同過濾,只需要用戶行為數據,經過簡單的算法就可以獲得給用戶的推薦。
3.3 基於多數據源構建複雜特徵的召回、排序模型
上面我們提到的算法都是基於簡單規則或者人工假設的模型,基本不涉及到複雜的特徵工程,我們都是一筆帶過。下面我們提到的推薦召回、排序模型,都是需要通過構建複雜的特徵來訓練的,這類算法有多種,比如經典的logistic回歸、FM算法,還有最近比較火的深度學習等。這裡我們重點講解視頻場景中,用經典的logistic回歸模型來做推薦排序中涉及到的特徵工程相關的知識點,其他模型類似。
對於利用logistic模型來預測用戶對某個視頻的點擊率,樣本是用戶觀看過的視頻,每個用戶視頻對構成一個樣本。這裡正樣本是用戶點擊播放過的視頻(或者是播放時長超過一定時間的視頻),而負樣本可以是曝光給用戶但是用戶沒有點擊過的視頻(或者播放時間少於某個閾值的視頻)。
這類構建複雜特徵來訓練召回模型的方法,需要儘可能多的數據,才能構建足夠多樣的特徵,所以一般用戶行為數據、用戶特徵數據、標的物特徵數據、上下文數據等都會被使用到。下面分別對這4類數據構建的特徵加以簡單介紹。
a 行為特徵:視頻的播放時長、播放完整度、點讚、轉發、分享、評論等多種互動行為都與用戶的最終點擊有關,都是可以構建成特徵的。
b 用戶屬性特徵:是否是會員,地域,活躍度,登陸時間分布,觀看節目分布,平均觀看時長,搜索行為,點讚行為,收藏行為,是否高危地區,設備信息,當前版本。
c 節目屬性特徵:是否是會員節目,是否獲獎,豆瓣得分,年代,是否高清(isHd),地區,節目語言(language),上映時間(show_time)等。
d 場景特徵:是否節假日、用戶所在路徑,以及上下文(context)特徵,context 特徵通常是客戶端帶的信息,在用戶授權的前提下可以直接獲取,比如請求時間、用戶手機品牌、手機型號、作業系統、當前網絡狀態(3g/4g/wifi)、用戶渠道等實時屬性特徵以及之間的交叉特徵。
基於上面這些信息,我們可以構建4大類特徵(基於第三節3中特徵工程相關知識點),形成如下面圖8的模型訓練樣本集合,通過特徵構建、特徵選擇、訓練、離線評估等步驟我們最終獲得了一個訓練好的logistic回歸模型。
圖8:構建logistic模型及相關特徵
通過上面的介紹我們知道經典的個性化推薦算法,如item-based、user-based、矩陣分解、KNN等屬於基於簡單規則(假設)的模型,模型是我們人為事先設定好的,比如利用內積來表示相似度,某個樣本點最近的K個點的類別進行投票確定該點的類別,這類模型沒有需要學習的參數(KNN和矩陣分解中的隱因子數量都是人為事先確定的,屬於超參數),這類算法只需要進行簡單的數據處理或者訓練就可以為用戶生成推薦,而包含大量參數的模型(如線性模型、FM、深度學習模型等)是需要進行複雜的特徵工程的。
五、推薦系統數據與特徵工程未來趨勢
伴隨科技的發展,網際網路技術滲透到了生活的方方面面,各類網際網路產品層出不窮,而產品所提供的信息和服務更是爆炸性增長,這其中非常重要的一個幫助用戶篩選、過濾信息的有效工具就是推薦系統,推薦系統一定是未來產品的標配技術,它一定會在更多的場景中得到應用。隨著深度學習、強化學習等更多更新的技術應用於推薦系統,推薦的效果越來越好。隨著各類傳感器種類的豐富、交互方式的多樣化,我們可以收集到越來越多樣的數據。用戶對反饋及時性的強烈需要,推動網際網路產品更加實時地處理用戶的請求,為用戶提供更加實時化的交互體驗。從這些大的趨勢來看,推薦系統依賴的數據和特徵工程處理技術也會面臨更多的變化與挑戰,下面作者就基於自己的理解和判斷來說說在未來幾年推薦系統數據與特徵工程的幾個重大變化和發展趨勢。
1 融合更多的數據源來構建更複雜的推薦模型
數據是一切機器學習的基礎,只有數據量夠多、質量夠好,才可以構建高質量的推薦模型。我們在這篇文章中總結了推薦系統四種數據源:行為數據、用戶屬性數據、物品屬性數據、上下文數據。每類數據的種類趨向於多樣化,拿行為數據來說,我們可以收集用戶在手機屏上的滑動幅度、滑動快慢、按壓力度等數據,在車載系統或者智能音箱場景中可以收集用戶與機器的語音交互數據,在VR/AR場景中我們可以收集用戶手勢、眼動、頭部轉動等各種信息,如果智能推薦未來拓展到這些場景中,那麼無疑這些數據對構建推薦系統是非常關鍵的。在社交場景中,用戶的社交關係數據對構建推薦系統也是非常重要的。如果某個公司有多個APP,那麼用戶在多個APP上的行為可以聯合起來進行學習,構建更好的推薦系統。
2 深度學習等複雜技術減少人工特徵工程的投入
深度學習技術在很多應用場景下構建的模型效果比傳統算法好很多,深度學習另外一個被大家稱道的優點是可以減少人工特徵工程的繁瑣投入,直接將較原始的數據灌入模型,讓深度模型自動學習輸入與輸出之間的複雜非線性關係。
隨著深度學習技術在推薦系統中的應用逐步成熟,目前應用到了非常多的行業及場景中,獲得了非常好的效果。未來的趨勢是基於特定應用場景,基於多樣化數據構建場景化的特殊深度網絡結構來獲得更好的推薦效果。有了深度學習的加持,可以讓推薦算法工程師將更多的時間用於思考業務、構建更加有效的模型上,而不是將大量精力放到構建複雜的特徵上,從而解放推薦算法工程師的雙手。
3 實時數據處理與實時特徵工程
隨著社會的發展,人們的生活節奏加快(大城市尤其如此,中小城市也會朝這個趨勢發展),人們的時間會更加碎片化,怎樣更好地佔領用戶的碎片化時間,是任何一個公司在開發產品過程中需要關注的重要問題。這種社會趨勢的出現,導致了新聞資訊、短視頻應用的流行,在這些應用中用戶消費一個標的物的時間是非常短的(一般幾秒鐘到幾分鐘),在這類產品上構建推薦服務這就要求推薦系統可以近實時響應用戶的需求,因此我們需要近實時收集處理數據、近實時構建特徵工程、近實時訓練算法模型、近實時響應用戶需求變化。這一趨勢一定是未來非常重要且非常難的一個方向。
4 自動化特徵工程
自動化機器學習(AutoML,全稱是Automated Machine Learning,參考文獻4是一篇關於自動機器學習最近進展的綜述文章,參考文獻5是一篇關於利用深度學習技術做自動化特性的文章,參考文獻14是一篇關於自動化進行特徵交叉的文章,讀者可以自行學習),是2014年以來,機器學習和深度學習領域最炙手可熱的研究方向之一。機器學習過程需要大量的人工幹預,這些人工幹預表現在:特徵提取、模型選擇、參數調節等機器學習的各個方面。AutoML試圖將這些與特徵、模型、優化、評價有關的重要步驟自動化,使得機器學習模型無需人工幹預即可自動化地學習與訓練。
自動化特徵工程也是AutoML研究中非常重要的一環,在AutoML中,自動特徵工程的目的是自動地發掘並構造相關的特徵,使得模型有更好的表現。除此之外,還包含一些特定的特徵增強方法,例如特徵選擇、特徵降維、特徵生成、以及特徵編碼等。這些步驟目前來說都沒有達到自動化的程度。
自動化特徵工程目前雖然是學術研究中非常火的一個方向,但目前還不夠成熟,也沒有非常有效的方法很好地應用於各類業務場景中。自動特徵工程在真實業務場景中確實是一個比較強的需求,因為手動構建特徵工程需要很強的領域知識,需要懂機器學習的領域專家參與,而既懂機器學習又對業務理解透徹的人畢竟是少數。對於提供機器學習服務的雲計算公司或者toB創業公司,需要接觸到很多不同的行業,也不可能為每個領域配備一個專家,因此也希望可以通過技術手段來做自動特徵工程,以減少人力和資源的投入,加快項目的推進進度,在這方面國內的明星創業公司第四範式做了很多嘗試。
對於自動特徵工程在推薦系統中的應用,讀者可以看看參考文獻12、13,文章中提供了很多很好的方法和思路。
總結
本文對推薦系統算法模型構建過程中依賴的數據源進行了較全面的介紹,包括數據的種類、數據生成、數據預處理、數據存儲等,這些數據是構建推薦模型的原料。在講解數據的基礎上,我們介紹了特徵工程相關的概念和技術,通過特徵工程可以將數據轉化為推薦算法可以直接使用的特徵,這時推薦算法才能夠發揮用武之地。
同時,我們講解了常用的推薦算法是怎麼使用數據和基於這些數據來構建特徵的,有了這些知識,我們可以更好、更全面地理解推薦業務全流程,而不僅僅只是知道算法。在最後,作者根據自己的經驗和理解,對推薦系統在數據與特徵工程的後續發展方向和面臨的挑戰等問題進行了探討,希望給讀者提供一定的方向性指導。
推薦系統的數據與特徵工程這塊知識是一般書本上很少講到但是在實際業務中非常重要的,期望本文可以讓讀者較全面地學習了解這方面的知識,並能學以致用。
參考文獻
1.圖書:《精通特徵工程》
2.圖書:《特徵工程入門與實踐》
3.[特徵工程到底是什麼?] https://www.zhihu.com/question/29316149
4.[2019] Taking the Human out of Learning Applications- A Survey on Automated Machine Learning
5.[2019] AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks
6.[2016 YouTube] Deep Neural Networks for YouTube Recommendations
7.[2016 Google] Wide & Deep Learning for Recommender Systems
8.[淺談微視推薦系統中的特徵工程] https://mp.weixin.qq.com/s/EgiSIJCRfiRLKwHUC1m46A
9.[如何解決特徵工程,克服工業界應用 AI 的巨大難關] https://www.infoq.cn/article/solve-feature-engineering-in-industry/#
10.http://spark.apache.org/docs/latest/ml-features.html
11.https://scikit-learn.org/stable/data_transforms.html
12.[AutoML 在推薦系統中的應用] https://gitbook.cn/books/5bcd96da48da2b3b6ac43327/index.html
13.[羅遠飛:自動特徵工程在推薦系統中的研究] https://zhuanlan.zhihu.com/p/98006452
14.[2019] AutoCross: Automatic Feature Crossing for Tabular Data in Real-World Applications
(*本文為AI科技大本營轉載文章,轉載請聯繫原作者)