簡介
因爲梯度提升樹訓練過於複雜,而邏輯迴歸過於簡單,只能發現線性簡單,而對於交互項和非線性關係沒有辨識度。
於是用梯度提升樹訓練模型,基於樹模型,就有了交叉和非線性,然後把葉子節點放到邏輯迴歸模型裏,解決了邏輯迴歸算法的缺點。
簡單來說,就是將梯度提升樹的輸出作爲邏輯迴歸的輸入,最終得到邏輯迴歸模型。
如梯度提升樹中有三棵樹,、和,每棵樹的葉子節點樹爲4。設第棵樹的第個葉子節點爲。
梯度提升樹模型訓練完成後,樣本經過後落在了第3個節點上,即,樣本在的向量表達爲。隨後樣本經過後落在了第一個節點,經過後落在了第4個節點,即、,向量表達分別爲、。則樣本在梯度提升樹模型上的表達爲,隨後輸入邏輯迴歸模型參於訓練或者預測。
實現
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())
注:梯度提升樹模型單獨訓練。
原理
若爲樹的深度,則樹可以將數據劃分爲個不相交的子空間,多棵樹就有多種劃分。
這裏把樣本在梯度提升樹的子空間序號的one-hot編碼作爲邏輯迴歸模型的輸入。每個字空間都是一類數據,用是否在子空間的指示標籤來代表子空間的所有數據。
最後用所有子空間影響力的和來計算邏輯迴歸模型最後輸出的概率值。