日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

一文读懂FM算法优势,并用python实现

發(fā)布時間:2024/1/17 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文读懂FM算法优势,并用python实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

介紹

我仍然記得第一次遇到點擊率預(yù)測問題時的情形,在那之前,我一直在學(xué)習(xí)數(shù)據(jù)科學(xué),對自己取得的進(jìn)展很滿意,在機(jī)器學(xué)習(xí)黑客馬拉松活動中也開始建立了自信,并決定好好迎接不同的挑戰(zhàn)。

為了做得更好,我購買了一臺內(nèi)存16GB,i7處理器的機(jī)器,但是當(dāng)我看到數(shù)據(jù)集的時候卻感到非常不安,解壓縮之后的數(shù)據(jù)大概有50GB - 我不知道基于這樣的數(shù)據(jù)集要怎樣進(jìn)行點擊率預(yù)測。幸運地是,Factorization Machines(FM)算法拯救了我。

任何從事點擊率預(yù)測問題或者推薦系統(tǒng)相關(guān)工作的人都會遇到類似的情況。由于數(shù)據(jù)量巨大,利用有限的計算資源對這些數(shù)據(jù)集進(jìn)行預(yù)測是很有挑戰(zhàn)性的。

然而在大多數(shù)情況下,由于很多特征對預(yù)測并不重要,所以這些數(shù)據(jù)集是稀疏的(每個訓(xùn)練樣本只有幾個變量是非零的)。在數(shù)據(jù)稀疏的場景下,因子分解有助于從原始數(shù)據(jù)中提取到重要的潛式或隱式的特征。

因子分解有助于使用低維稠密矩陣來表示目標(biāo)和預(yù)測變量之間的近似關(guān)系。在本文中我將討論算法Factorization Machines(FM) 和Field-Aware Factorization Machines(FFM),然后在回歸/分類問題中討論因子分解的優(yōu)勢,并通過python編程實現(xiàn)。


目錄

1. 因式分解的直觀介紹

2. FM算法如何優(yōu)于多項式和線性模型

3. FFM算法介紹

4. 在python中使用xLearn庫進(jìn)行算法實現(xiàn)

因式分解的直觀介紹

為了直觀地理解矩陣分解,我們來看一個例子:假設(shè)有一個用戶-電影評分(1-5)矩陣,矩陣中的每一個值表示用戶給電影的評分(1-5)。

從上述表格中我們可以看出,一些評分是缺失的,我們想設(shè)計一種方法來預(yù)測這些缺失的評分。直觀上來講,利用矩陣分解來解決這個問題的關(guān)鍵是應(yīng)該有一些潛在的特征決定用戶如何評價一部電影。舉例來說 - 用戶A和B都是演員阿爾·帕西諾的粉絲,那么他們就會對阿爾·帕西諾的電影評分較高。在上述例子中,對特定演員的偏好是一個隱藏的特性,因為我們沒有明確地將其包含在評分矩陣中。

假設(shè)我們要計算K個隱藏或潛在的特征,我們的任務(wù)是找出矩陣P (U x K)和Q (D x K) (U – 用戶, D – 電影),使得 P x QT??近似等于評分矩陣R。


P矩陣的每一行表示用戶與不同特征的相關(guān)性,Q矩陣的每一行表示該特征與電影同樣的相關(guān)性。為了得到用戶ui對電影dj的評分,我們可以計算對應(yīng)于ui和dj兩個向量的點積。

接下來要做的就是求出矩陣P和矩陣Q。我們使用梯度下降算法來計算,目標(biāo)函數(shù)是使用戶的實際評分與通過矩陣P和Q估計的評分之間的平方誤差最小,這里的平方誤差由以下方程求出。


現(xiàn)在我們要給pik和qkj定義一個更新規(guī)則,梯度下降法中的更新規(guī)則是由最小化誤差值的梯度來定義的。

獲得梯度值后,接下來可以定義pik和qkj的更新規(guī)則。

這里α是控制更新步長的學(xué)習(xí)速率,使用上述更新規(guī)則,我們可以迭代地執(zhí)行操作,直到誤差收斂到最小,同時使用下面的公式計算總的誤差,以此來確定什么情況下應(yīng)該停止迭代。


上述解決方案很簡單并且經(jīng)常會導(dǎo)致過擬合,即現(xiàn)有的評分都被準(zhǔn)確預(yù)測到,但是不能很好地推廣到未知的數(shù)據(jù)上。為了解決這個問題,我們可以引入一個正則化參數(shù) β,它將分別控制矩陣P和Q中向量“用戶-特征”和“電影-特征”,并給出一個更好的評分的近似值。

如果對利用python實現(xiàn)上述功能和相關(guān)細(xì)節(jié)感興趣,請參考這個鏈接http://www.quuxlabs.com/wp-content/uploads/2010/09/mf.py_.txt。一旦我們用上述方法計算出了矩陣P和Q,得到的近似評分矩陣如下:


現(xiàn)在,我們既能夠重新生成現(xiàn)有評分,也能對未知的評分進(jìn)行一個合理的近似。

?

FM算法如何優(yōu)于多項式和線性模型

