一文读懂FM算法优势,并用python实现
介紹
我仍然記得第一次遇到點擊率預測問題時的情形,在那之前,我一直在學習數據科學,對自己取得的進展很滿意,在機器學習黑客馬拉松活動中也開始建立了自信,并決定好好迎接不同的挑戰。
為了做得更好,我購買了一臺內存16GB,i7處理器的機器,但是當我看到數據集的時候卻感到非常不安,解壓縮之后的數據大概有50GB - 我不知道基于這樣的數據集要怎樣進行點擊率預測。幸運地是,Factorization Machines(FM)算法拯救了我。
任何從事點擊率預測問題或者推薦系統相關工作的人都會遇到類似的情況。由于數據量巨大,利用有限的計算資源對這些數據集進行預測是很有挑戰性的。
然而在大多數情況下,由于很多特征對預測并不重要,所以這些數據集是稀疏的(每個訓練樣本只有幾個變量是非零的)。在數據稀疏的場景下,因子分解有助于從原始數據中提取到重要的潛式或隱式的特征。
因子分解有助于使用低維稠密矩陣來表示目標和預測變量之間的近似關系。在本文中我將討論算法Factorization Machines(FM) 和Field-Aware Factorization Machines(FFM),然后在回歸/分類問題中討論因子分解的優勢,并通過python編程實現。
目錄
1. 因式分解的直觀介紹
2. FM算法如何優于多項式和線性模型
3. FFM算法介紹
4. 在python中使用xLearn庫進行算法實現
因式分解的直觀介紹
為了直觀地理解矩陣分解,我們來看一個例子:假設有一個用戶-電影評分(1-5)矩陣,矩陣中的每一個值表示用戶給電影的評分(1-5)。
從上述表格中我們可以看出,一些評分是缺失的,我們想設計一種方法來預測這些缺失的評分。直觀上來講,利用矩陣分解來解決這個問題的關鍵是應該有一些潛在的特征決定用戶如何評價一部電影。舉例來說 - 用戶A和B都是演員阿爾·帕西諾的粉絲,那么他們就會對阿爾·帕西諾的電影評分較高。在上述例子中,對特定演員的偏好是一個隱藏的特性,因為我們沒有明確地將其包含在評分矩陣中。
假設我們要計算K個隱藏或潛在的特征,我們的任務是找出矩陣P (U x K)和Q (D x K) (U – 用戶, D – 電影),使得 P x QT??近似等于評分矩陣R。
P矩陣的每一行表示用戶與不同特征的相關性,Q矩陣的每一行表示該特征與電影同樣的相關性。為了得到用戶ui對電影dj的評分,我們可以計算對應于ui和dj兩個向量的點積。
接下來要做的就是求出矩陣P和矩陣Q。我們使用梯度下降算法來計算,目標函數是使用戶的實際評分與通過矩陣P和Q估計的評分之間的平方誤差最小,這里的平方誤差由以下方程求出。
現在我們要給pik和qkj定義一個更新規則,梯度下降法中的更新規則是由最小化誤差值的梯度來定義的。
獲得梯度值后,接下來可以定義pik和qkj的更新規則。
這里α是控制更新步長的學習速率,使用上述更新規則,我們可以迭代地執行操作,直到誤差收斂到最小,同時使用下面的公式計算總的誤差,以此來確定什么情況下應該停止迭代。
上述解決方案很簡單并且經常會導致過擬合,即現有的評分都被準確預測到,但是不能很好地推廣到未知的數據上。為了解決這個問題,我們可以引入一個正則化參數 β,它將分別控制矩陣P和Q中向量“用戶-特征”和“電影-特征”,并給出一個更好的評分的近似值。
如果對利用python實現上述功能和相關細節感興趣,請參考這個鏈接http://www.quuxlabs.com/wp-content/uploads/2010/09/mf.py_.txt。一旦我們用上述方法計算出了矩陣P和Q,得到的近似評分矩陣如下:
現在,我們既能夠重新生成現有評分,也能對未知的評分進行一個合理的近似。
?
FM算法如何優于多項式和線性模型
首先考慮一組點擊率預測數據的訓練示例。以下數據來自相關體育新聞網站(發布商)和體育用品公司(廣告商)。
當我們討論FM或者FFM的時候,數據集中的每一列(比如上述表格中的出版商、廣告商等)將被稱為一個字段,每一個值( ESPN、Nike 等)都被稱為一個特征。
線性或邏輯回歸模型在很多問題上表現很好,但缺點是這種模型只能學習所有變量或者特征各自的影響,無法學習變量之間的相互作用
。
在上述等式中,w0、wESPN等代表參數,xESPN、xNike等代表數據集中的各個特征,通過最小化上述函數的對數損失,得到邏輯回歸模型。捕獲特征之間相互作用的一種方法是使用多項式函數,將每個特征對的乘積作為單獨的參數來學習,并且把每一個乘積作為一個獨立的變量。
這也可以稱為 Poly2模型,因為每一項都只考慮了兩個特征之間的相互影響。
問題在于,即使面對一個中等大小的數據集,也需要一個龐大的模型,這對存儲模型所需要的內存空間和訓練模型所花費的時間都有很大的影響;
其次,對于一個稀疏數據集,這種技術不能很好地學習所有的權重或參數,因為沒有有足夠的訓練樣本使每一個特征對的權重是可靠的。
救星FM
FM算法解決了成對特征交互的問題。它使我們能夠根據每一對特征組合中的可靠信息(隱藏特征)來訓練模型,同時在時間和空間復雜度上更有效地實現上述目標。具體來講,它將成對交互特征作為低維向量的點積(長度為K)進行建模,以下包含了一個二階因子分解的方程。
FM(K=3)項中每個參數的表示方法如下:
上述等式中,我們分別計算了與2個特征對應的2個長度為3的潛因子的點積。
從建模的角度來看,這是非常強大的,因為每一個特征最后都會轉換到一個相似特征被互相嵌套的空間,簡而言之,點積基本上表示了潛在特征的相似程度,特征越相近,點積越大。
對于余弦函數,當 θ是0時,得到最大值1;當 θ是180度,得到-1,所以當 θ接近于0時,相似性最大。
FM算法的另一個巨大優勢是能夠在線性時間復雜度下使用簡單的數學方法計算模型中成對特征的相互作用。如果你想進一步了解具體的實現步驟,請參考鏈接中關于FM算法的原始研究論文。
https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf
示例:FM算法性能優于 POLY2算法的演示
考慮以下一組虛構的點擊率數據:
這個數據集由作為發布者的體育網站和體育用品廣告商構成。廣告是以彈出的方式來顯示的,用戶可以選擇點擊廣告或者關閉廣告。
特征對(ESPN,Adidas)只有一個負的訓練數據,那么在Poly2算法中,這個特征對可能會學到一個負的權重值wESPN,Adidas;而在FM算法中,由于特征對(ESPN,Adidas)是由wESPN·wAdidas決定的,而其中的wESPN和wAdidas分別是從其他特征對中學到的(比如(ESPN,Nike),(NBC,Adidas)等),所以預測可能更加精確。
另一個例子是特征對(NBC,Gucci)沒有任何訓練數據,對于Poly2算法,這個特征對的預測值為0;但是在FM算法中,因為wNBC和wGucci可以從其他特征對中學到,所以仍然有可能得到有意義的預測值。
FFM算法介紹
為了理解FFM算法,我們需要認識field的概念。field通常是指包含一個特定特征的更廣泛的類別。在上述訓練示例中,field分別指發布者(P)、廣告商(A)和性別(G)。
在FM算法中,每一個特征只有一個隱向量v,來學習其他特征帶來的潛在影響。以ESPN為例,wESPN被用來學習特征Nike(wESPN·wNike)和Male(wESPN.wMale)之間的潛在作用。
但是,由于ESPN和Male屬于不同的field,所以對特征對(ESPN,Nike)和(ESPN,Male)的起作用的潛在作用可能不同。FM算法無法捕捉這個差異,因為它不區分field的概念,在這兩種情況中,它會使用相同參數的點積來計算。
在FFM算法中,每個特征有若干個隱向量。例如,當考慮特征ESPN和Nike之間的交互作用時,用符號wESPN,A來表示ESPN的隱藏特征,其中A(廣告商)表示特征Nike的field。類似的,關于性別的field的一個重要的參數wESPN,G也會被學習到。
事實證明,FFM算法對獲得由 Criteo、Avazu、Outbrain舉辦的點擊率(CTR)比賽第一名是至關重要的,同時也幫助贏得了2015年RecSys挑戰賽的三等獎。關于點擊率數據集可以從Kaggle獲得。
在python中使用xLearn庫進行算法實現
一些在python中實現FM & FFM的最流行的庫如下所示:
為了在數據集上使用FM算法,需要將數據轉換為libSVM格式。以下為訓練和測試的數據文件格式:
<label> <feature1>:<value1> <feature2>:<value2> …
在增加了field的概念之后,每個特征被唯一編碼并被賦值,上述圖中,特征ESPN用1表示,特征Nike用2表示,以此類推。每一行包含一個等效的訓練示例并以“\ n”或換行符結尾。
對于分類(二進制/多類),<label>是一個指示類標簽的整數。
對于回歸,<label>是任何實數的目標值。
測試文件中的標簽僅用于計算準確度或誤差,未知的情況下可以用任何數值填寫第一列。
同樣,對于FFM算法,需要將數據轉換為libffm格式。在這里,我們也需要對field進行編碼,因為該算法需要field的信息來學習。格式如下:
<label><field1>:<feature1>:<value1><field2>:<feature2>:<value2> …
有關數值特征的重要說明
數值特征需要被離散化(通過將特定數值特征的整個范圍分成較小的范圍并且分別對每個范圍進行標記編碼而轉換為分類特征),然后如上所示轉換為libffm格式。
另一種可能性是添加一個與特征值相同的虛擬field值,它將是該特定行的數值特征(例如,具有值45.3的特征可以被變換為1:1:45.3)。 但是虛擬field值可能不包含任何信息,因為它們僅僅是這些數值特征的復制品。
xLearn
最近推出的xLearn庫提供了一個在各種數據集上實現FM和FFM模型的快速解決方案。 它比libfm和libffm庫快得多,為模型測試和調優提供了更好的功能。
在這里,我們將用一個例子來說明FFM算法,數據來自Criteo點擊率預測挑戰賽中CTR數據集的一個微小(1%)抽樣。 你可以從這里[Office1]?下載這個數據集。
但首先我們需要將其轉換為xLearn所需的libffm格式以擬合模型。 以下函數將標準數據幀格式的數據集轉換為libffm格式。
df = Dataframe to be converted to ffm format
Type = Train/Test/Val
Numerics = list of all numeric fields
Categories = list of all categorical fields
Features = list of all features except the Label and Id
xLearn可以直接處理csv以及libsvm格式的數據來實現FM算法,但對FFM算法而言,我們必須將數據轉換為libffm格式。
一旦我們有了libffm格式的數據集,就可以使用xLearn庫來訓練模型。
類似于任何其他機器學習算法,數據集被分成一個訓練集和一個驗證集。xLearn使用驗證/測試對數損失來自動執行提前停止的操作,并且我們還可以在隨機梯度下降的迭代中為驗證集設置其他的監控指標。
下面的python腳本可以用于在ffm格式的數據集上使用xLearn來訓練和調整FFM模型的超參數。
該庫還允許我們使用cv()函數進行交叉驗證:
可以使用以下代碼片段對測試集進行預測:
結語
在這篇文章中,我們已經演示了對一般分類/回歸問題的因式分解的用法。如果您在執行這個算法的過程中遇到任何問題請及時告知我們。有關xLearn詳細文檔將在這個鏈接中給出,并會得到定期更新和支持。
http://xlearn-doc.readthedocs.io/en/latest/python_api.html
原文鏈接:
https://www.analyticsvidhya.com/blog/2018/01/factorization-machines/
---------------------?
作者:數據派THU?
來源:CSDN?
原文:https://blog.csdn.net/tmb8z9vdm66wh68vx1/article/details/79091671?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的一文读懂FM算法优势,并用python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时间序列(七): 高冷贵族: 隐马尔可夫
- 下一篇: FM算法python实现