推薦系統面試題之機器學習(一) -----樹模型

1. 簡單介紹一下XGB
2. XGBoost爲什麼使用泰勒二階展開?爲什麼用二階信息不用一階?
3. XGBoost在什麼地方做的剪枝,怎麼做的?
4. XGBoost如何分佈式?特徵分佈式和數據分佈式? 各有什麼存在的問題?
5. XGBoost裏處理缺失值的方法?
6. XGBoost有那些優化?
7. XGBoost如何尋找最優特徵?是又放回還是無放回的呢?
9. GBDT和XGBoost的區別是什麼?
10. lightgbm和xgboost有什麼區別?他們的loss一樣麼? 算法層面有什麼區別?
12. 比較一下LR和GBDT?GBDT在什麼情況下比邏輯迴歸算法要差?
13. RF和GBDT的區別;RF怎麼解決的過擬合問題;
15. 怎麼理解決策樹、xgboost能處理缺失值?而有的模型(svm)對缺失值比較敏感?
16. 隨機森林是怎樣避免ID3算法信息增益的缺點的?
17. gbdt對標量特徵要不要onehot編碼?
18. CART爲什麼選擇基尼係數作爲特徵選擇標準 ?
19. 如何解決類別不平衡問題?
20. GBDT 如何用於分類 ?

1. 簡單介紹一下XGB?

Xgboost由很多分類和迴歸樹組成,採用boosting集成學習,集成學習是指用某種策略將多個分類器預測的結果集成起來,作爲最終的預測結果,有boost和bagging兩種方法(boosting 各分類器之間有依賴關係,bagging各分類器之間沒有依賴關係,可並行),boosting分爲兩種,一種是AdaBoost(自適應增強)(前一個分類器分錯/分對的樣本的權值會得到加強/降低,加權後的全體樣本再次被用來訓練下一個基本分類器),一種是GBDT,GBDT的每一次計算都爲了減少上一次的殘差,進而在負梯度的方向上建立一個新的模型,而XGB採用的就是GBDT的形式,XGB的本質上還是一個GBDT,但是在速度和效率都發揮到了極致。XGB和GBDT比較大的不同就是目標函數的定義,XGB使用泰勒展開來近似目標函數
在這裏插入圖片描述
目標函數分爲兩個部分:誤差函數(logistic損失函數、平方損失函數)和正則化項(定義模型的複雜度) 在這裏插入圖片描述(葉子結點儘量少,節點數值w不極端)
將目標函數化簡之後,目標函數只依賴於一階導數g和二階導數h
(將目標函數和正則化項結合化簡,對w進行求導,求出最優w,代入目標函數中)
在這裏插入圖片描述
在這裏插入圖片描述
這個分數越小,代表樹的結構越好

在構建樹的過程中,XGBoost使用貪心+二次優化,從樹深度0開始,每一個節點都遍歷所有的特徵,對每個特徵進行分割,選取增益最好的那個特徵,增益的計算使用了優化後object中的部分,並且引入了葉子節點的懲罰項。

2. XGBoost爲什麼使用泰勒二階展開?爲什麼用二階信息不用一階?
(1) 由於之前求最優解的過程只是對平方損失函數進行的,一階殘差,二階常數,當損失函數是其它函數時,展開就沒有這種形式了,爲了能夠有個統一的形式,使用泰勒二階展開。爲了統一損失函數求導的形式以支持自定義損失函數
(2) 二階信息本身能夠讓梯度收斂的更快更準確(優化算法中牛頓法證實)可以簡單認爲一階導數引導梯度方向,二階導數引導梯度方向如何變化。

3. XGBoost在什麼地方做的剪枝,怎麼做的?
(1) 目標函數時,使用葉子的數目和w l2模的平方,控制模型的複雜度
(2) 在分裂節點的計算增益中,定義了一個閾值,當增益大於閾值才分裂
XGBoost 先從頂到底建立樹直到最大深度,再從底到頂反向檢查是否有不滿足分裂條件的結點,進行剪枝。

