在前一階段的專案中用到了lgb,比起剛開始準備的xgb,結果告訴我lgb速度更快,且準確率更高,鑑於目前各大比賽或者面試中常考這兩種演算法,總結一下目前兩者耳朵區別和聯絡:
xgboost採用的是level-wise的**策略,而lightgbm採用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別**,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了**,帶來了務必要的開銷。 leaft-wise的做法是在當前所有葉子節點中選擇**收益最大的節點進行**,如此遞迴進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。
lightgbm使用了基於histogram的決策樹演算法,這一點不同與xgboost中的 exact 演算法,histogram演算法在記憶體和計算代價上都有不小優勢。
-. 記憶體上優勢:很明顯,直方圖演算法的記憶體消耗為(#data* #features * 1bytes)(因為對特徵分桶後只需儲存特徵離散化之後的值),而xgboost的exact演算法記憶體消耗為:(2 * #data * #features* 4bytes),因為xgboost既要儲存原始feature的值,也要儲存這個值的順序索引,這些值需要32位的浮點數來儲存。
-. 計算上的優勢,預排序演算法在選擇好**特徵計算**收益時需要遍歷所有樣本的特徵值,時間為(#data),而直方圖演算法只需要遍歷桶就行了,時間為(#bin)
直方圖做差加速
-. 乙個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。
lightgbm支援直接輸入categorical 的feature
-. 在對離散特徵**時,每個取值都當作乙個桶,**時的增益算的是」是否屬於某個category「的gain。類似於one-hot編碼。
但實際上xgboost的近似直方圖演算法也類似於lightgbm這裡的直方圖演算法,為什麼xgboost的近似演算法比lightgbm還是慢很多呢?
-. xgboost在每一層都動態構建直方圖, 因為xgboost的直方圖演算法不是針對某個特定的feature,而是所有feature共享乙個直方圖(每個樣本的權重是二階導),所以每一層都要重新構建直方圖,而lightgbm中對每個特徵都有乙個直方圖,所以構建一次直方圖就夠了。
-. lightgbm做了cache優化?
lightgbm哪些方面做了並行?
-. feature parallel
一般的feature parallel就是對資料做垂直分割(partiion data vertically,就是對屬性分割),然後將分割後的資料分散到各個workder上,各個workers計算其擁有的資料的best splits point, 之後再彙總得到全域性最優分割點。但是lightgbm說這種方法通訊開銷比較大,lightgbm的做法是每個worker都擁有所有資料,再分割?(沒懂,既然每個worker都有所有資料了,再彙總有什麼意義?這個並行體現在**??)
-. data parallel
傳統的data parallel是將對資料集進行劃分,也叫 平行分割(partion data horizontally), 分散到各個workers上之後,workers對得到的資料做直方圖,彙總各個workers的直方圖得到全域性的直方圖。 lightgbm也claim這個操作的通訊開銷較大,lightgbm的做法是使用」reduce scatter「機制,不彙總所有直方圖,只彙總不同worker的不同feature的直方圖(原理?),在這個彙總的直方圖上做split,最後同步。
和 區別和聯絡, 和 區別和聯絡
和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...
equals和 的區別和聯絡
比較方式 基本資料型別 比較數值 引用資料型別 比較記憶體位址是否相同 equals比較方式 引用物件。objec模擬較的是位址值,但是繼承他的類大都重寫了equals方法比較成員變數的值是否相同。例如 integer類 自定義類也可以重寫其中equals方法,比如比較兩個user物件是否相同,可以...
和equals的區別和聯絡
總結的來說 1 對於 比較的是值是否相等 如果作用於基本資料型別的變數,則直接比較其儲存的 值 是否相等 如果作用於引用型別的變數,則比較的是所指向的物件的位址 2 對於equals方法,注意 equals方法不能作用於基本資料型別的變數,所有類從object類中繼承equals方法,比較的是是否是...