機器學習之GBDT構建新特徵

2021-10-03 17:13:47 字數 3263 閱讀 5681

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...