4. XGBoost如何分佈式?特徵分佈式和數據分佈式? 各有什麼存在的問題?
XGBoost在訓練之前,預先對數據按列進行排序,然後保存block結構。(1)特徵分佈式/特徵間並行:由於將數據按列存儲,可以同時訪問所有列,那麼可以對所有屬性同時執行split finding算法,從而並行化split finding(切分點尋找);(2)數據分佈式/特徵內並行:可以用多個block(Multiple blocks)分別存儲不同的樣本集,多個block可以並行計算。
問題:(1)不能從本質上減少計算量;(2)通訊代價高。

5. XGBoost裏處理缺失值的方法?
xgboost模型卻能夠處理缺失值,也就是說模型允許缺失值存在。論文中關於缺失值的處理與稀疏矩陣的處理看作一樣。在分裂節點的時候不會對缺失值遍歷,減少開銷。會分別將缺失值分配到左節點和右節點兩種情形,計算增益後懸着增益大的方向進行分裂。如果訓練期間沒有缺失值,預測時候有,自動將缺失值劃分到右子樹。

6. XGBoost有那些優化?
1、步長,和GBDT一樣,XGB也可以加入步長,防止過擬合 在這裏插入圖片描述
2、行、列抽樣
3、列排序優化
分裂的時候需要對當前特徵進行排序,只需要在初始化時定義一個n*m的矩陣,以後可以通過索引的方式進行
4、緩存優化
原因:使用block結構的缺點:取梯度的時候是通過索引來獲得的,非連續的內存訪問,使得CPU cache緩存命中率低,影響算法效率
使用緩存預取,每個線程分配一個連續的buffer,讀取梯度信息並存入Buffer中(實現了非連續到連續的轉化)
5、(近似算法)特徵選擇優化
貪心算法,當數據量很大的時候,不能全部放入內存,使用近似算法
(1) 如何選取候選切分點Sk={sk1,sk2,⋯skl}呢?
(2) 什麼時候進行候選切分點的選取?
可以採用分位數,(簡單分位數,採用幾分位就將數據平均分爲幾份)XGB使用二階導h加權分位數
在這裏插入圖片描述
爲什麼是h不是g?
在這裏插入圖片描述
採樣方式分爲兩個,一個global模式,一個local模式。
Global模式:每顆樹生成前採一次樣
Local模式:每次split之後都進行一次採樣
在這裏插入圖片描述

7. XGBoost如何尋找最優特徵?是又放回還是無放回的呢?
XGBoost在訓練的過程中給出各個特徵的評分,從而表明每個特徵對模型訓練的重要性.。XGB屬於boosting集成學習方法,樣本是不放回的,每輪計算樣本不重複。另外,XGB支持子採樣,每輪計算不使用全部樣本,減少過擬合。XGB支持列採樣,提高計算速度又減少過擬合。

9. GBDT和XGBoost的區別是什麼?
xgboost類似於gbdt的優化版,不論是精度還是效率上都有了提升。與gbdt相比,具體的優點有:
1.損失函數是用泰勒展式二項逼近,而不是像gbdt裏的就是一階導數
2.對樹的結構進行了正則化約束,防止模型過度複雜,降低了過擬合的可能性
3.節點分裂的方式不同,gbdt是用的平方差,xgboost是經過優化推導後的

10. lightgbm和xgboost有什麼區別?他們的loss一樣麼? 算法層面有什麼區別?
1、 XGB採用level-wise的分裂策略,LGB採用leaf-wise的策略,XGB對每一層所有節點做無差別分裂,但是可能有些節點增益非常小,對結果影響不大,帶來不必要的開銷。Leaf-wise是在所有葉子節點中選取分裂收益最大的節點進行的,但是很容易出現過擬合問題,所以需要對最大深度做限制
2、 XGB使用近似算法,LGB使用基於立方圖的決策算法,histogram算法在內存和計算代價上都有不小的優勢。

