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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【机器学习基础】逻辑回归 + GBDT模型融合实战!

發(fā)布時間:2025/3/8 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习基础】逻辑回归 + GBDT模型融合实战! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:吳忠強,東北大學,Datawhale成員

一、GBDT+LR簡介

協(xié)同過濾和矩陣分解存在的劣勢就是僅利用了用戶與物品相互行為信息進行推薦, 忽視了用戶自身特征, 物品自身特征以及上下文信息等,導致生成的結(jié)果往往會比較片面。而這次介紹的這個模型是2014年由Facebook提出的GBDT+LR模型, 該模型利用GBDT自動進行特征篩選和組合, 進而生成新的離散特征向量, 再把該特征向量當做LR模型的輸入, 來產(chǎn)生最后的預測結(jié)果, 該模型能夠綜合利用用戶、物品和上下文等多種不同的特征, 生成較為全面的推薦結(jié)果, 在CTR點擊率預估場景下使用較為廣泛。

下面首先會介紹邏輯回歸和GBDT模型各自的原理及優(yōu)缺點, 然后介紹GBDT+LR模型的工作原理和細節(jié)。

二、邏輯回歸模型

邏輯回歸模型非常重要, 在推薦領(lǐng)域里面, 相比于傳統(tǒng)的協(xié)同過濾, 邏輯回歸模型能夠綜合利用用戶、物品、上下文等多種不同的特征生成較為“全面”的推薦結(jié)果, 關(guān)于邏輯回歸的更多細節(jié), 可以參考下面給出的鏈接,這里只介紹比較重要的一些細節(jié)和在推薦中的應用。

邏輯回歸是在線性回歸的基礎(chǔ)上加了一個 Sigmoid 函數(shù)(非線形)映射,使得邏輯回歸成為了一個優(yōu)秀的分類算法, 學習邏輯回歸模型, 首先應該記住一句話:邏輯回歸假設(shè)數(shù)據(jù)服從伯努利分布,通過極大化似然函數(shù)的方法,運用梯度下降來求解參數(shù),來達到將數(shù)據(jù)二分類的目的。

