樹模型與線性模型的融合模型 Python實現

2021-09-02 18:35:19 字數 3132 閱讀 8329

目錄

一、樹模型與線性模型的融合模型

二、python sklearn實現gbdt+lr融合模型

樹模型gbdt原理:

線性模型lr原理:

海量的離散特徵+線性模型lr,因其較高的精度和較少的運算開銷在業界廣為使用。

線性模型lr無法捕捉到非線性特徵對標籤的影響,因而提公升線性模型精度的有效方法是構造有效的交叉特徵

。比較成熟的構造交叉特徵的方法包含:

結合業務,構造有效的交叉特徵,這種方法對線性模型的精度提公升是顯著的,但要花費巨大的人力和時間,特別當特徵達到上百維時,難以構造有效的交叉特徵;

根據資訊增益,分箱劃分連續特徵,將乙個連續特徵劃分為多個類別特徵,為線性模型增加了非線性表達,提高了模型的精度和健壯性。但這種方法構造的非線性特徵包含的資訊是很有限的;

離散特徵通過笛卡爾積,獲取所有的組合特徵,但笛卡爾積獲取的組合特徵呈**式增長,並且很多組合特徵是無效的,為線性模型增加了很多噪音。

2023年facebook提出了樹模型gbdt與線性模型lr的融合模型(practical lessons from predicting clicks on ads at facebook)

,利用gbdt構造有效的交叉特徵,從根節點到葉子節點的路徑,代表部分特徵組合的乙個規則,提公升樹將連續特徵轉化為離散特徵,可以明顯提公升線性模型的非線性表達能力,提高線性模型精度

以下圖所示,gbdt構造兩棵樹,第一棵樹有三個葉子節點,第二顆樹有兩個葉子節點,若訓練樣本落入第一棵樹的第二個葉子節點,第二顆樹的第乙個葉子節點,gbdt構造的交叉離散特徵輸出為[0,1,0,1,0],其中前三個元素對應第一棵樹的葉子節點,後兩個元素對應第二顆樹的葉子節點,輸出的交叉離散特徵作為lr的輸入。

關於gbdt與lr融合模型的思考:

1、樹模型採用整合決策樹,而非單顆決策樹

一棵樹的表達能力很弱,不足以表達多個有區分性的特徵組合,多棵樹的表達能力更強一些。gbdt每棵樹都在學習前面棵樹尚存的不足,迭代多少次就會生成多少顆樹。按*****的gbdt+lr融合方式,

多棵樹正好滿足lr每條訓練樣本可以通過gbdt對映成多個特徵的需求。

2建樹採用gbdt而非rf

rf也是多棵樹,但從效果上有實踐證明不如gbdt。且gbdt前面的樹,特徵**主要體現對多數樣本有區分度的特徵;後面的樹,主要體現的是經過前n顆樹,殘差仍然較大的少數樣本。

優先選用在整體上有區分度的特徵,再選用針對少數樣本有區分度的特徵

,思路更加合理,這應該也是用gbdt的原因。

引用包引入:

import numpy as np

from sklearn.datasets import make_classification

from sklearn.linear_model import logisticregression

from sklearn.ensemble import (randomtreesembedding,randomforestclassifier,gradientboostingclassifier)

from sklearn.preprocessing import onehotencoder

from sklearn.model_selection import train_test_split

from sklearn.metrics import roc_curve,roc_auc_score,accuracy_score,auc

資料集劃分(樹模型和線性模型的訓練分別用不同資料集,防止過擬合):

tmp = np.loadtxt("e:\\ensemblemodeldata.csv",dtype=np.str,delimiter=',')

data = tmp[1:,2:-1].astype(np.float)

label = tmp[1:,-1].astype(np.int)

#data,label = make_classification(n_samples=80000,n_features=30)

x_train,x_test,y_train,y_test = train_test_split(data,label,test_size=0.2)

x_train_tree,x_train_lr,y_train_tree,y_train_lr = train_test_split(x_train,y_train,test_size=0.5)

利用網格搜尋,獲取最優引數:

for n_estimator in [80,100,150,200,250]:

for depth in [1,2,3,5]:

for maxiter in [300,400,500]:

gbdt = gradientboostingclassifier(learning_rate=0.1,n_estimators=n_estimator,max_depth=depth)

ohe = onehotencoder()

lrgbdt = logisticregression(max_iter=maxiter)

gbdt.fit(x_train_tree,y_train_tree)

auc_gbdt_lr = roc_auc_score(y_test,y_pred_gbdt_lr)

print(n_estimator,depth,maxiter,auc_gbdt_lr)

最終結果為:100,5, 500, 0.9440185179246727

practical lesson from predicting clicks on ads at facebook

模型融合 Stacking Blending

模型融合是指通過分層對模型進行整合,比如以兩層為例,第一層為基學習器,使用原始訓練集訓練基學習器,每個基學習器的輸出生成新的特徵,作為第二層模型的輸入,這樣就生成了新的訓練集 第二層模型在新的訓練集上再進行訓練,從而得到融合的模型。stacking stacking是模型融合的常用方法,重點是在第一...

keras模型融合

1.構建模型 模型1 33次風運動 defmodel1 ipt layer1 dense units 512,input dim input node,kernel initializer normal activation sigmoid name layer1 ipt layer2 dense ...

線性回歸模型 線性回歸模型

回歸的思想和分類有所不一樣,分類輸出的結果為離散的值,回歸輸出的是乙個連續型的值。線性回歸的思想就是試圖找到乙個多元的線性函式 當輸入一組特徵 也就是變數x 的時候,模型輸出乙個 值y h x 我們要求這個 值盡可能的準確,那麼怎麼樣才能做到盡可能準確呢?其中 表示實際值,表示 值 其中 表示實際值...