日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

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

介紹

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

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

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

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

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


目錄

1. 因式分解的直觀介紹

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

3. FFM算法介紹

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

因式分解的直觀介紹

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

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

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


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

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


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

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

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


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

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


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

?

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

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


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

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


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


這也可以稱為 Poly2模型,因?yàn)槊恳豁?xiàng)都只考慮了兩個(gè)特征之間的相互影響。

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

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

救星FM

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


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


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

從建模的角度來(lái)看,這是非常強(qiáng)大的,因?yàn)槊恳粋€(gè)特征最后都會(huì)轉(zhuǎn)換到一個(gè)相似特征被互相嵌套的空間,簡(jiǎn)而言之,點(diǎn)積基本上表示了潛在特征的相似程度,特征越相近,點(diǎn)積越大。

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

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

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


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

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

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


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

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

FFM算法介紹


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

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

但是,由于ESPN和Male屬于不同的field,所以對(duì)特征對(duì)(ESPN,Nike)和(ESPN,Male)的起作用的潛在作用可能不同。FM算法無(wú)法捕捉這個(gè)差異,因?yàn)樗粎^(qū)分field的概念,在這兩種情況中,它會(huì)使用相同參數(shù)的點(diǎn)積來(lái)計(jì)算。

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

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

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


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

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

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


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

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

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

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


同樣,對(duì)于FFM算法,需要將數(shù)據(jù)轉(zhuǎn)換為libffm格式。在這里,我們也需要對(duì)field進(jìn)行編碼,因?yàn)樵撍惴ㄐ枰猣ield的信息來(lái)學(xué)習(xí)。格式如下:

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

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

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

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

xLearn

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

在這里,我們將用一個(gè)例子來(lái)說(shuō)明FFM算法,數(shù)據(jù)來(lái)自Criteo點(diǎn)擊率預(yù)測(cè)挑戰(zhàn)賽中CTR數(shù)據(jù)集的一個(gè)微小(1%)抽樣。 你可以從這里[Office1]?下載這個(gè)數(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ù)來(lái)實(shí)現(xiàn)FM算法,但對(duì)FFM算法而言,我們必須將數(shù)據(jù)轉(zhuǎn)換為libffm格式。

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

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

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

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

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

結(jié)語(yǔ)

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

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

原文鏈接:

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

總結(jié)

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

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