GBDT+LR——特征工程模型化
概述
在机器学习中,特征工程是一个至关重要的环节,它直接影响到模型的性能。然而,传统的特征工程往往依赖于人工经验和领域知识,这在一定程度上限制了模型性能的提升。为了解决这个问题,研究者提出了一种将特征工程模型化的方法——GBDT+LR模型。该模型通过集成学习中的梯度提升决策树(Gradient Boosting Decision Tree,GBDT)自动提取特征,并将提取的特征输入到逻辑回归(Logistic Regression,LR)模型中进行分类预测。
[关键词:GBDT+LR、特征工程、模型化、梯度提升决策树、逻辑回归、Python实现]
目录
GBDT模型
GBDT原理
梯度提升决策树(GBDT)是一种集成学习模型,它通过迭代训练多棵决策树,并将这些决策树的预测结果相加,从而得到最终的预测结果。GBDT的核心思想是利用梯度提升算法优化损失函数,每一轮迭代都训练一棵决策树来拟合负梯度(损失函数的负导数),并将其加入到模型中。
GBDT模型的数学表达式为:
F m ( x ) = F m − 1 ( x ) + γ m h m ( x ) F_m(x) = F_{m-1}(x) + \gamma_m h_m(x) Fm(x)=Fm−1(x)+γmhm(x)
其中,(F_m(x))表示第(m)轮迭代的模型,(F_{m-1}(x))表示第(m-1)轮迭代的模型,(\gamma_m)是第(m)轮迭代的学习率,(h_m(x))是第(m)轮迭代训练的决策树。
数学推导
GBDT模型的损失函数通常采用平方损失函数,其数学表达式为:
L ( y , F m ( x ) ) = 1 2 ( y − F m ( x ) ) 2 L(y, F_m(x)) = \frac{1}{2}(y - F_m(x))^2 L(y,Fm(x))=21(y−Fm(x))2
其中,(y)表示真实标签,(F_m(x))表示第(m)轮迭代的模型预测值。
为了优化损失函数,我们采用梯度提升算法进行迭代更新。对于样本(i),损失函数关于模型预测值的负梯度为:
r m i = − ∂ L ( y i , F m − 1 ( x i ) ) ∂ F m − 1 ( x i ) r_{mi} = -\frac{\partial L(y_i, F_{m-1}(x_i))}{\partial F_{m-1}(x_i)} rmi=−∂Fm−1(xi)∂L(yi,Fm−1(xi))
其中,(r_{mi})表示第(m)轮迭代第(i)个样本的负梯度残差。
接下来,我们训练一棵决策树(h_m(x))来拟合负梯度残差,并计算学习率(\gamma_m):
γ m = arg min γ ∑ i = 1 n L ( y i , F m − 1 ( x i ) + γ h m ( x i ) ) \gamma_m = \arg\min_{\gamma} \sum_{i=1}^{n} L(y_i, F_{m-1}(x_i) + \gamma h_m(x_i)) γm=argγmini=1∑nL(yi,Fm−1(xi)+γhm(xi))
最后,我们更新模型:
F m ( x ) = F m − 1 ( x ) + γ m h m ( x ) F_m(x) = F_{m-1}(x) + \gamma_m h_m(x) Fm(x)=Fm−1(x)+γmhm(x)
通过多轮迭代,GBDT模型能够逐渐拟合目标函数,并提升预测性能。
Python实现
接下来,我们使用Python实现GBDT模型,并通过注释解释代码的每个部分。
from sklearn.tree import DecisionTreeRegressor
import numpy as np
class GBDT:
def __init__(self, n_estimators, learning_rate):
self.n_estimators = n_estimators
self.learning_rate = learning_rate
self.trees = []
def fit(self, X, y):
# 初始化预测值为0
y_pred = np.zeros_like(y)
for i in range(self.n_estimators):
# 计算负梯度残差
residuals = -2 * (y - y_pred)
# 训练决策树拟合负梯度残差
tree = DecisionTreeRegressor(max_depth=2)
tree.fit(X, residuals)
self.trees.append(tree)
# 更新预测值
y_pred += self.learning_rate * tree.predict(X)
def predict(self, X):
# 初始化预测值为0
y_pred = np.zeros(X.shape[0])
for tree in self.trees:
# 累加每棵决策树的预测结果
y_pred += self.learning_rate * tree.predict(X)
return y_pred
GBDT+LR模型
模型原理
GBDT+LR模型是一种两阶段的集成模型,首先使用GBDT模型自动提取特征,然后将提取的特征输入到逻辑回归(LR)模型中进行分类预测。
在
GBDT模型中,每个样本都会经过多棵决策树的预测,并最终得到一个预测结果。GBDT+LR模型的特点在于,它将每个样本在GBDT模型中的叶子节点位置作为新的特征,形成一个稀疏的特征向量,并将这个特征向量输入到逻辑回归模型中进行分类预测。
这样的做法实际上是将GBDT模型的输出作为逻辑回归模型的输入,从而实现了特征工程的自动化,提升了模型的预测性能。
模型训练
GBDT+LR模型的训练分为两个阶段:
-
GBDT训练阶段:首先使用GBDT模型对原始特征进行训练,得到GBDT模型。对于每个样本,记录其在GBDT模型中每棵决策树的叶子节点位置,形成新的特征向量。
-
LR训练阶段:使用逻辑回归模型对GBDT模型生成的新特征向量进行训练,得到最终的分类模型。
Python实现
接下来,我们使用Python实现GBDT+LR模型,并通过注释解释代码的每个部分。
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
class GBDT_LR:
def __init__(self, n_estimators, learning_rate, max_depth):
self.gbdt = GradientBoostingClassifier(n_estimators=n_estimators, learning_rate=learning_rate, max_depth=max_depth)
self.lr = LogisticRegression()
self.one_hot = OneHotEncoder()
def fit(self, X, y):
# 训练GBDT模型
self.gbdt.fit(X, y)
# 获取GBDT模型的叶子节点索引
gbdt_leaf_indices = self.gbdt.apply(X)[:,:,0]
# 对叶子节点索引进行One-Hot编码
gbdt_one_hot = self.one_hot.fit_transform(gbdt_leaf_indices)
# 训练逻辑回归模型
self.lr.fit(gbdt_one_hot, y)
def predict(self, X):
# 获取GBDT模型的叶子节点索引
gbdt_leaf_indices = self.gbdt.apply(X)[:,:,0]
# 对叶子节点索引进行One-Hot编码
gbdt_one_hot = self.one_hot.transform(gbdt_leaf_indices)
# 使用逻辑回归模型进行预测
return self.lr.predict(gbdt_one_hot)
def predict_proba(self, X):
# 获取GBDT模型的叶子节点索引
gbdt_leaf_indices = self.gbdt.apply(X)[:,:,0]
# 对叶子节点索引进行One-Hot编码
gbdt_one_hot = self.one_hot.transform(gbdt_leaf_indices)
# 使用逻辑回归模型计算预测概率
return self.lr.predict_proba(gbdt_one_hot)
总结
本文详细介绍了GBDT+LR模型的原理、模型训练、数学推导以及Python实现。GBDT+LR模型是一种两阶段的集成模型,它通过GBDT模型自动提取特征,并将提取的特征输入到逻辑回归模型中进行分类预测。这种模型化的特征工程方法能够有效提升模型的预测性能,并减少人工特征工程的工作量。
GBDT+LR模型在推荐系统、点击率预估、风险评估等任务中都有广泛的应用。通过本文的介绍,希望读者能够深入理解GBDT+LR模型的原理,并在实际项目中灵活应用。
参考文献
- Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD), pp. 785-794.
- Friedman, J. H. (2001). Greedy function approximation: a gradient boosting machine. Annals of statistics, pp. 1189-1232.
[本文为原创内容,未经许可,禁止抄袭和转载。]