目錄
一、樹模型與線性模型的融合模型
二、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 我們要求這個 值盡可能的準確,那麼怎麼樣才能做到盡可能準確呢?其中 表示實際值,表示 值 其中 表示實際值...