突破GBDT!GBDT在用户行为分析中的应用 !!

文摘   2024-10-30 15:36   北京  

哈喽,我是cos大壮!~

今儿再来和大家聊聊关于GBDT的案例,今天的案例名称是:GBDT在用户行为分析中的应用。

下面,整篇文章将按照下面的流程进行:

  1. GBDT原理阐述:包括GBDT的基本原理、公式和算法流程。
  2. 数据集构建:使用虚拟数据集,模拟用户行为数据。
  3. 模型训练:使用GBDT模型并通过PyTorch实现。
  4. 数据可视化:通过生成图形来说明用户行为的规律与模型的结果。
  5. 算法优化与调参流程:讨论GBDT模型的优化策略和调参技巧。
老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

1. GBDT原理

基本原理

GBDT(Gradient Boosting Decision Trees)是一种基于梯度提升的决策树集成算法。它通过构建多个弱学习器(通常是决策树),逐步减少模型的误差。每一棵新树是在前面的模型基础上,拟合剩余误差(也就是负梯度)来进行提升。

GBDT的关键思想是通过逐步逼近真实值来提升模型的预测能力。整个模型由一系列的决策树组成,每一棵树都试图修正之前树的错误,使得模型的预测误差越来越小。

GBDT 公式推导

GBDT的目标是学习一个预测函数 ,它能够最小化损失函数 ,其中  是真实值, 是模型的预测值。

GBDT的模型形式为:

其中, 表示第  棵决策树, 是每棵树的权重。

  1. 首先,我们从初始化模型开始:
  1. 然后,逐步添加新的树来拟合残差:

这里, 表示第  个样本在第  轮的残差。

  1. 构建一棵新的树  来拟合残差 ,然后更新模型:

损失函数

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(30050, n_samples).astype(int),
    'click_count': np.random.poisson(5, n_samples),
    'purchase_history': np.random.choice([01], size=n_samples),
    'age': np.random.randint(1860, n_samples),
    'gender': np.random.choice([01], size=n_samples),
    'purchase': np.random.choice([01], size=n_samples, p=[0.70.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=(86))
sns.boxplot(x='purchase', y='session_duration', data=data)
plt.title('Session Duration vs Purchase')
plt.show()

可以看到,购买用户的会话时长相对较长,这可能表明用户在浏览商品时花费的时间越长,购买的可能性就越大。

点击次数与购买行为

第二个图展示用户点击次数与购买行为的关系。通过散点图来观察点击次数和购买的相关性。

plt.figure(figsize=(86))
sns.scatterplot(x='click_count', y='purchase', data=data)
plt.title('Click Count vs Purchase')
plt.show()

点击次数与购买行为之间存在一定的相关性。点击次数越多,用户购买的概率越大。

用户年龄与购买行为

第三个图展示了用户年龄与购买行为之间的关系。我们使用直方图来可视化不同年龄段用户的购买情况。

plt.figure(figsize=(86))
sns.histplot(data=data, x='age', hue='purchase', multiple='stack', bins=30)
plt.title('Age Distribution by Purchase')
plt.show()

可以看出,年轻用户的购买行为较为活跃,而老年用户的购买率相对较低。

性别与购买行为

第四个图展示了性别与购买行为的关系。我们使用柱状图来展示男性和女性用户的购买率。

plt.figure(figsize=(86))
sns.countplot(x='gender', hue='purchase', data=data)
plt.title('Gender vs Purchase')
plt.show()

在我们的虚拟数据集中,男性和女性的购买行为没有显著差异。

5. GBDT的算法优化与调参

GBDT模型有多个超参数可以调整以提升模型的性能:

  1. 树的数量(n_estimators):树的数量越多,模型的拟合能力越强,但也容易出现过拟合。可以通过交叉验证选择合适的树数量。
  2. 学习率(learning_rate):学习率控制每棵树对最终结果的贡献。学习率过大可能导致模型不稳定,过小则收敛速度慢。
  3. 树的深度(max_depth):控制每棵树的复杂度,防止过拟合。
  4. 子样本(subsample):用于控制每棵树构建时使用的数据量,减小过拟合的风险。

网格搜索调参

可以使用网格搜索自动调参:

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier

# 定义超参数网格
param_grid = {
    'n_estimators': [50100150],
    'learning_rate': [0.010.10.05],
    'max_depth': [357]
}

# 构建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模型,分析用户行为特征,我们发现会话时长、点击次数等特征与用户购买行为存在显著相关性。通过调参和可视化分析,进一步提升了模型的性能并加深了对用户行为的理解。

最后

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「案例汇总」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章