首先考慮一組點擊率預(yù)測數(shù)據(jù)的訓(xùn)練示例。以下數(shù)據(jù)來自相關(guān)體育新聞網(wǎng)站(發(fā)布商)和體育用品公司(廣告商)。


當(dāng)我們討論FM或者FFM的時候,數(shù)據(jù)集中的每一列(比如上述表格中的出版商、廣告商等)將被稱為一個字段,每一個值( ESPN、Nike 等)都被稱為一個特征。

線性或邏輯回歸模型在很多問題上表現(xiàn)很好,但缺點是這種模型只能學(xué)習(xí)所有變量或者特征各自的影響,無法學(xué)習(xí)變量之間的相互作用


在上述等式中,w0、wESPN等代表參數(shù),xESPN、xNike等代表數(shù)據(jù)集中的各個特征,通過最小化上述函數(shù)的對數(shù)損失,得到邏輯回歸模型。捕獲特征之間相互作用的一種方法是使用多項式函數(shù),將每個特征對的乘積作為單獨的參數(shù)來學(xué)習(xí),并且把每一個乘積作為一個獨立的變量。


這也可以稱為 Poly2模型,因為每一項都只考慮了兩個特征之間的相互影響。

問題在于,即使面對一個中等大小的數(shù)據(jù)集,也需要一個龐大的模型,這對存儲模型所需要的內(nèi)存空間和訓(xùn)練模型所花費的時間都有很大的影響;

其次,對于一個稀疏數(shù)據(jù)集,這種技術(shù)不能很好地學(xué)習(xí)所有的權(quán)重或參數(shù),因為沒有有足夠的訓(xùn)練樣本使每一個特征對的權(quán)重是可靠的。

救星FM

FM算法解決了成對特征交互的問題。它使我們能夠根據(jù)每一對特征組合中的可靠信息(隱藏特征)來訓(xùn)練模型,同時在時間和空間復(fù)雜度上更有效地實現(xiàn)上述目標(biāo)。具體來講,它將成對交互特征作為低維向量的點積(長度為K)進(jìn)行建模,以下包含了一個二階因子分解的方程。


FM(K=3)項中每個參數(shù)的表示方法如下:


上述等式中,我們分別計算了與2個特征對應(yīng)的2個長度為3的潛因子的點積。

從建模的角度來看,這是非常強(qiáng)大的,因為每一個特征最后都會轉(zhuǎn)換到一個相似特征被互相嵌套的空間,簡而言之,點積基本上表示了潛在特征的相似程度,特征越相近,點積越大。

對于余弦函數(shù),當(dāng) θ是0時,得到最大值1;當(dāng) θ是180度,得到-1,所以當(dāng) θ接近于0時,相似性最大。

FM算法的另一個巨大優(yōu)勢是能夠在線性時間復(fù)雜度下使用簡單的數(shù)學(xué)方法計算模型中成對特征的相互作用。如果你想進(jìn)一步了解具體的實現(xiàn)步驟,請參考鏈接中關(guān)于FM算法的原始研究論文。

https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf


示例:FM算法性能優(yōu)于 POLY2算法的演示

考慮以下一組虛構(gòu)的點擊率數(shù)據(jù):

這個數(shù)據(jù)集由作為發(fā)布者的體育網(wǎng)站和體育用品廣告商構(gòu)成。廣告是以彈出的方式來顯示的,用戶可以選擇點擊廣告或者關(guān)閉廣告。


特征對(ESPN,Adidas)只有一個負(fù)的訓(xùn)練數(shù)據(jù),那么在Poly2算法中,這個特征對可能會學(xué)到一個負(fù)的權(quán)重值wESPN,Adidas;而在FM算法中,由于特征對(ESPN,Adidas)是由wESPN·wAdidas決定的,而其中的wESPN和wAdidas分別是從其他特征對中學(xué)到的(比如(ESPN,Nike),(NBC,Adidas)等),所以預(yù)測可能更加精確。

另一個例子是特征對(NBC,Gucci)沒有任何訓(xùn)練數(shù)據(jù),對于Poly2算法,這個特征對的預(yù)測值為0;但是在FM算法中,因為wNBC和wGucci可以從其他特征對中學(xué)到,所以仍然有可能得到有意義的預(yù)測值。

FFM算法介紹


為了理解FFM算法,我們需要認(rèn)識field的概念。field通常是指包含一個特定特征的更廣泛的類別。在上述訓(xùn)練示例中,field分別指發(fā)布者(P)、廣告商(A)和性別(G)。

在FM算法中,每一個特征只有一個隱向量v,來學(xué)習(xí)其他特征帶來的潛在影響。以ESPN為例,wESPN被用來學(xué)習(xí)特征Nike(wESPN·wNike)和Male(wESPN.wMale)之間的潛在作用。

但是,由于ESPN和Male屬于不同的field,所以對特征對(ESPN,Nike)和(ESPN,Male)的起作用的潛在作用可能不同。FM算法無法捕捉這個差異,因為它不區(qū)分field的概念,在這兩種情況中,它會使用相同參數(shù)的點積來計算。