內存上:
直方圖算法的內存消耗爲(#data* #features * 1Bytes)(因爲對特徵分桶後只需保存特徵離散化之後的值) xgboost的exact算法內存消耗爲:(2 * #data * #features* 4Bytes),因爲xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。
計算上:
預排序算法在選擇好分裂特徵計算分裂收益時,需要遍歷所有樣本的特徵值,時間爲(#data), 直方圖只需要遍歷桶就行,時間爲(#data)
3、 LGB可以使用直方圖做差加速,一個節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算
4、 XGBoost無法直接輸入類別型變量,因此需要事先對類別型變量進行編碼(例如獨熱編碼);LightGBM可以直接處理類別型變量。
5、 但實際上xgboost的近似直方圖算法也類似於lightgbm這裏的直方圖算法,爲什麼xgboost的近似算法比lightgbm還是慢很多呢?
xgboost在每一層都動態構建直方圖, 因爲xgboost的直方圖算法不是針對某個特定的feature,而是所有feature共享一個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特徵都有一個直方圖,所以構建一次直方圖就夠了。
6、 LightGBM 與 XGboost 的並行策略
特徵並行
LGB特徵並行的前提是每個worker留有一份完整的數據集,但是每個worker僅在特徵子集上進行最佳切分點的尋找;worker之間需要相互通信,通過比對損失來確定最佳切分點;然後將這個最佳切分點的位置進行全局廣播,每個worker進行切分即可。
XGB的特徵並行與LGB的最大不同在於XGB每個worker節點中僅有部分的列數據,也就是垂直切分,每個worker尋找局部最佳切分點,worker之間相互通信,然後在具有最佳切分點的worker上進行節點分裂,再由這個節點廣播一下被切分到左右節點的樣本索引號,其他worker才能開始分裂。
二者的區別就導致了LGB中worker間通信成本明顯降低,只需通信一個特徵分裂點即可,而XGB中要廣播樣本索引。

數據並行
當數據量很大,特徵相對較少時,可採用數據並行策略。LGB中先對數據水平切分,每個worker上的數據先建立起局部的直方圖,然後合併成全局的直方圖,採用直方圖相減的方式,先計算樣本量少的節點的樣本索引,然後直接相減得到另一子節點的樣本索引,這個直方圖算法使得worker間的通信成本降低一倍,因爲只用通信以此樣本量少的節點。XGB中的數據並行也是水平切分,然後單個worker建立局部直方圖,再合併爲全局,不同在於根據全局直方圖進行各個worker上的節點分裂時會單獨計算子節點的樣本索引,因此效率賊慢,每個worker間的通信量也就變得很大。
投票並行(LGB)
當數據量和維度都很大時,選用投票並行,該方法是數據並行的一個改進。數據並行中的合併直方圖的代價相對較大,尤其是當特徵維度很大時。
大致思想是:每個worker首先會找到本地的一些優秀的特徵,然後進行全局投票,根據投票結果,選擇top的特徵進行直方圖的合併,再尋求全局的最優分割點。

12. 比較一下LR和GBDT?GBDT在什麼情況下比邏輯迴歸算法要差?
1、 LR是線性模型,具有很好的解釋性,很容易並行化,處理億條訓練數據不是問題,但是學習能力有限,需要大量的特徵工程;GBDT可以處理線性和非線性的數據,具有天然優勢進行特徵組合
2、 LR可以很好的利用正則化解決稀疏性問題(lr 等線性模型的正則項是對權重的懲罰,也就是 W1一旦過大,懲罰就會很大,進一步壓縮 W1的值,使他不至於過大,而樹模型則不一樣,樹模型的懲罰項通常爲葉子節點數和深度等,而我們都知道,對於上面這種 case,樹只需要一個節點就可以完美分割9990和10個樣本,懲罰項極其之小)

13. RF和GBDT的區別;RF怎麼解決的過擬合問題;
相同點:都是由多棵樹組成,最終的結果都是由多棵樹一起決定。
不同點:
組成隨機森林的樹可以分類樹也可以是迴歸樹,而GBDT只由迴歸樹組成
組成隨機森林的樹可以並行生成,而GBDT是串行生成
隨機森林的結果是多數表決表決的,而GBDT則是多棵樹累加之和
隨機森林對異常值不敏感,而GBDT對異常值比較敏感
隨機森林是減少模型的方差,而GBDT是減少模型的偏差
隨機森林不需要進行特徵歸一化,而GBDT則需要進行特徵歸一化

15. 怎麼理解決策樹、xgboost能處理缺失值?而有的模型(svm)對缺失值比較敏感?
https://www.zhihu.com/question/58230411
決策樹(隨機森林)(1)使用對應類別中位數(數值)和出現次數最多的數(描述型變量)代替(2)也是中位數和出現次數最多的數進行替換,引入了權重(替換數據和其它數據的相似度計算)
第二種效果好,但是費時,所以一般工具包不提供補全功能,影響工具包效率
XGB上面有

涉及到距離度量的模型,當缺失值處理不當會導致效果很差(KNN,SVM)
數據量很小,用樸素貝葉斯
數據量適中或者較大,用樹模型,優先 xgboost
數據量較大,也可以用神經網絡
避免使用距離度量相關的模型,如KNN和SVM

16. 隨機森林是怎樣避免ID3算法信息增益的缺點的?
首先說下信息增益的過程,決策樹算法本質上就是要找出每一列的最佳劃分以及不同列劃分的先後順序及排布。信息增益的缺點是比較偏向選擇取值多的屬性。而gini係數每次都是二分,所以跟屬性多少沒有關係。

17. gbdt對標量特徵要不要onehot編碼?
我們已知的處理category特徵的方法細分有3類。
(1) 轉化成數值型
比如[“low”,“middle”,“high”],映射成[1,2,3],某種程度上是合理的,因爲確實有大小關係。
再比如[‘red’,‘green’,‘blue’],映射成 [1,2,3],就不太合理
(2) 直接作爲category特徵
比如顏色的feature,就是有[‘red’,‘green’,‘blue’]三種取值,那麼在Mart中做分裂時,是用 (屬於“red”) / (不屬於“red”) 來進行劃分並計算對應的gain,這和連續值的做法有明顯區別。
(3) 使用one-hot encoding
擴展成3個feature,[f_red, f_green, f_blue],每個feature的取值是{0,1},在Mart中分裂時當做連續特徵來做,因此分裂值可以是0.5,對於某個sample,如果它的f_red是1,那麼其它2位feature必然是0,因此在f_red上分裂,等價於2中用 (屬於“red”) / (不屬於“red”) 來分裂。

綜上,從效果的角度來講,2和3是等價的,所不同的是2的feature空間更小。微軟在lightGBM的文檔裏也說了,category特徵可以直接輸入,不需要one-hot編碼,準確度差不多,速度快8倍。而sklearn的tree方法在接口上不支持category輸入,所以只能用one-hot編碼。

18. CART爲什麼選擇基尼係數作爲特徵選擇標準 ?
基尼指數的意義是從數據集D中隨機抽取兩個樣本類別標識不一致的概率。基尼指數越小,數據集的純度越高。相比於信息增益,信息增益比等作爲特徵選擇方法,基尼指數省略了對數計算,運算量比較小,也比較容易理解。

19. 如何解決類別不平衡問題?
1、 對大類進行欠採樣(減少數據,或者分成不同數據集,使用多個模型),對小類進行過採樣(重複使用數據)
2、 閾值調整,將默認的0.5調整成 較少類別/(較少+較多)
3、 設置不同的學習率,大類權值小,小類權值大
4、 使用一些對樣本分佈不敏感的評價指標F1、AUC等
5、 可以嘗試不同的算法,決策樹(對不平衡數據表現不錯),集成算法
6、 可以對模型進行懲罰,增加正則項
7、 如果小類很小,可將問題轉化爲異常點檢測

20. GBDT 如何用於分類 ?
https://www.cnblogs.com/always-fight/p/9400346.html
GBDT無論用於分類還是迴歸一直使用的CART迴歸樹。假設樣本X總共有K = 3類[0,1,0],針對樣本X每個可能的類都訓練一個分類迴歸樹,每輪訓練中同時訓練K = 3課樹,對於每棵樹預測值
f_k (x)= ∑_(x∈R_1)▒〖y_1*I(x∈R_1 )+〗  ∑_(x∈R_2)▒〖y_2*I(x∈R_2 )  ,(y_1 y_2 是節點均值,I是屬於R_1 R_2 的節點數量〗),
使用softmax來產生概率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章