LR+GBDT的工作原理

簡介

因爲梯度提升樹訓練過於複雜,而邏輯迴歸過於簡單,只能發現線性簡單,而對於交互項和非線性關係沒有辨識度。
於是用梯度提升樹訓練模型,基於樹模型,就有了交叉和非線性,然後把葉子節點放到邏輯迴歸模型裏,解決了邏輯迴歸算法的缺點。

簡單來說,就是將梯度提升樹的輸出作爲邏輯迴歸的輸入,最終得到邏輯迴歸模型。

如梯度提升樹中有三棵樹,T1T_1T2T_2T3T_3,每棵樹的葉子節點樹爲4。設第ii棵樹的第jj個葉子節點爲LijL_{ij}

梯度提升樹模型訓練完成後,樣本XX經過T1T_1後落在了第3個節點上,即L13L_{13},樣本在T1T_1的向量表達爲(0,0,1,0)(0, 0, 1, 0)。隨後樣本經過T2T_2後落在了第一個節點,經過T3T_3後落在了第4個節點,即L21L_{21}L34L_{34},向量表達分別爲(1,0,0,0)(1, 0, 0, 0)(0,0,0,1)(0, 0, 0, 1)。則樣本在梯度提升樹模型上的表達爲(0,0,1,0,1,0,0,0,0,0,0,1)(0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1),隨後輸入邏輯迴歸模型參於訓練或者預測。

實現

from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier


gbm1 = GradientBoostingClassifier(n_estimators=50, random_state=10, subsample=0.6, max_depth=7,
                                  min_samples_split=900)
gbm1.fit(X_train, Y_train)
train_new_feature = gbm1.apply(X_train)
train_new_feature = train_new_feature.reshape(-1, 50)

enc = OneHotEncoder()

enc.fit(train_new_feature)

# # 每一個屬性的最大取值數目
# print('每一個特徵的最大取值數目:', enc.n_values_)
# print('所有特徵的取值數目總和:', enc.n_values_.sum())

train_new_feature2 = np.array(enc.transform(train_new_feature).toarray())

注:梯度提升樹模型單獨訓練。

原理

dd爲樹的深度,則樹可以將數據劃分爲2d2^d個不相交的子空間,多棵樹就有多種劃分。
這裏把樣本在梯度提升樹的子空間序號的one-hot編碼作爲邏輯迴歸模型的輸入。每個字空間都是一類數據,用是否在子空間的指示標籤來代表子空間的所有數據。

最後用所有子空間影響力的和來計算邏輯迴歸模型最後輸出的概率值。

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