catboost詳解
catboost簡介
catboost中處理類別特徵的方法
演算法實現
修正梯度偏差
快速評分
基於gpu快速學習
catboost的引數
catboost簡介
catboost: 基本原理類似於常規的gradient boosting演算法,只是在處理類別特徵時,效果較好。一方面,可以自動處理分類特徵,並且在訓練過程中處理這些類別特徵有優勢;另一方面,使用了一種新的方式計算leaf-values(可降低過擬合)。它有兩個版本,學習演算法基於gpu實現,打分演算法基於cpu實現。
categorical features: 類別特徵,catboost中專指不必相互比較的特徵,如城市名稱、使用者id等等。常規的操作是在訓練模型之前,將這些類別特徵轉換為數值型特徵,如one-hot編碼。而在catboost中,基於統計量,將類別特徵轉換為數值型特徵。
∑j=1n
[xj,k
=x
i,k ]∑
j=1n
[x
j,k
=xi,k
]∗yj
∑j=1
p−1 [xα
j ,k =xα
p ,k
]+α∑
j=1p−1
[xσj
,k
=xσp
,k
]∗yσj
+α∗p
其中,p pp代表優先順序,α>0 α>0α>0代表優先順序的權重係數。加入權重是乙個常規操作,並且可以降低類別特徵中來自於低頻次特徵帶來的雜訊。在回歸問題中,通過對資料集中的label value取均值來計算優先順序;在二分類問題中,通過基於正類樣本的先驗概率計算優先順序。
使用多序列也是有效的,但是對於多序列計算統計量的直接用法會導致過擬合,因此catboost使用乙個新奇方法使用多序列來計算leaf values。
3、特徵組合。對於幾個類別特徵的任意組合都可認為是乙個新的特徵。使用以上公式計算出來的數值型特徵,可能會丟失一些資訊,組合特徵可以解決這個問題並且可以得到乙個更有效的特徵。但是,特徵組合的數量會隨著類別特徵數量指數級增長,這在演算法中不被允許
當前樹中構建乙個新的分割時,catboost使用貪心方式考慮組合特徵。第一次分割時不考慮類別特徵的組合,之後的分割考慮所有的特徵組合,組合後的特徵就會變成數值型的。catboost還將所有分割後的兩組值作為類別型特徵參與後面的組合。
4、重要實施細節。另外一種代替類別特徵的方式是在資料集中計算該類別出現的次數。這種方式同樣適用於特徵組合。這是乙個簡單且高效的技術,並且catboost適用。
為了擬合最優的先驗值,考慮幾個先驗值,並為每個先驗值構造乙個特徵。
演算法實現
修正梯度偏差
catboost與其它梯度提公升演算法類似,它每構建一顆新樹,都會近似當前模型的梯度。但所有經典的boosting演算法都存在有偏的逐點梯度估計帶來的過擬合問題(這是由於每一層的梯度都是用已建立好的模型、用相同的資料估計得來的,而每個特徵空間上的分布與真實分布存在差異),因此catboost試圖修正梯度偏差以緩解過擬合。
構建一顆樹有兩個階段:第一,選擇樹結構;第二,在樹結構固定後計算葉節點的值。catboost在第二階段採用傳統的gbdt方法執行,而在第一階段採用修正的方法—即梯度步長的無偏估計。
令fi f^if
i為前i ii棵樹的結構模型(已構建好的),為了使gi(xk,yk) g^i(x_k,y_k)gi(x
k ,yk
)是關於模型fi f^if
i的無偏梯度,需要在訓練模型fi f^if
i時不使用樣本xk x_kxk
。由於需要所有訓練樣本的無偏梯度,照以上做法,將沒有樣本可用來訓練模型fi f^if
i。catboost使用了乙個技巧解決這個問題。
樣本集為nk=1 _^
k=1n
按隨機序列σ σσ排序,樹的棵樹為i ii。首先,對於樣本xk x_kxk
,初始化模型mk m_kmk
。其次,對於每一棵樹,遍歷每乙個樣本,對前k−1 k-1k−1個樣本,依次計算loss lossloss的梯度gi g_igi
;再次,將前k−1 k-1k−1個樣本的gj g_jgj
和xj x_jxj
(j=1,…,k−1 j=1,…,k-1j=1,…,k−1)用來構建模型m mm;最後,對每乙個樣本xk x_kxk
,用m mm來修正初始化的mk m_kmk
,這樣就可以得到乙個分隔的模型mk m_kmk
(並且這個模型不需要這個樣本用梯度估計來更新)。重複上述操作,就可以得到每乙個樣本x xx的分隔模型m mm。由此可見,每乙個mk m_kmk
都共享相同的樹結構。
在catboost中,構建樣本集的s ss個隨機序列來增強演算法的魯棒性。用不同的序列來訓練不同的模型,這將不會導致過擬合。對每乙個序列σ σσ,訓練n nn個模型mk m_kmk
(k=1,…,n k=1,…,nk=1,…,n),構建一棵樹的複雜度為o(n2) o(n^2)o(n
2),s ss個隨機序列的複雜度為o(sn2) o(sn^2)o(sn
2)。catboost降低複雜度(至o(sn) o(sn)o(sn))的乙個技巧是:對每乙個隨機序列,基於前2i 2^i2
i個樣本值近似樣本j jj的mi(xj) m_i(x_j)mi
(xj ),令為m′i(xj) m_i^(x_j)mi′
(xj
)(i=1,…,[log2(n)],j<2i+1 i=1,…,[log_2(n)],j<2^i=1,…,[log2
(n)],j<2
i+1),所以m′i(xj) m_i^(x_j)mi′
(xj
)的數量小於∑0≤i≤log2(n)2i+1<4n \sum_2^<4n∑
0≤i≤log2
(n)
2i+1
<4n。所以對於每乙個隨機序列,構建每一棵樹的的複雜度小於o(4sn)=o(sn) o(4sn)=o(sn)o(4sn)=o(sn)。
快速評分
catboost使用oblivious樹(亦稱對稱數)作為基**器(對稱數與普通決策樹的最大不同在於,普通決策樹的每一層左右節點的判斷條件不同,而對稱樹的每一層左右節點的判斷條件相同)。這種樹是平衡的並且不容易過擬合。在對稱樹中,每乙個葉節點可以被編碼成長度等於樹的深度的二進位制向量,先將所有浮點特徵、統計資訊和one-hot編碼特徵二值化,然後使用二進位制特徵來計算**值。所有樣本的二進位制特徵值被儲存在乙個連續向量中,這個向量可以以3倍速度平行式的構建,這導致評分速度加快。
基於gpu快速學習
1、密集型數值特徵。catboost利用對稱樹作為基學習器,並將特徵離散化到固定數量的箱中以減少記憶體使用。在gpu的記憶體使用上,catboost至少與lightgbm一樣有效。lightgbm和xgboost有乙個缺點,就是依賴於原子操作,這雖然可以很簡單的處理合流記憶體訪問,但即使在現代gpu上處理速度也很慢。事實上,直方圖演算法可以不用原子操作以更加有效。因此catboost的主要改進之處就是使用了一種不依賴於原子操作的直方圖計算方法。
2、類別特徵。catboost採用多種方式處理類別特徵。對於one-hot編碼特徵,不需要特殊操作,直接基於直方圖方法;對於單個類別特徵的統計量計算,可以在預處理階段進行;可使用特徵組合,但這最耗時和最耗記憶體。
因此,針對記憶體消耗問題,catboost使用完美雜湊來儲存類別特徵以降低記憶體使用。由於gpu記憶體的限制,在cpu ram中儲存按位壓縮的完美雜湊,以及要求的資料流、重疊計算和記憶體等操作。通過雜湊來分組觀察。在每個組中,需要計算一些統計量的字首和。該統計量的計算使用分段掃瞄gpu圖元實現。
3、多gpu支援。catboost支援多gpu,可通過樣本或特徵並行化地進行分布式樹學習。採用訓練資料的多序列排列的計算方案,在訓練期間計算類別特徵的統計量。
機器學習高階之(六)CatBoost
俄羅斯人提出了catboost,這個演算法在其 中與gbdts演算法對比,注意,這裡的gbdt演算法不是簡單的gbdt演算法,而是作者將gbdt與xgboost統稱為gbdts。這兩個演算法具體的差別是 k2 gini指數gini d,a 表示特徵a aa不同分組的資料集d dd的不確定性。gini...
IsPostBack原理詳解
這個屬性相信大家一定經常用吧 判斷是否為回發 切記這是判斷是否回發 而聽到很多人說這是判斷是否第一次載入頁面 還有的說是否為重新整理 很多人說做專案時 pageload事件裡 都要加上 但是確不太理解原因 說加上這個肯定沒錯 可是 上篇的例子裡 不就錯了麼?所以 一定要理解原理 為了把這個說清楚 這...
solr原理詳解
solr對外提供標準的http介面來實現對資料的索引的增加 刪除 修改 查詢。在 solr 中,使用者通過向部署在servlet 容器中的 solr web 應用程式傳送 http 請求來啟動索引和搜尋。solr 接受請求,確定要使用的適當solrrequesthandler,然後處理請求。通過 h...