日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ML.NET 示例:搜索引擎结果排名

發布時間:2023/12/4 asp.net 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ML.NET 示例:搜索引擎结果排名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn/edit/master/samples/csharp/getting-started/Ranking_Web

英文原版請訪問:https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Ranking_Web

v1.3.1動態API最新控制臺應用程序.csv 文件搜索引擎結果排名排名LightGBM

這個介紹性示例演示如何使用ml.net來預測顯示搜索引擎結果的最佳順序。在機器學習領域,這種預測被稱為排名。

問題

排名是搜索引擎面臨的一個常見問題,因為用戶希望查詢結果根據其相關性進行排名/排序。這個問題包括各種業務場景,其中個性化排序是用戶體驗的關鍵,這已經超出了搜索引擎的需求。下面是幾個具體的例子:

  • 旅行社-提供一份酒店列表,列出最有可能被排名靠前的用戶購買/預訂的酒店。

  • 購物-按與用戶購物偏好一致的順序顯示產品目錄中的項目。

  • 招聘-檢索根據最適合新職位空缺的候選人排列的職位申請。

排名對任何場景都很有用,在這些場景中,按照增加點擊、購買、預訂等可能性的順序列出項目非常重要。

在這個示例中,我們展示了如何將排名應用于搜索引擎結果。要執行排名,目前有兩種算法可用-FastTree Boosting(FastRank)和Light Gradient Boosting Machine(LightGBM)。在這個示例中,我們使用LightGBM的LambdaRank實現自動構建一個ML模型來預測排名。

數據集

本示例使用的數據基于最初由Microsoft Bing提供的公共數據集。數據集在CC-by 4.0許可證下發布,包括訓練、驗證和測試數據。

