LightGBM - 排名

排名意味着将元素按指定顺序排列,例如按成绩对学生进行排序或按相关性对搜索结果进行排序。在机器学习中,排名用于根据项目的价值或相关性来组织项目。

LightGBM 可用于需要按顺序排列数据的排名任务。这在许多情况下很有用,例如 −

  • 搜索引擎 − 当您在 Google 上搜索某些查询时,结果将根据您输入的查询的偏好进行排序。

  • 推荐系统 −当您观看 YouTube 视频或在线购物时,系统会对选项进行排名并推荐与您最相关的选项。

LightGBM 中的排名损失函数

当使用 LightGBM 进行排名时,它会尝试将它们按最佳顺序排列。为了做到这一点,LightGBM 使用"损失函数"。损失函数决定模型完成任务的程度。如果排名正确,则损失最小;否则,损失很大。目标是通过尽可能准确地排名来最小化损失函数。

以下是我们可以在 LightGBM 中使用的一些排名损失函数 −

LambdaRank

此损失函数试图提高搜索结果和推荐的相关性。该技术将排名转换为成对分类或回归问题。基本上,算法一次评估一对项目以找到这些项目的可能排序,然后再开始对完整列表进行最终排序。 LambdaRank 之所以受欢迎,是因为它只是对质量进行排名。

NDCG(归一化折扣累积增益)

NDCG 是一种统计信息,用于查找排名列表的质量。它选择列表顶部附近的项目,因为它们是最重要的。LightGBM 使用 NDCG 作为损失函数来提高其排名。目标是通过在顶部显示最重要的信息来最大化 NDCG 分数。这对于很大程度上依赖于前几个结果的搜索引擎和推荐系统很有用。

MAP(平均精度)

平均精度衡量模型执行查询的效果。为了更好地理解它的工作原理,请考虑精度和召回率,这是评估分类模型有效性的两个常用指标。它有助于确保大量相关项目显示在顶部。

列表损失

列表损失函数不依赖于成对的损失,而是评估整个评级项目集。此技术评估排名列表的整体质量并尝试改进它。LightGBM 使用列表损失函数来找到组中所有项目的最佳排名顺序。

使用 LightGBM 进行排名的示例

这是一个 Python 代码,展示了 LightGBM 进行排名的示例。因此,我们将创建一个小数据集,然后训练一个 LightGBM 模型进行排名。之后,我们将使用它来预测排名顺序。

  • 步骤 1 − 首先,您必须导入必要的库,例如 − lightgbmnumpysklearn.model_selectionsklearn.metrics

    import lightgbm as lgb
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import ndcg_score
    
  • 第 2 步 − 创建一个包含 X、y 和 group 的样本数据集,其中 X 为特征,y 为相关性分数,group 为组。X 为特征矩阵,每个矩阵包含七个样本和两个特征。Y 表示相关性分数。其值越高,表示该项目越相关。

    X = np.array([[0.2, 1], [0.4, 2], [0.3, 1], [0.6, 2], [0.8, 3], [0.5, 2], [0.9, 3]])
    y = np.array([1, 2, 2, 3, 4, 3, 5])
    group = [2, 3, 2]
    
  • 步骤 3 − 扩展组数组以创建 X 中每个样本的组索引列表。 group_indices 是通过重复其各自组中每个项目的组索引来创建的。

    group_indices = np.repeat(range(len(group)), group)
    
  • 步骤 4 − train_test_split 方法将数据集拆分为训练集和测试集。 X、y 和 group_indices 被拆分为训练集和测试集。我们将按 70:30 的比例进行拆分。

    X_train, X_test, y_train, y_test, group_train_indices, group_test_indices = train_test_split(
    X, y, group_indices, test_size=0.3, random_state=42
    )
    
  • 步骤 5 − 计算训练和测试数据集中每组有多少个样本。 group_train 和 group_test 给出了每个训练组和测试组的样本数量。

    group_train = [np.sum(group_train_indices == i) for i in np.unique(group_train_indices)]
    group_test = [np.sum(group_test_indices == i) for i in np.unique(group_test_indices)]
    
  • 第 6 步 − 现在我们将生成 LightGBM 数据集用于训练和测试。 group 参数显示排名任务所需的每组样本数。

    train_data = lgb.Dataset(X_train, label=y_train, group=group_train)
    test_data = lgb.Dataset(X_test, label=y_test, group=group_test)
    
  • 第 7 步 − 然后我们将定义 LightGBM 模型的参数 −

    params = {
       'objective': 'lambdarank',
       'metric': 'ndcg',
       'learning_rate': 0.1,
       'num_leaves': 31,
       'min_data_in_leaf': 1,
       'ndcg_at': [1, 3, 5],
       'verbose': -1
    }
    
  • 第 8 步 −然后借助训练数据训练 LightGBM 模型。

    gbm = lgb.train(
       params,
       train_data,
       valid_sets=[test_data],
       num_boost_round=100,
       callbacks=[lgb.early_stopping(stopping_rounds=10)]
    )
    
  • 第 9 步 − 通过使用训练模型来预测测试数据。我们使用 ndcg_score 来获取模型的性能。

    y_pred = gbm.predict(X_test)
    score = ndcg_score([y_test], [y_pred])
    print(f"NDCG Score: {score}")
    
  • 第 10 步 −以下是了解模型对测试数据进行排名的分数。

    Training until validation scores don't improve for 10 rounds
    Early stopping, best iteration is:
    [1]	valid_0's ndcg@1: 0.666667	valid_0's ndcg@3: 0.898354	valid_0's ndcg@5: 0.898354
    NDCG Score: 0.894999002123018
    

使用 LightGBM 进行排名的优势

以下是 LightGBM 成为排名任务的绝佳选择的一些优势:

  • 速度 − LightGBM 非常快。它可以轻松处理大量数据,这在需要评估大量项目(例如数千种产品或数百万个网页)时至关重要。由于它的速度很快,您可以更快地获得结果,因此对于需要快速决策的公司来说,它很重要。

  • 内存效率高 − LightGBM 比其他机器学习工具更节省内存。这意味着 LightGBM 可以在硬件功能较弱的计算机上运行。它不需要太多空间来存储数据,同时学习如何使其最适合各种设备,如笔记本电脑到大型服务器。

  • 准确性 − LightGBM 非常擅长创建精确的预测。它学习对项目进行排名的最有效方法,因此最终的顺序既准确又有用。这种高水平的准确性通过在网上商店中提供最相关的产品或在搜索引擎上提供顶级搜索结果来改善用户体验。

  • 处理缺失数据 −有时您的数据不完整或包含缺失值。LightGBM 可以有效处理缺失数据,而无需进行大量清理。即使缺少某些信息,模型也可以继续从数据中学习并做出准确的排名预测。