相比于協(xié)同過濾和矩陣分解利用用戶的物品“相似度”進行推薦, 邏輯回歸模型將問題看成了一個分類問題, 通過預測正樣本的概率對物品進行排序。這里的正樣本可以是用戶“點擊”了某個商品或者“觀看”了某個視頻, 均是推薦系統(tǒng)希望用戶產(chǎn)生的“正反饋”行為, 因此邏輯回歸模型將推薦問題轉(zhuǎn)化成了一個點擊率預估問題。而點擊率預測就是一個典型的二分類, 正好適合邏輯回歸進行處理, 那么邏輯回歸是如何做推薦的呢?過程如下:

  • 將用戶年齡、性別、物品屬性、物品描述、當前時間、當前地點等特征轉(zhuǎn)成數(shù)值型向量

  • 確定邏輯回歸的優(yōu)化目標,比如把點擊率預測轉(zhuǎn)換成二分類問題, 這樣就可以得到分類問題常用的損失作為目標, 訓練模型

  • 在預測的時候, 將特征向量輸入模型產(chǎn)生預測, 得到用戶“點擊”物品的概率

  • 利用點擊概率對候選物品排序, 得到推薦列表

  • 推斷過程可以用下圖來表示:

    這里的關(guān)鍵就是每個特征的權(quán)重參數(shù), 我們一般是使用梯度下降的方式, 首先會先隨機初始化參數(shù), 然后將特征向量(也就是我們上面數(shù)值化出來的特征)輸入到模型, 就會通過計算得到模型的預測概率, 然后通過對目標函數(shù)求導得到每個的梯度, 然后進行更新

    這里的目標函數(shù)長下面這樣:

    求導之后的方式長這樣:

    這樣通過若干次迭代, 就可以得到最終的了, 關(guān)于這些公式的推導,可以參考下面給出的文章鏈接, 下面我們分析一下邏輯回歸模型的優(yōu)缺點。

    優(yōu)點:

  • LR模型形式簡單,可解釋性好,從特征的權(quán)重可以看到不同的特征對最后結(jié)果的影響。

  • 訓練時便于并行化,在預測時只需要對特征進行線性加權(quán),所以性能比較好,往往適合處理海量id類特征,用id類特征有一個很重要的好處,就是防止信息損失(相對于范化的 CTR 特征),對于頭部資源會有更細致的描述

  • 資源占用小,尤其是內(nèi)存。在實際的工程應用中只需要存儲權(quán)重比較大的特征及特征對應的權(quán)重。

  • 方便輸出結(jié)果調(diào)整。邏輯回歸可以很方便的得到最后的分類結(jié)果,因為輸出的是每個樣本的概率分數(shù),我們可以很容易的對這些概率分數(shù)進行cutoff,也就是劃分閾值(大于某個閾值的是一類,小于某個閾值的是一類)

  • 當然, 邏輯回歸模型也有一定的局限性

  • 表達能力不強, 無法進行特征交叉, 特征篩選等一系列“高級“操作(這些工作都得人工來干, 這樣就需要一定的經(jīng)驗, 否則會走一些彎路), 因此可能造成信息的損失

  • 準確率并不是很高。因為這畢竟是一個線性模型加了個sigmoid, 形式非常的簡單(非常類似線性模型),很難去擬合數(shù)據(jù)的真實分布

  • 處理非線性數(shù)據(jù)較麻煩。邏輯回歸在不引入其他方法的情況下,只能處理線性可分的數(shù)據(jù), 如果想處理非線性, 首先對連續(xù)特征的處理需要先進行離散化(離散化的目的是為了引入非線性),如上文所說,人工分桶的方式會引入多種問題。

  • LR 需要進行人工特征組合,這就需要開發(fā)者有非常豐富的領(lǐng)域經(jīng)驗,才能不走彎路。這樣的模型遷移起來比較困難,換一個領(lǐng)域又需要重新進行大量的特征工程。

  • 所以如何自動發(fā)現(xiàn)有效的特征、特征組合,彌補人工經(jīng)驗不足,縮短LR特征實驗周期,是亟需解決的問題, 而GBDT模型, 正好可以自動發(fā)現(xiàn)特征并進行有效組合。注:在Datawhale公眾號后臺回復【數(shù)據(jù)項目】可進項目專欄群,和作者等一起學習交流。

    三、GBDT模型

    GBDT全稱梯度提升決策樹,在傳統(tǒng)機器學習算法里面是對真實分布擬合的最好的幾種算法之一,在前幾年深度學習還沒有大行其道之前,gbdt在各種競賽是大放異彩。原因大概有幾個,一是效果確實挺不錯。二是即可以用于分類也可以用于回歸。三是可以篩選特征, 所以這個模型依然是一個非常重要的模型。

    GBDT是通過采用加法模型(即基函數(shù)的線性組合),以及不斷減小訓練過程產(chǎn)生的誤差來達到將數(shù)據(jù)分類或者回歸的算法, 其訓練過程如下:

    ? ?

    gbdt通過多輪迭代, 每輪迭代會產(chǎn)生一個弱分類器, 每個分類器在上一輪分類器的殘差基礎(chǔ)上進行訓練。gbdt對弱分類器的要求一般是足夠簡單, 并且低方差高偏差。因為訓練的過程是通過降低偏差來不斷提高最終分類器的精度。由于上述高偏差和簡單的要求,每個分類回歸樹的深度不會很深。最終的總分類器是將每輪訓練得到的弱分類器加權(quán)求和得到的(也就是加法模型)。

    關(guān)于GBDT的詳細細節(jié),依然是可以參考下面給出的鏈接。這里想分析一下GBDT如何來進行二分類的,因為我們要明確一點就是gbdt 每輪的訓練是在上一輪的訓練的殘差基礎(chǔ)之上進行訓練的, 而這里的殘差指的就是當前模型的負梯度值, 這個就要求每輪迭代的時候,弱分類器的輸出的結(jié)果相減是有意義的, 而gbdt 無論用于分類還是回歸一直都是使用的CART 回歸樹, 那么既然是回歸樹, 是如何進行二分類問題的呢?

    GBDT 來解決二分類問題和解決回歸問題的本質(zhì)是一樣的,都是通過不斷構(gòu)建決策樹的方式,使預測結(jié)果一步步的接近目標值, 但是二分類問題和回歸問題的損失函數(shù)是不同的, 關(guān)于GBDT在回歸問題上的樹的生成過程, 損失函數(shù)和迭代原理可以參考給出的鏈接, 回歸問題中一般使用的是平方損失, 而二分類問題中, GBDT和邏輯回歸一樣, 使用的下面這個:

    其中,?是第個樣本的觀測值, 取值要么是0要么是1, 而是第個樣本的預測值, 取值是0-1之間的概率,由于我們知道GBDT擬合的殘差是當前模型的負梯度, 那么我們就需要求出這個模型的導數(shù), 即, 對于某個特定的樣本, 求導的話就可以只考慮它本身, 去掉加和號, 那么就變成了, 其中如下:

    如果對邏輯回歸非常熟悉的話, ?一定不會陌生吧, 這就是對幾率比取了個對數(shù), 并且在邏輯回歸里面這個式子會等于, 所以才推出了的那個形式。這里令, 即, 則上面這個式子變成了:

    這時候,我們對求導, 得

    這樣, 我們就得到了某個訓練樣本在當前模型的梯度值了, 那么殘差就是。GBDT二分類的這個思想,其實和邏輯回歸的思想一樣,邏輯回歸是用一個線性模型去擬合這個事件的對數(shù)幾率, GBDT二分類也是如此, 用一系列的梯度提升樹去擬合這個對數(shù)幾率, 其分類模型可以表達為:

    下面我們具體來看GBDT的生成過程, 構(gòu)建分類GBDT的步驟有兩個:

    1. 初始化GBDT

    和回歸問題一樣, 分類 GBDT 的初始狀態(tài)也只有一個葉子節(jié)點,該節(jié)點為所有樣本的初始預測值,如下:

    上式里面,?代表GBDT模型,?是模型的初識狀態(tài), 該式子的意思是找到一個,使所有樣本的 Loss 最小,在這里及下文中,都表示節(jié)點的輸出,即葉子節(jié)點, 且它是一個?形式的值(回歸值),在初始狀態(tài),。

    下面看例子(該例子來自下面的第二個鏈接), 假設(shè)我們有下面3條樣本:

    我們希望構(gòu)建 GBDT 分類樹,它能通過「喜歡爆米花」、「年齡」和「顏色偏好」這 3 個特征來預測某一個樣本是否喜歡看電影。 我們把數(shù)據(jù)代入上面的公式中求Loss:

    為了令其最小, 我們求導, 且讓導數(shù)為0, 則:

    于是, 就得到了初始值, 模型的初識狀態(tài)

    2. 循環(huán)生成決策樹

    這里回憶一下回歸樹的生成步驟, 其實有4小步, 第一就是計算負梯度值得到殘差, 第二步是用回歸樹擬合殘差, 第三步是計算葉子節(jié)點的輸出值, 第四步是更新模型。下面我們一一來看:

    計算負梯度得到殘差:

    此處使用棵樹的模型, 計算每個樣本的殘差, 就是上面的, 于是例子中, 每個樣本的殘差:

    使用回歸樹來擬合, 這里的表示樣本哈,回歸樹的建立過程可以參考下面的鏈接文章,簡單的說就是遍歷每個特征, 每個特征下遍歷每個取值, 計算分裂后兩組數(shù)據(jù)的平方損失, 找到最小的那個劃分節(jié)點。假如我們產(chǎn)生的第2棵決策樹如下:

    對于每個葉子節(jié)點, 計算最佳殘差擬合值

    意思是, 在剛構(gòu)建的樹中, 找到每個節(jié)點的輸出, 能使得該節(jié)點的loss最小。那么我們看一下這個的求解方式, 這里非常的巧妙。首先, 我們把損失函數(shù)寫出來, 對于左邊的第一個樣本, 有

    這個式子就是上面推導的, 因為我們要用回歸樹做分類, 所以這里把分類的預測概率轉(zhuǎn)換成了對數(shù)幾率回歸的形式, 即, 這個就是模型的回歸輸出值。而如果求這個損失的最小值, 我們要求導, 解出令損失最小的。但是上面這個式子求導會很麻煩, 所以這里介紹了一個技巧就是使用二階泰勒公式來近似表示該式, 再求導, 還記得偉大的泰勒嗎?

    這里就相當于把當做常量,?作為變量, 將二階展開:

    這時候再求導就簡單了

    Loss最小的時候, 上面的式子等于0, 就可以得到:

    因為分子就是殘差(上述已經(jīng)求到了), 分母可以通過對殘差求導,得到原損失函數(shù)的二階導:

    這時候, 就可以算出該節(jié)點的輸出:

    這里的下面表示第棵樹的第個葉子節(jié)點。接下來是右邊節(jié)點的輸出, 包含樣本2和樣本3, 同樣使用二階泰勒公式展開:

    求導, 令其結(jié)果為0,就會得到, 第1棵樹的第2個葉子節(jié)點的輸出:

    可以看出, 對于任意葉子節(jié)點, 我們可以直接計算其輸出值:

    最后,更新模型:

    這樣, 通過多次循環(huán)迭代, 就可以得到一個比較強的學習器。

    下面分析一下GBDT的優(yōu)缺點:

    我們可以把樹的生成過程理解成自動進行多維度的特征組合的過程,從根結(jié)點到葉子節(jié)點上的整個路徑(多個特征值判斷),才能最終決定一棵樹的預測值, 另外,對于連續(xù)型特征的處理,GBDT 可以拆分出一個臨界閾值,比如大于 0.027 走左子樹,小于等于 0.027(或者 default 值)走右子樹,這樣很好的規(guī)避了人工離散化的問題。這樣就非常輕松的解決了邏輯回歸那里自動發(fā)現(xiàn)特征并進行有效組合的問題, 這也是GBDT的優(yōu)勢所在。

    但是GBDT也會有一些局限性, 對于海量的 id 類特征,GBDT 由于樹的深度和棵樹限制(防止過擬合),不能有效的存儲;另外海量特征在也會存在性能瓶頸,當 GBDT 的 one hot 特征大于 10 萬維時,就必須做分布式的訓練才能保證不爆內(nèi)存。所以 GBDT 通常配合少量的反饋 CTR 特征來表達,這樣雖然具有一定的范化能力,但是同時會有信息損失,對于頭部資源不能有效的表達。

    所以, 我們發(fā)現(xiàn)其實GBDT和LR的優(yōu)缺點可以進行互補

    四、GBDT+LR模型

    2014年, Facebook提出了一種利用GBDT自動進行特征篩選和組合, 進而生成新的離散特征向量, 再把該特征向量當做LR模型的輸入, 來產(chǎn)生最后的預測結(jié)果, 這就是著名的GBDT+LR模型了。GBDT+LR 使用最廣泛的場景是CTR點擊率預估,即預測當給用戶推送的廣告會不會被用戶點擊。

    有了上面的鋪墊, 這個模型解釋起來就比較容易了, 模型的總體結(jié)構(gòu)長下面這樣:

    ? ?

    訓練時,GBDT 建樹的過程相當于自動進行的特征組合和離散化,然后從根結(jié)點到葉子節(jié)點的這條路徑就可以看成是不同特征進行的特征組合,用葉子節(jié)點可以唯一的表示這條路徑,并作為一個離散特征傳入 LR 進行二次訓練。

    比如上圖中, 有兩棵樹,x為一條輸入樣本,遍歷兩棵樹后,x樣本分別落到兩顆樹的葉子節(jié)點上,每個葉子節(jié)點對應LR一維特征,那么通過遍歷樹,就得到了該樣本對應的所有LR特征。構(gòu)造的新特征向量是取值0/1的。比如左樹有三個葉子節(jié)點,右樹有兩個葉子節(jié)點,最終的特征即為五維的向量。對于輸入x,假設(shè)他落在左樹第二個節(jié)點,編碼[0,1,0],落在右樹第二個節(jié)點則編碼[0,1],所以整體的編碼為[0,1,0,0,1],這類編碼作為特征,輸入到線性分類模型(LR or FM)中進行分類。

    預測時,會先走 GBDT 的每棵樹,得到某個葉子節(jié)點對應的一個離散特征(即一組特征組合),然后把該特征以 one-hot 形式傳入 LR 進行線性加權(quán)預測。

    這個方案應該比較簡單了, 下面有幾個關(guān)鍵的點我們需要了解:

  • 通過GBDT進行特征組合之后得到的離散向量是和訓練數(shù)據(jù)的原特征一塊作為邏輯回歸的輸入, 而不僅僅全是這種離散特征

  • 建樹的時候用ensemble建樹的原因就是一棵樹的表達能力很弱,不足以表達多個有區(qū)分性的特征組合,多棵樹的表達能力更強一些。GBDT每棵樹都在學習前面棵樹尚存的不足,迭代多少次就會生成多少棵樹。

  • RF也是多棵樹,但從效果上有實踐證明不如GBDT。且GBDT前面的樹,特征分裂主要體現(xiàn)對多數(shù)樣本有區(qū)分度的特征;后面的樹,主要體現(xiàn)的是經(jīng)過前N顆樹,殘差仍然較大的少數(shù)樣本。優(yōu)先選用在整體上有區(qū)分度的特征,再選用針對少數(shù)樣本有區(qū)分度的特征,思路更加合理,這應該也是用GBDT的原因。

  • 在CRT預估中, GBDT一般會建立兩類樹(非ID特征建一類, ID類特征建一類), AD,ID類特征在CTR預估中是非常重要的特征,直接將AD,ID作為feature進行建樹不可行,故考慮為每個AD,ID建GBDT樹。

    • 非ID類樹:不以細粒度的ID建樹,此類樹作為base,即便曝光少的廣告、廣告主,仍可以通過此類樹得到有區(qū)分性的特征、特征組合

    • ID類樹:以細粒度 的ID建一類樹,用于發(fā)現(xiàn)曝光充分的ID對應有區(qū)分性的特征、特征組合。

    五、編程實踐

    下面我們通過kaggle上的一個ctr預測的比賽來看一下GBDT+LR模型部分的編程實踐, 數(shù)據(jù)來源:https://github.com/zhongqiangwu960812/AI-RecommenderSystem/tree/master/GBDT%2BLR/data

    我們回顧一下上面的模型架構(gòu), 首先是要訓練GBDT模型, GBDT的實現(xiàn)一般可以使用xgboost, 或者lightgbm。訓練完了GBDT模型之后, 我們需要預測出每個樣本落在了哪棵樹上的哪個節(jié)點上, 然后通過one-hot就會得到一些新的離散特征, 這和原來的特征進行合并組成新的數(shù)據(jù)集, 然后作為邏輯回歸的輸入,最后通過邏輯回歸模型得到結(jié)果。

    根據(jù)上面的步驟, 我們看看代碼如何實現(xiàn):

    假設(shè)我們已經(jīng)有了處理好的數(shù)據(jù)x_train, y_train。

    1. 訓練GBDT模型

    GBDT模型的搭建我們可以通過XGBOOST, lightgbm等進行構(gòu)建。比如:

    gbm = lgb.LGBMRegressor(objective='binary',subsample= 0.8,min_child_weight= 0.5,colsample_bytree= 0.7,num_leaves=100,max_depth = 12,learning_rate=0.05,n_estimators=10,)gbm.fit(x_train, y_train,eval_set = [(x_train, y_train), (x_val, y_val)],eval_names = ['train', 'val'],eval_metric = 'binary_logloss',# early_stopping_rounds = 100,)

    2. 特征轉(zhuǎn)換并構(gòu)建新的數(shù)據(jù)集

    通過上面我們建立好了一個gbdt模型, 我們接下來要用它來預測出樣本會落在每棵樹的哪個葉子節(jié)點上, 為后面的離散特征構(gòu)建做準備, 由于不是用gbdt預測結(jié)果而是預測訓練數(shù)據(jù)在每棵樹上的具體位置, 就需要用到下面的語句:

    model = gbm.booster_ # 獲取到建立的樹# 每個樣本落在每個樹的位置 , 下面兩個是矩陣 (樣本個數(shù), 樹的棵樹) , 每一個數(shù)字代表某個樣本落在了某個數(shù)的哪個葉子節(jié)點 gbdt_feats_train = model.predict(train, pred_leaf = True) gbdt_feats_test = model.predict(test, pred_leaf = True)# 把上面的矩陣轉(zhuǎn)成新的樣本-特征的形式, 與原有的數(shù)據(jù)集合并 gbdt_feats_name = ['gbdt_leaf_' + str(i) for i in range(gbdt_feats_train.shape[1])] df_train_gbdt_feats = pd.DataFrame(gbdt_feats_train, columns = gbdt_feats_name) df_test_gbdt_feats = pd.DataFrame(gbdt_feats_test, columns = gbdt_feats_name)# 構(gòu)造新數(shù)據(jù)集 train = pd.concat([train, df_train_gbdt_feats], axis = 1) test = pd.concat([test, df_test_gbdt_feats], axis = 1) train_len = train.shape[0] data = pd.concat([train, test])

    3. 離散特征的獨熱編碼,并劃分數(shù)據(jù)集

    # 新數(shù)據(jù)的新特征進行讀入編碼 for col in gbdt_feats_name:onehot_feats = pd.get_dummies(data[col], prefix = col)data.drop([col], axis = 1, inplace = True)data = pd.concat([data, onehot_feats], axis = 1)# 劃分數(shù)據(jù)集 train = data[: train_len] test = data[train_len:]x_train, x_val, y_train, y_val = train_test_split(train, target, test_size = 0.3, random_state = 2018)

    4. 訓練邏輯回歸模型作最后的預測

    # 訓練邏輯回歸模型 lr = LogisticRegression() lr.fit(x_train, y_train) tr_logloss = log_loss(y_train, lr.predict_proba(x_train)[:, 1]) print('tr-logloss: ', tr_logloss) val_logloss = log_loss(y_val, lr.predict_proba(x_val)[:, 1]) print('val-logloss: ', val_logloss)# 預測 y_pred = lr.predict_proba(test)[:, 1]

    上面我們就完成了GBDT+LR模型的基本訓練步驟, 具體詳細的代碼可以參考鏈接。

    六、課后思考

  • 為什么使用集成的決策樹?為什么使用GBDT構(gòu)建決策樹而不是隨機森林?

  • 面對高維稀疏類特征的時候(比如ID類特征), 邏輯回歸一般要比GBDT這種非線性模型好, 為什么?

  • 參考資料

    • 王喆 - 《深度學習推薦系統(tǒng)》

    • 決策樹之 GBDT 算法 - 分類部分

    • 深入理解GBDT二分類算法

    • 邏輯回歸、優(yōu)化算法和正則化的幕后細節(jié)補充

    • 梯度提升樹GBDT的理論學習與細節(jié)補充

    • 推薦系統(tǒng)遇上深度學習(十)--GBDT+LR融合方案實戰(zhàn)

    • CTR預估中GBDT與LR融合方案

    • GBDT+LR算法解析及Python實現(xiàn)

    • 常見計算廣告點擊率預估算法總結(jié)

    • GBDT--分類篇

    論文

    • http://quinonero.net/Publications/predicting-clicks-facebook.pdf

    • Predicting Clicks: Estimating the Click-Through Rate for New Ads\

    • Greedy Fun tion Approximation : A Gradient Boosting

    后臺回復【數(shù)據(jù)項目】可進項目專欄群,和作者等一起學習交流。

    “整理不易,三連

    總結(jié)

    以上是生活随笔為你收集整理的【机器学习基础】逻辑回归 + GBDT模型融合实战!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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