gbdt構建新的特徵思想
特徵決定模型效能上界,例如深度學習方法也是將資料如何更好的表達為特徵。如果能夠將資料表達成為線性可分的資料,那麼使用簡單的線性模型就可以取得很好的效果。gbdt構建新的特徵也是使特徵更好地表達資料。
主要思想:gbdt每棵樹的路徑所代表的特徵組合直接作為lr的輸入特徵使用。
用已有特徵訓練gbdt模型,然後利用gbdt模型學習到的樹來構造新特徵,最後把這些新特徵加入原有特徵一起訓練模型。構造的新特徵向量是取值0/1的,向量的每個元素對應於gbdt模型中樹的葉子結點。當乙個樣本點通過某棵樹最終落在這棵樹的乙個葉子結點上,那麼在新特徵向量中這個葉子結點對應的元素值為1,而這棵樹的其他葉子結點對應的元素值為0。新特徵向量的長度等於gbdt模型裡所有樹包含的葉子結點數之和。
gbdt的葉子節點就代表有效的特徵組合。我們需要求的就是w1、w2、w3、w4。這個可以用lr或者fm求解。
所以這個過程我們一般需要將資料劃分為3個。gbdt特徵組合提取資料集,lr特徵組合有效性係數訓練資料集,測試集。
import numpy as np # 快速操作結構陣列的工具
import matplotlib.pyplot as plt # 視覺化繪製
from sklearn.linear_model import linearregression # 線性回歸
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import gradientboostingclassifier,randomforestclassifier
from sklearn.linear_model import logisticregression
from sklearn.metrics import roc_auc_score,roc_curve,auc
from sklearn.preprocessing import onehotencoder
# 弱分類器的數目
n_estimator = 10
# 隨機生成分類資料。
x, y = make_classification(n_samples=80000,n_features=20,n_classes=2)
# 切分為測試集和訓練集,比例0.5
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5)
# 將訓練集切分為兩部分,一部分用於訓練gbdt模型,另一部分輸入到訓練好的gbdt模型生成gbdt特徵,然後作為lr的特徵。這樣分成兩部分是為了防止過擬合。
x_train_gbdt, x_train_lr, y_train_gbdt, y_train_lr = train_test_split(x_train, y_train, test_size=0.5)
# 呼叫gbdt分類模型。
grd = gradientboostingclassifier(n_estimators=n_estimator)
# 呼叫one-hot編碼。
one_hot = onehotencoder()
# 呼叫lr分類模型。
lr = logisticregression()
'''使用x_train訓練gbdt模型,後面用此模型構造特徵'''
grd.fit(x_train_gbdt, y_train_gbdt)
print('每個樣本在每個樹中所屬的葉子索引\n',x_leaf_index)
# fit one-hot編碼器
one_hot.fit(x_leaf_index) # 訓練one-hot編碼,就是識別每列有多少可取值
x_lr_one_hot = one_hot.transform(x_lr_leaf_index) # 將訓練資料,通過gbdt樹,形成的葉子節點(每個葉子代表了原始特徵的一種組合)索引,編碼成one0-hot特徵。
# 編碼後的每個特徵代表原來的一批特徵的組合。
'''
使用訓練好的gbdt模型構建特徵,然後將特徵經過one-hot編碼作為新的特徵輸入到lr模型訓練。
'''# 使用lr訓練gbdt的特徵組合
print('使用邏輯回歸訓練gbdt組合特徵的結果')
lr.fit(x_lr_one_hot, y_train_lr)
# 用訓練好的lr模型多x_test做**
# 根據**結果輸出
fpr, tpr, thresholds = roc_curve(y_test, y_pred_grd_lm) # 獲取真正率和假正率
roc_auc = auc(fpr, tpr)
print('auc值為\n',roc_auc)
#畫圖,只需要plt.plot(fpr,tpr),變數roc_auc只是記錄auc的值,通過auc()函式能計算出來
plt.plot(fpr, tpr, lw=1, label='area = %0.2f' % roc_auc)
plt.show()
# 使用lr直接訓練原始資料
print('使用邏輯回歸訓練原始資料集的結果')
lr.fit(x_train_lr, y_train_lr)
# 用訓練好的lr模型多x_test做**
y_pred_grd_lm = lr.predict_proba(x_test)[:, 1] # 獲取測試集正樣本的概率
# 根據**結果輸出
fpr, tpr, thresholds = roc_curve(y_test, y_pred_grd_lm)
roc_auc = auc(fpr, tpr)
print('auc值為\n',roc_auc)
#畫圖,只需要plt.plot(fpr,tpr),變數roc_auc只是記錄auc的值,通過auc()函式能計算出來
plt.plot(fpr, tpr, lw=1, label='area = %0.2f' % roc_auc)
plt.show()
結果:新構建的特徵對模型結果有提高
參考:python機器學習案例系列教程——gbdt構建新特徵
利用GBDT模型構造新特徵
實際問題中,可直接用於機器學習模型的特徵往往並不多。能否從 混亂 的原始log中挖掘到有用的特徵,將會決定機器學習模型效果的好壞。引用下面一句流行的話 特徵決定了所有演算法效果的上限,而不同的演算法只是離這個上限的距離不同而已。本文中我將介紹facebook最近發表的利用gbdt模型構造新特徵的方法...
利用GBDT模型構造新特徵
通過實踐以下內容,使用gbdt生成新的特性,與原特性合併後,進行模型 auc的分數不一定比原資料要高,所以通過測試後選擇是否使用此方法。實際問題中,可直接用於機器學習模型的特徵往往並不多。能否從 混亂 的原始log中挖掘到有用的特徵,將會決定機器學習模型效果的好壞。引用下面一句流行的話 特徵決定了所...
機器學習 GBDT
在gbdt的迭代中,假設前一輪迭代得到的強學習器 ft 1 x f x ft 1 x 損失函式 l y ft 1 x l y,f x l y,ft 1 x 本輪迭代的目標是找到乙個cart回歸樹模型的弱學習器ht x h t x ht x 讓本輪的損失函式l y ft x l y,f t 1 x h...