分类: AGI

AGI 通用人工智能

  • LightGBM:电商广告点击率预估利器

    引言

    在电商平台中,广告点击率 (CTR) 预估对于广告投放效果至关重要。准确预测用户点击广告的概率,可以帮助广告主优化广告投放策略,提升广告收益。LightGBM 作为一种高效的梯度提升决策树算法,在 CTR 预估任务中表现出色。本篇文章将以 lightgbm_tinycriteo.ipynb 示例为例,介绍如何使用 LightGBM 训练 CTR 预估模型,并探讨模型优化策略。

    LightGBM 简介

    LightGBM 是微软开源的一种梯度提升框架,它使用基于树的学习算法,并针对分布式计算和高效率进行了优化。LightGBM 具有以下优势:

    • 训练速度快,效率高。
    • 内存占用低。
    • 预测精度高。
    • 支持并行计算和 GPU 加速。
    • 能够处理大规模数据。

    数据准备

    本示例使用 Criteo 数据集,该数据集是 CTR 预估领域的经典基准数据集。原始数据集包含 39 个特征,其中 13 个为数值特征 (I1-I13),26 个为类别特征 (C1-C26)。由于原始数据集规模较大,本示例使用了一个包含约 10 万个样本的子集。

    # 定义特征列和标签列
    nume_cols = ["I" + str(i) for i in range(1, 14)]
    cate_cols = ["C" + str(i) for i in range(1, 27)]
    label_col = "Label"
    
    # 加载数据集
    header = [label_col] + nume_cols + cate_cols
    with TemporaryDirectory() as tmp:
        all_data = criteo.load_pandas_df(size=SIZE, local_cache_path=tmp, header=header)

    将数据集按照时间顺序划分为训练集、验证集和测试集,划分比例为 8:1:1。

    # 划分数据集
    length = len(all_data)
    train_data = all_data.loc[:0.8*length-1]
    valid_data = all_data.loc[0.8*length:0.9*length-1]
    test_data = all_data.loc[0.9*length:]

    模型训练与评估

    基础用法

    对于 LightGBM 的基础用法,只需对类别特征进行简单的顺序编码即可。

    # 顺序编码
    ord_encoder = ce.ordinal.OrdinalEncoder(cols=cate_cols)
    
    # 编码数据
    train_x, train_y = encode_csv(train_data, ord_encoder, label_col)
    valid_x, valid_y = encode_csv(valid_data, ord_encoder, label_col, "transform")
    test_x, test_y = encode_csv(test_data, ord_encoder, label_col, "transform")

    创建 LightGBM 数据集,并设置模型参数。

    # 创建 LightGBM 数据集
    lgb_train = lgb.Dataset(train_x, train_y.reshape(-1), params=params, categorical_feature=cate_cols)
    lgb_valid = lgb.Dataset(valid_x, valid_y.reshape(-1), reference=lgb_train, categorical_feature=cate_cols)
    lgb_test = lgb.Dataset(test_x, test_y.reshape(-1), reference=lgb_train, categorical_feature=cate_cols)
    
    # 训练模型
    lgb_model = lgb.train(params,
                          lgb_train,
                          num_boost_round=NUM_OF_TREES,
                          valid_sets=lgb_valid,
                          categorical_feature=cate_cols,
                          callbacks=[lgb.early_stopping(EARLY_STOPPING_ROUNDS)])
    
    # 预测测试集结果
    test_preds = lgb_model.predict(test_x)
    
    # 计算 AUC 和 Logloss
    auc = roc_auc_score(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    logloss = log_loss(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    
    print({"auc": auc, "logloss": logloss})

    优化用法

    为了进一步提升模型性能,可以对类别特征进行标签编码和二进制编码,并将数值特征的缺失值填充为均值。

    # 标签编码和二进制编码
    num_encoder = lgb_utils.NumEncoder(cate_cols, nume_cols, label_col)
    train_x, train_y = num_encoder.fit_transform(train_data)
    valid_x, valid_y = num_encoder.transform(valid_data)
    test_x, test_y = num_encoder.transform(test_data)
    
    # 训练模型
    # ...
    
    # 预测测试集结果
    test_preds = lgb_model.predict(test_x)
    
    # 计算 AUC 和 Logloss
    auc = roc_auc_score(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    logloss = log_loss(np.asarray(test_y.reshape(-1)), np.asarray(test_preds))
    
    print({"auc": auc, "logloss": logloss})

    模型保存与加载

    训练完成后,可以使用 save_model 方法保存模型,并使用 Booster 类加载模型。

    # 保存模型
    with TemporaryDirectory() as tmp:
        save_file = os.path.join(tmp, "finished.model")
        lgb_model.save_model(save_file)
        loaded_model = lgb.Booster(model_file=save_file)
    
    # 使用加载的模型进行预测
    test_preds = loaded_model.predict(test_x)

    总结

    LightGBM 是一种高效的梯度提升决策树算法,在 CTR 预估任务中表现出色。通过对类别特征进行编码和缺失值填充等优化策略,可以进一步提升模型性能。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网