在FFM算法中,每個特征有若干個隱向量。例如,當(dāng)考慮特征ESPN和Nike之間的交互作用時,用符號wESPN,A來表示ESPN的隱藏特征,其中A(廣告商)表示特征Nike的field。類似的,關(guān)于性別的field的一個重要的參數(shù)wESPN,G也會被學(xué)習(xí)到。

事實證明,FFM算法對獲得由 Criteo、Avazu、Outbrain舉辦的點擊率(CTR)比賽第一名是至關(guān)重要的,同時也幫助贏得了2015年RecSys挑戰(zhàn)賽的三等獎。關(guān)于點擊率數(shù)據(jù)集可以從Kaggle獲得。

在python中使用xLearn庫進(jìn)行算法實現(xiàn)


一些在python中實現(xiàn)FM & FFM的最流行的庫如下所示:

為了在數(shù)據(jù)集上使用FM算法,需要將數(shù)據(jù)轉(zhuǎn)換為libSVM格式。以下為訓(xùn)練和測試的數(shù)據(jù)文件格式:

<label> <feature1>:<value1> <feature2>:<value2> …


在增加了field的概念之后,每個特征被唯一編碼并被賦值,上述圖中,特征ESPN用1表示,特征Nike用2表示,以此類推。每一行包含一個等效的訓(xùn)練示例并以“\ n”或換行符結(jié)尾。

對于分類(二進(jìn)制/多類),<label>是一個指示類標(biāo)簽的整數(shù)。

對于回歸,<label>是任何實數(shù)的目標(biāo)值。

測試文件中的標(biāo)簽僅用于計算準(zhǔn)確度或誤差,未知的情況下可以用任何數(shù)值填寫第一列。


同樣,對于FFM算法,需要將數(shù)據(jù)轉(zhuǎn)換為libffm格式。在這里,我們也需要對field進(jìn)行編碼,因為該算法需要field的信息來學(xué)習(xí)。格式如下:

<label><field1>:<feature1>:<value1><field2>:<feature2>:<value2> …

有關(guān)數(shù)值特征的重要說明

數(shù)值特征需要被離散化(通過將特定數(shù)值特征的整個范圍分成較小的范圍并且分別對每個范圍進(jìn)行標(biāo)記編碼而轉(zhuǎn)換為分類特征),然后如上所示轉(zhuǎn)換為libffm格式。

另一種可能性是添加一個與特征值相同的虛擬field值,它將是該特定行的數(shù)值特征(例如,具有值45.3的特征可以被變換為1:1:45.3)。 但是虛擬field值可能不包含任何信息,因為它們僅僅是這些數(shù)值特征的復(fù)制品。

xLearn

最近推出的xLearn庫提供了一個在各種數(shù)據(jù)集上實現(xiàn)FM和FFM模型的快速解決方案。 它比libfm和libffm庫快得多,為模型測試和調(diào)優(yōu)提供了更好的功能。

在這里,我們將用一個例子來說明FFM算法,數(shù)據(jù)來自Criteo點擊率預(yù)測挑戰(zhàn)賽中CTR數(shù)據(jù)集的一個微小(1%)抽樣。 你可以從這里[Office1]?下載這個數(shù)據(jù)集。

但首先我們需要將其轉(zhuǎn)換為xLearn所需的libffm格式以擬合模型。 以下函數(shù)將標(biāo)準(zhǔn)數(shù)據(jù)幀格式的數(shù)據(jù)集轉(zhuǎn)換為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以及l(fā)ibsvm格式的數(shù)據(jù)來實現(xiàn)FM算法,但對FFM算法而言,我們必須將數(shù)據(jù)轉(zhuǎn)換為libffm格式。

一旦我們有了libffm格式的數(shù)據(jù)集,就可以使用xLearn庫來訓(xùn)練模型。

類似于任何其他機(jī)器學(xué)習(xí)算法,數(shù)據(jù)集被分成一個訓(xùn)練集和一個驗證集。xLearn使用驗證/測試對數(shù)損失來自動執(zhí)行提前停止的操作,并且我們還可以在隨機(jī)梯度下降的迭代中為驗證集設(shè)置其他的監(jiān)控指標(biāo)。

下面的python腳本可以用于在ffm格式的數(shù)據(jù)集上使用xLearn來訓(xùn)練和調(diào)整FFM模型的超參數(shù)。

該庫還允許我們使用cv()函數(shù)進(jìn)行交叉驗證:

可以使用以下代碼片段對測試集進(jìn)行預(yù)測:

結(jié)語

在這篇文章中,我們已經(jīng)演示了對一般分類/回歸問題的因式分解的用法。如果您在執(zhí)行這個算法的過程中遇到任何問題請及時告知我們。有關(guān)xLearn詳細(xì)文檔將在這個鏈接中給出,并會得到定期更新和支持。

http://xlearn-doc.readthedocs.io/en/latest/python_api.html

原文鏈接:

https://www.analyticsvidhya.com/blog/2018/01/factorization-machines/
---------------------?
作者:數(shù)據(jù)派THU?
來源:CSDN?
原文:https://blog.csdn.net/tmb8z9vdm66wh68vx1/article/details/79091671?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的一文读懂FM算法优势,并用python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。