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 可以有效地處理缺失資料,而無需進行大量清理。即使某些資訊丟失,模型也可以繼續從資料中學習並做出準確的排序預測。

廣告

© . All rights reserved.