@article{DBLP:journals/corr/QinL13,author = {Tao Qin and Tie{-}Yan Liu},title = {Introducing {LETOR} 4.0 Datasets},journal = {CoRR},volume = {abs/1306.2597},year = {2013},url = {https:timestamp = {Mon, 01 Jul 2013 20:31:25 +0200},biburl = {https:bibsource = {dblp computer science bibliography, https: }

此數據集的說明如下:

這些數據集是機器學習數據,其中查詢和URL由ID表示。 數據集由從查詢-網址對中提取的特征向量以及相關性判斷標簽組成:

  • 相關性判斷是從商業網絡搜索引擎(Microsoft Bing)的一個失效標簽集中獲得的,該標簽集取5個值,從0(不相關)到4(完全相關)。

  • 這些特征基本上是由我們(微軟)提取的,是研究界廣泛使用的特征。

在這些數據文件中,每一行對應一個查詢-網址對。第一列是相關標簽,第二列是查詢id,其他列是特性。相關性標簽的值越大,查詢-網址對的相關性就越大。查詢-網址對由136維特征向量表示。

機器學習任務 - 排名

如前所述,本示例使用LightGBM LambdaRank算法,該算法使用名為Learning to Rank的監督學習技術。該技術要求訓練/驗證/測試數據集包含一組數據實例,每個實例都用它們的相關性得分(例如相關性判斷標簽)進行標記。標簽是一個數字/序數值,例如{0,1,2,3,4}。主題專家可以手動對這些數據實例及其相關度評分進行標記。或者,可以使用其他度量來確定標簽,例如對給定搜索結果的單擊次數。

預計數據集將具有比“完美”更多的“差的”相關性分數。這有助于避免將排名列表直接轉換為大小相等的{0、1、2、3、4}容器。關聯度得分也會被重用,這樣每個組中大多數樣本被標記為0,這意味著結果是“差的”。而只有一個或幾個標記為4,這意味著結果是“完美”。下面是數據集標簽分布的細分。您將注意到,0(差的)比4(完美)標簽多70倍:

  • Label 0 -- 624,263

  • Label 1 -- 386,280

  • Label 2 -- 159,451

  • Label 3 -- 21,317

  • Label 4 -- 8,881

一旦訓練/驗證/測試數據集被標記為相關分數,那么就可以使用這些數據對模型(ranker)進行訓練和評估。通過模型訓練過程,ranker學習如何根據標簽值對組內的每個數據實例進行評分。單個數據實例的結果得分本身并不重要——相反,應該將這些得分相互比較,以確定組數據實例的相對順序。一個數據實例的得分越高,它在其組中的相關性越強,排名也越高。

解決方案

由于本示例的數據集已經標記了相關分數,因此我們可以立即開始訓練模型。如果您從一個沒有標記的數據集開始,您將需要首先通過讓主題專家提供相關性得分或使用其他一些度量來確定相關性來完成此過程。

通常,訓練、驗證和測試模型的模式包括以下步驟:

  • 模型是在訓練數據集上訓練的。然后使用驗證數據集評估模型的度量。

  • 重復步驟1,通過重新訓練和重新模型,直到達到所需的指標。此步驟的結果是應用必要的數據轉換和訓練器的管道。

  • 管道用于在組合的訓練+驗證數據集上訓練。然后在測試數據集上評估模型的度量(僅一次)——這是用于測量模型質量的最后一組度量。

  • 最后一步是對組合的訓練+驗證+測試全部數據集上重新訓練管道。然后,該模型就可以部署到生產環境中了。

  • 對模型在生產中的表現的最終估計是步驟3中的指標。生產環境使用的最終模型,根據所有可用數據進,在步驟4中進行訓練。

    本示例執行上述步驟的簡化版本以對搜索引擎結果進行排序:

  • 管道是通過必要的數據轉換和LightGBM LambdaRank訓練器設置的。

  • 模型是使用訓練數據集訓練。然后使用驗證數據集對模型進行評估。這將為每個搜索引擎結果生成一個預測。預測通過檢查指標進行評估;特別是Normalized Discounted Cumulative Gain(NDCG)。

  • 管道用于使用培訓+驗證數據集重新訓練模型。使用測試數據集對生成的模型進行評估——這是模型的最后一組度量。

  • 最后一次使用培訓+驗證+測試數據集對模型進行再訓練。最后一步是使用模型來執行新傳入搜索的排名預測。這將為每個搜索引擎結果產生一個分數。分數用于確定與同一查詢中的其他結果(例如組)相關的排名。

  • 1. 設置管道

    本示例使用依賴于LightGBM LambdaRank的LightGbmRankingTrainer訓練模型。模型需要以下輸入列:

    • Group Id—包含每個數據實例的組ID的列。數據實例包含在表示單個查詢中所有候選結果的邏輯分組中,每個組都有一個稱為組ID的標識符。對于搜索引擎數據集,搜索結果按其對應的查詢分組,其中組ID對應于查詢ID。組ID數據類型必須為鍵類型。

    • Label—包含每個數據實例的相關性標簽的列,其中較高的值表示較高的相關性。標簽數據類型必須是鍵類型或單精度浮點數。

    • Features—確定數據實例的相關性/排名方面有影響的列。 特征數據必須是單精度浮點數類型的固定大小向量。

    當設置訓練器時,自定義增益(或相關性增益)也可用于對每個標記的相關性得分應用權重。這有助于確保模型更加重視對權重更高的結果進行排名。在本示例中,我們使用默認提供的權重。

    以下代碼用于設置管道:

    const string FeaturesVectorName = "Features";IDataView trainData = mlContext.Data.LoadFromTextFile<SearchResultData>(trainDatasetPath, separatorChar: '\t', hasHeader: true);var featureCols = trainData.Schema.AsQueryable().Select(s => s.Name).Where(c =>c != nameof(SearchResultData.Label) &&c != nameof(SearchResultData.GroupId)).ToArray();IEstimator<ITransformer> dataPipeline = mlContext.Transforms.Concatenate(FeaturesVectorName, featureCols).Append(mlContext.Transforms.Conversion.MapValueToKey(nameof(SearchResultData.Label))).Append(mlContext.Transforms.Conversion.Hash(nameof(SearchResultData.GroupId), nameof(SearchResultData.GroupId), numberOfBits: 20));IEstimator<ITransformer> trainer = mlContext.Ranking.Trainers.LightGbm(labelColumnName: nameof(SearchResultData.Label), featureColumnName: FeaturesVectorName, rowGroupColumnName: nameof(SearchResultData.GroupId)); ; IEstimator<ITransformer> trainerPipeline = dataPipeline.Append(trainer);

    2. 訓練與評估模型

    首先,我們需要使用訓練數據集訓練我們的模型。然后,我們需要評估我們的模型,以確定它在排名上的有效性。為此,模型將針對另一個未在訓練中使用的數據集(驗證數據集)運行。

    Evaluate()將驗證數據集的預測值與數據集的標簽進行比較,并生成您可以探索的各種度量。具體來說,我們可以使用Evaluate()返回的RankingMetrics中包含的Discounted Cumulative Gain(DCG)和Normalized Discounted Cumulative Gain(NDCG)來衡量模型的質量。

    在評估示例模型的RankingMetrics時,您會注意到DCG和NDCG報告了以下度量值(運行示例時看到的值將類似于這些值):

    • DCG - @1:11.9736, @2:17.5429, @3:21.2532, @4:24.4245, @5:27.0554, @6:29.5571, @7:31.7560, @8:33.7904, @9:35.7949, @10:37.6874

    • NDCG: @1:0.4847, @2:0.4820, @3:0.4833, @4:0.4910, @5:0.4977, @6:0.5058, @7:0.5125, @8:0.5182, @9:0.5247, @10:0.5312

    NDCG值是最有用的檢查,因為這允許我們比較我們的模型在不同數據集的排名能力。NDCG的潛在值從0.01.0不等,其中1.0是一個完美的模型,與理想的排名完全匹配。

    考慮到這一點,讓我們看看我們的模型的NDCG值。特別是,讓我們看看*NDCG@10的值,即0.5312。這是返回前10搜索引擎結果的查詢的平均NDCG,有助于判斷前10結果的排名是否正確。為了提高模型的排序能力,需要對特征工程和模型超參數進行實驗,并對流水線進行相應的修改。我們將通過修改管道、訓練模型和評估度量來繼續迭代,直到達到所需的模型質量。

    請參閱以下用于訓練和評估模型的代碼:

    ITransformer model = pipeline.Fit(trainData);IDataView validationData = mlContext.Data.LoadFromTextFile<SearchResultData>(ValidationDatasetPath, separatorChar: '\t', hasHeader: false);[...]IDataView predictions = model.Transform(validationData);[...]RankingMetrics metrics = mlContext.Ranking.Evaluate(predictions);

    3. 重新訓練并執行模型的最終評估

    一旦達到所需的度量,生成的管道將用于組合的訓練+驗證數據集上的訓練。然后,我們最后一次使用測試數據集評估此模型,以獲得模型的最終度量。

    請參閱以下代碼:

    model = pipeline.Fit(trainValidationData);IDataView testData = mlContext.Data.LoadFromTextFile<SearchResultData>(TestDatasetPath, separatorChar: '\t', hasHeader: false);[...]IDataView predictions = model.Transform(testData);[...]RankingMetrics metrics = mlContext.Ranking.Evaluate(predictions);

    4. 重新訓練并使用模型

    最后一步是使用所有數據(培訓+驗證+測試)重新訓練模型。

    在模型被訓練之后,我們可以使用Predict()?API來預測新的、傳入的用戶查詢的搜索引擎結果排名。

    總結

    以上是生活随笔為你收集整理的ML.NET 示例:搜索引擎结果排名的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。