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 - 展开 group 数组以创建 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 可以有效地处理缺失数据,而无需进行大量清理。即使某些信息丢失,模型也可以继续从数据中学习并做出准确的排序预测。

广告