哈喽,我是cos大壮!~
今儿再来和大家聊聊关于GBDT的案例,今天的案例名称是:GBDT在用户行为分析中的应用。
下面,整篇文章将按照下面的流程进行:
GBDT原理阐述:包括GBDT的基本原理、公式和算法流程。 数据集构建:使用虚拟数据集,模拟用户行为数据。 模型训练:使用GBDT模型并通过PyTorch实现。 数据可视化:通过生成图形来说明用户行为的规律与模型的结果。 算法优化与调参流程:讨论GBDT模型的优化策略和调参技巧。
文末可取本文PDF版本~
1. GBDT原理
基本原理
GBDT(Gradient Boosting Decision Trees)是一种基于梯度提升的决策树集成算法。它通过构建多个弱学习器(通常是决策树),逐步减少模型的误差。每一棵新树是在前面的模型基础上,拟合剩余误差(也就是负梯度)来进行提升。
GBDT的关键思想是通过逐步逼近真实值来提升模型的预测能力。整个模型由一系列的决策树组成,每一棵树都试图修正之前树的错误,使得模型的预测误差越来越小。
GBDT 公式推导
GBDT的目标是学习一个预测函数 ,它能够最小化损失函数 ,其中 是真实值, 是模型的预测值。
GBDT的模型形式为:
其中, 表示第 棵决策树, 是每棵树的权重。
首先,我们从初始化模型开始:
然后,逐步添加新的树来拟合残差:
这里, 表示第 个样本在第 轮的残差。
构建一棵新的树 来拟合残差 ,然后更新模型:
损失函数
GBDT可以适用于回归和分类问题。不同任务下的损失函数不同:
对于回归问题,常用的是平方损失函数:
对于分类问题(特别是二分类),使用的是对数损失函数:
GBDT在用户行为分析中的应用场景
在用户行为分析中,GBDT可以用来预测用户的下一步操作、用户留存率、购买转化率等问题。例如,在电商平台中,我们可以通过用户的浏览历史、点击数据、停留时间等特征来预测用户的购买行为。GBDT在这种应用场景中具有良好的表现,因为它能够处理混合类型的数据(数值型、类别型等),并且具有较强的解释能力。
2. 构建虚拟数据集
我们构建一个虚拟的用户行为数据集,包含以下特征:
user_id
:用户ID。session_duration
:每次会话的停留时间(秒)。click_count
:点击次数。purchase_history
:过去是否有过购买记录(0/1)。age
:用户年龄。gender
:性别(0:男性,1:女性)。purchase
:目标变量,用户是否购买(0/1)。
我们随机生成一个虚拟数据集来模拟用户行为。
import pandas as pd
import numpy as np
# 设置随机种子
np.random.seed(42)
# 模拟数据
n_samples = 1000
data = pd.DataFrame({
'user_id': np.arange(n_samples),
'session_duration': np.random.normal(300, 50, n_samples).astype(int),
'click_count': np.random.poisson(5, n_samples),
'purchase_history': np.random.choice([0, 1], size=n_samples),
'age': np.random.randint(18, 60, n_samples),
'gender': np.random.choice([0, 1], size=n_samples),
'purchase': np.random.choice([0, 1], size=n_samples, p=[0.7, 0.3])
})
data.head()
3. 模型训练与实现
我们将使用GBDT模型来预测用户的购买行为,这里使用PyTorch来实现这一过程,也便于大家多接触多使用PyTorch。
这里,我们将基于决策树的思想,搭建一个简单的GBDT模型。
数据预处理
我们首先需要对数据进行预处理,通常包括特征标准化、类别变量编码等。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 分离特征和标签
X = data.drop(columns=['user_id', 'purchase'])
y = data['purchase']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
模型搭建
首先搭建简单的决策树作为基础学习器,然后逐步实现梯度提升。
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.metrics import accuracy_score
# 定义GBDT模型
class GBDT:
def __init__(self, n_trees=10, learning_rate=0.1):
self.n_trees = n_trees
self.learning_rate = learning_rate
self.trees = [SimpleTree() for _ in range(n_trees)]
self.loss_fn = nn.BCELoss()
def fit(self, X_train, y_train):
for i, tree in enumerate(self.trees):
optimizer = optim.Adam(tree.parameters(), lr=self.learning_rate)
for epoch in range(100): # 每棵树训练100轮
y_pred = tree(torch.tensor(X_train, dtype=torch.float32)).squeeze()
loss = self.loss_fn(y_pred, torch.tensor(y_train, dtype=torch.float32))
optimizer.zero_grad()
loss.backward()
optimizer.step()
def predict(self, X):
# 将每棵树的预测值加起来
X_tensor = torch.tensor(X, dtype=torch.float32)
pred_sum = torch.zeros(X.shape[0])
for tree in self.trees:
pred_sum += tree(X_tensor).squeeze().detach() # 不再转换为 NumPy
# 由于GBDT是逐渐逼近真实值,我们在这里取平均(也可以根据学习率调整加权)
avg_pred = pred_sum / self.n_trees
return (avg_pred > 0.5).int() # 使用 PyTorch 的 .int() 来转换为整数
模型预测与评估
模型训练完成后,我们将使用测试集来评估模型的性能,并计算准确率。
# 评估模型
def evaluate_model(model, X_test, y_test):
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f'Accuracy: {acc:.4f}')
evaluate_model(model, X_test_scaled, y_test)
4. 数据可视化与分析
接下来,我们使用数据可视化来帮助理解模型的预测能力和数据特征。
用户会话时长与购买行为
第一个图展示了用户会话时长与购买行为的关系。我们绘制一个箱线图来展示购买和未购买用户的会话时长分布。
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
sns.boxplot(x='purchase', y='session_duration', data=data)
plt.title('Session Duration vs Purchase')
plt.show()
可以看到,购买用户的会话时长相对较长,这可能表明用户在浏览商品时花费的时间越长,购买的可能性就越大。
点击次数与购买行为
第二个图展示用户点击次数与购买行为的关系。通过散点图来观察点击次数和购买的相关性。
plt.figure(figsize=(8, 6))
sns.scatterplot(x='click_count', y='purchase', data=data)
plt.title('Click Count vs Purchase')
plt.show()
点击次数与购买行为之间存在一定的相关性。点击次数越多,用户购买的概率越大。
用户年龄与购买行为
第三个图展示了用户年龄与购买行为之间的关系。我们使用直方图来可视化不同年龄段用户的购买情况。
plt.figure(figsize=(8, 6))
sns.histplot(data=data, x='age', hue='purchase', multiple='stack', bins=30)
plt.title('Age Distribution by Purchase')
plt.show()
可以看出,年轻用户的购买行为较为活跃,而老年用户的购买率相对较低。
性别与购买行为
第四个图展示了性别与购买行为的关系。我们使用柱状图来展示男性和女性用户的购买率。
plt.figure(figsize=(8, 6))
sns.countplot(x='gender', hue='purchase', data=data)
plt.title('Gender vs Purchase')
plt.show()
在我们的虚拟数据集中,男性和女性的购买行为没有显著差异。
5. GBDT的算法优化与调参
GBDT模型有多个超参数可以调整以提升模型的性能:
树的数量(n_estimators):树的数量越多,模型的拟合能力越强,但也容易出现过拟合。可以通过交叉验证选择合适的树数量。 学习率(learning_rate):学习率控制每棵树对最终结果的贡献。学习率过大可能导致模型不稳定,过小则收敛速度慢。 树的深度(max_depth):控制每棵树的复杂度,防止过拟合。 子样本(subsample):用于控制每棵树构建时使用的数据量,减小过拟合的风险。
网格搜索调参
可以使用网格搜索自动调参:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
# 定义超参数网格
param_grid = {
'n_estimators': [50, 100, 150],
'learning_rate': [0.01, 0.1, 0.05],
'max_depth': [3, 5, 7]
}
# 构建GBDT模型
gbdt = GradientBoostingClassifier()
# 网格搜索
grid_search = GridSearchCV(estimator=gbdt, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
print("Best parameters found: ", grid_search.best_params_)
通过调参,我们可以进一步提升模型的性能。
整个的案例中,我们详细阐述了GBDT在用户行为分析中的应用。通过构建虚拟数据集,训练GBDT模型,分析用户行为特征,我们发现会话时长、点击次数等特征与用户购买行为存在显著相关性。通过调参和可视化分析,进一步提升了模型的性能并加深了对用户行为的理解。
最后
大家有问题可以直接在评论区留言即可~
喜欢本文的朋友可以收藏、点赞、转发起来!
推荐阅读
原创、超强、精华合集 100个超强机器学习算法模型汇总 机器学习全路线 机器学习各个算法的优缺点 7大方面,30个最强数据集 6大部分,20 个机器学习算法全面汇总 铁汁,都到这了,别忘记点赞呀~