推薦系統-數據分割、性能驗證

推薦系統基礎概念

  1. 前言

    作者根據開源項目 gorse 的每一步提交, 系統性學習推薦系統架構組成以及gorse中使用的推薦算法的實現。 通過參考算法文檔以及代碼實現,作者對gorse的學習過程以及進度 與 博客發布的時間線保持一致

  2. 數據集分割

    1. 原因

      推薦系統的根本任務是學習一個函數 f:(U,I)→Rf: (\mathcal{U}, \mathcal{I}) \to \mathbb{R}f:(U,I)R,該函數能夠預測用戶 U\mathcal{U}U 對物品 I\mathcal{I}I 的偏好(例如評分)

      然而,我們的最終目標是最小化模型在未觀測到的數據上的誤差,即泛化誤差。一個模型如果在訓練集上表現優異,但在未見數據上表現糟糕,則稱之為過擬合 (Overfitting)。它過度學習了訓練數據中的特有模式乃至噪聲,而未能捕捉到底層的、具有普適性的偏好規律。

      因此,數據集劃分的根本目的,就是從有限的訓練數據中,模擬出未見數據的場景,從而對模型的泛化能力進行可靠的估計

    2. 常見數據劃分優缺點

      • 留出法

        這是最簡單直接的方法。它從原始數據集中隨機抽取一部分(例如80%)作為訓練集,剩下的一部分(20%)作為測試集。

        大致流程:

        對數據集 D\mathcal{D}D 進行一次性的、互斥的劃分,形成訓練集 D?train\mathcal{D}*{train}D?train 和測試集 D?test\mathcal{D}*{test}D?test,滿足 D?train∩D?test=?\mathcal{D}*{train} \cap \mathcal{D}*{test} = \emptysetD?trainD?test=?D?train∪D?test=D\mathcal{D}*{train} \cup \mathcal{D}*{test} = \mathcal{D}D?trainD?test=D

        D?train\mathcal{D}*{train}D?train 上訓練模型 MMM,之后在 D?test\mathcal{D}*{test}D?test 上評估 MMM 的性能,其結果作為對泛化誤差的估計。*

        • 優點:現簡單,計算開銷小,尤其適合在數據量非常龐大的場景下進行快速實驗和驗證。
        • 缺點:單次隨機劃分的結果帶有很強的偶然性。可能某一次劃分恰好把一些“困難”或“簡單”的樣本都分到了測試集中,從而導致評估結果出現偏差。
      • K折交叉驗證

        為了克服留出法的偶然性,它將整個數據集分成 K 個大小相似、互不相交的子集(稱為“折”)。然后進行 K 次訓練和評估,每次都選擇其中 1 個折作為測試集,剩下的 K-1 個折合并作為訓練集。最后,將 K 次的評估結果取平均值,作為模型的最終性能指標。

        大致流程

        將數據集 D\mathcal{D}D 隨機劃分為 K 個大小近似相等的互斥子集(折,Folds): D1,D2,…,DK\mathcal{D}_1, \mathcal{D}_2, \dots, \mathcal{D}_KD1?,D2?,,DK?

        進行 K 輪迭代,對于第 k∈{1,…,K}k \in \{1, \dots, K\}k{1,,K} 輪:

        • 令測試集為 Dtest(k)=Dk\mathcal{D}_{test}^{(k)} = \mathcal{D}_kDtest(k)?=Dk?

        • 令訓練集為 Dtrain(k)=D?Dk\mathcal{D}_{train}^{(k)} = \mathcal{D} \setminus \mathcal{D}_kDtrain(k)?=D?Dk?

        • Dtrain(k)\mathcal{D}_{train}^{(k)}Dtrain(k)? 上訓練模型 MkM_kMk?,并在 Dtest(k)\mathcal{D}_{test}^{(k)}Dtest(k)? 上計算其性能指標 ?k\epsilon_k?k?

        最終的性能估計為 K 輪指標的均值。同時,也可以計算指標的標準差,以衡量模型性能的穩定性。

        • 優點:充分利用了所有數據,每個樣本都有一次機會成為測試數據,使得評估結果更加穩定、可靠,大大降低了單次劃分帶來的偶然誤差。
        • 缺點:計算成本高: 計算開銷是留出法的 K 倍。常用的 K 值為 5 或 10。

        參考代碼:

        func (set *TrainSet) KFold(k int, seed int64) ([]TrainSet, []TrainSet) {trainFolds := make([]TrainSet, k)testFolds := make([]TrainSet, k)rand.New(rand.NewSource(seed))perm := rand.Perm(set.Length())foldSize := set.Length() / kbegin, end := 0, 0	// todo 數據集劃分for i := 0; i < k; i++ {end += foldSizeif i < set.Length()%k {end++}// Test settestIndex := perm[begin:end]testFolds[i].interactionUsers = selectInt(set.interactionUsers, testIndex)testFolds[i].interactionItems = selectInt(set.interactionItems, testIndex)testFolds[i].interactionRatings = selectFloat(set.interactionRatings, testIndex)// Train settrainIndex := concatenate(perm[0:begin], perm[end:set.Length()])trainFolds[i].interactionUsers = selectInt(set.interactionUsers, trainIndex)trainFolds[i].interactionItems = selectInt(set.interactionItems, trainIndex)trainFolds[i].interactionRatings = selectFloat(set.interactionRatings, trainIndex)begin = end}return trainFolds, testFolds
        }
        
      • 留一法交叉驗證

        這是K折交叉驗證的一種極端情況,即 K 的值等于數據集中樣本的總數 N。在推薦場景下,這通常意味著每次只留下一個用戶的某一次交互記錄作為測試,用該用戶的所有其他數據來訓練。

        大致流程:

        K-折交叉驗證的一個特例,其中 K=NK=NK=N,N 是數據集中樣本的總數。

        • 優點:由于幾乎所有數據都參與了訓練,模型的評估結果偏差極小,最能反映模型在真實數據上的期望性能。
        • 缺點:計算成本極其高昂。如果數據集稍大,執行一次完整的留一法驗證將會耗費難以想象的時間。因此,它只適用于數據集規模非常小的場景。
      • 基于時間的劃分

        基于時間的劃分方法嚴格按照時間戳來切分數據。例如,選取一個時間點,將此時間點之前的所有數據作為訓練集,之后的數據作為測試集。

        大致流程

        嚴格依據交互發生的時間戳進行劃分。

        1. 選取一個時間點 TsplitT_{split}Tsplit?

        2. 所有時間戳 t<Tsplitt < T_{split}t<Tsplit? 的交互數據構成訓練集 Dtrain\mathcal{D}_{train}Dtrain?

        3. 所有時間戳 t≥Tsplitt \ge T_{split}tTsplit? 的交互數據構成測試集 Dtest\mathcal{D}_{test}Dtest?

        • 優點:最能模擬線上真實環境,可以有效評估模型對未來用戶行為的預測能力。這是檢驗模型是否能跟上用戶興趣變化趨勢的黃金標準。
        • 適用場景:對于任何具有時序特征的推薦任務(例如電商、新聞、社交媒體),這都是首選的劃分方法。
    3. 總結

      根據不同的推薦場景選擇合適的劃分方法

      劃分方法優點缺點主要適用場景
      留出法簡單、快速結果偶然性大數據量巨大時的快速實驗或初步驗證。
      K折交叉驗證結果穩定,數據利用率高計算開銷相對較大常規的模型選擇和評估,是學術界和工業界的標準實踐。
      留一法評估偏差小,結果最可靠計算成本極高數據集規模很小,且對評估精度要求極高的罕見情況。
      時間劃分最貼近真實應用場景需要數據包含時間信息用戶興趣會隨時間變化的場景,如新聞、電商推薦。
  3. 推薦模型性能驗證

    模型驗證的核心目標是科學地度量模型的泛化能力,確保其在未知數據上的表現符合預期。

    1. 離線評估 (Offline Evaluation)

      離線評估是在模型上線前,使用固定的歷史數據集進行的驗證。它是成本最低、迭代速度最快的評估方式。

      所有離線評估都必須基于正確的數據集劃分,以模擬真實世界的數據不可見性。主要協議包括:

      • 時序劃分 (Temporal Split): 業界標準。按時間切分,用過去的數據訓練,預測未來的數據。這是唯一能在線下可靠模擬線上環境的方法。

      • K-折交叉驗證 (K-Fold Cross-Validation): 學術界標準。適用于靜態、非時序數據集,通過多次劃分求平均來獲得魯棒的評估結果。

      • 留出法 (Hold-out): 用于超大規模數據集的快速驗證,但結果穩定性較差。

      核心評估指標 (Key Metrics)

      根據推薦任務的不同,我們關注的指標也不同。

      1. 評分預測 (Rating Prediction) 任務

        這類任務的目標是預測用戶對物品的具體評分。

        • 平均絕對誤差 (Mean Absolute Error, MAE):

          它衡量的是預測評分與真實評分之間差值的絕對值的平均值。MAE對所有誤差一視同仁。
          MAE=1∣Dtest∣∑(u,i)∈Dtest∣rui?r^ui∣ \text{MAE} = \frac{1}{|\mathcal{D}_{test}|} \sum_{(u,i) \in \mathcal{D}_{test}} |r_{ui} - \hat{r}_{ui}| MAE=Dtest?1?(u,i)Dtest??rui??r^ui?

        • 均方根誤差 (Root Mean Square Error, RMSE):

          與MAE相比,RMSE通過平方項放大了較大預測誤差的懲罰,對模型的離譜預測(比如真實評分為1分,預測為5分)更為敏感。
          RMSE=1∣Dtest∣∑(u,i)∈Dtest(rui?r^ui)2 \text{RMSE} = \sqrt{\frac{1}{|\mathcal{D}_{test}|} \sum_{(u,i) \in \mathcal{D}_{test}} (r_{ui} - \hat{r}_{ui})^2} RMSE=Dtest?1?(u,i)Dtest??(rui??r^ui?)2?

        gorse中的相關實現代碼:

        func RootMeanSquareError(prediction []float64, truth []float64) float64 {tmp := make([]float64, len(prediction))floats.SubTo(tmp, prediction, truth)	// 誤差floats.Mul(tmp, tmp)					// 平方return math.Sqrt(stat.Mean(tmp, nil))	// 平均值開根號 
        }
        func MeanAbsoluteError(prediction []float64, truth []float64) float64 {tmp := make([]float64, len(prediction))	floats.SubTo(tmp, prediction, truth)	// 誤差abs(tmp)								// 絕對值 return stat.Mean(tmp, nil)				// 平均值
        }
        
      2. Top-N 排序推薦 (Ranking) 任務

        這是現代推薦系統最核心的任務,即為用戶生成一個有序的推薦列表。

        精確率 (Precision@K) / 召回率 (Recall@K):

        • Precision@K: 在推薦的Top-K個物品中,用戶真正喜歡的物品所占的比例。它衡量推薦結果的準確性
        • Recall@K: 在用戶所有喜歡的物品中,被我們成功推薦到Top-K列表里的比例。它衡量推薦結果的全面性
      3. 分類任務 (Classification) - 如點擊率(CTR)預估

        這類任務的目標是預測用戶點擊某個物品的概率。

        AUC (Area Under the ROC Curve):
        AUC衡量的是模型將正樣本排在負樣本前面的能力。它不依賴于某個具體的點擊閾值,能綜合評估模型在所有閾值下的排序能力,是CTR預估模型最核心的離線評估指標之一。

    2. 在線評估(Online Evaluation)

      當模型在離線評估中表現出色后,必須通過在線實驗來驗證其在真實環境中的效果。這是檢驗模型商業價值的最終標準。

      • A/B 測試 (A/B Testing):

        • 機制: 將用戶隨機分成若干組,一組(控制組)使用現有模型A,另一組或多組(實驗組)使用新模型B、C等。在一段時間內,比較各組的核心業務指標。
        • 評估指標: 不再是RMSE或NDCG,而是真實的商業KPI,例如:點擊率(CTR)、轉化率(CVR)、用戶停留時長、GMV(商品交易總額)等。
        • 優點: 結果最可靠,具有統計學意義,能直接衡量商業價值。
        • 缺點: 實驗周期長,成本高,可能對部分用戶造成負面體驗。
      • 交叉測試 (Interleaving):

        • 機制: 將兩個模型(A和B)的推薦結果混合在一起,展示給同一個用戶。通過追蹤用戶最終點擊了來自哪個模型的物品,來快速判斷哪個模型更優。
        • 優點: 比A/B測試更敏感,能用更少的時間和流量獲得顯著的統計結果,非常適合快速迭代多個算法版本。
        • 缺點: 實現相對復雜,主要用于判斷模型的相對好壞,難以直接評估對絕對業務指標的影響。
    3. 超越精確度的質量評估 (Qualitative Evaluation)

      一個高精度的模型不一定是一個好的推薦模型。例如,模型可能總是推薦那些熱門的、用戶早已熟知的物品。因此,還需要關注以下質量指標:

      • 覆蓋率 (Coverage): 模型能夠推薦出的物品占總物品庫的比例。高覆蓋率意味著模型具有更好的挖掘長尾物品的能力。
      • 多樣性 (Diversity): 推薦列表中的物品是否種類豐富,而不是高度同質化。
      • 新穎性 (Novelty): 模型推薦的物品是否是用戶之前不知道的、全新的物品。
      • 驚喜度 (Serendipity): 模型能否推薦出那些用戶意想不到、但又確實令其滿意的物品。
    4. 總結

      一個成熟的模型驗證流程應該是:通過離線評估快速篩選和迭代算法,輔以質量評估確保推薦廣度和深度,最終通過在線評估來決策模型是否上線。

      評估范式核心目的主要方法/指標優點缺點
      離線評估快速驗證算法的理論性能RMSE, MAE, Precision/Recall@K, NDCG@K, AUC快速、低成本、可重復無法完全模擬真實環境,與線上表現可能存在偏差(Gap)
      在線評估驗證模型的真實商業價值A/B測試, 交叉測試結果真實可靠,直接關聯業務KPI慢、高成本、有風險
      質量評估衡量推薦的人性化和探索能力覆蓋率, 多樣性, 新穎性彌補純精度指標的盲點,提升用戶體驗通常難以直接量化和優化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88540.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從電商新手到單日變現5000+,我是如何做到閑魚爆單的

很多人想做項目賺錢&#xff0c;卻總是邁不出第一步。今天給大家分享一個可以從電商小白到成功跑通項目&#xff0c;實現單日GMV 5000的項目。今天將分享從選品、內容制作、銷售服務的全過程實戰經驗。1&#xff1a;閑魚實戰&#xff0c;強執行力01實操前的準備執行力就是你的動…

vue3實現pdf文件預覽 - vue-pdf-embed

參考地址&#xff1a;https://juejin.cn/post/7105933034771185701 這個參考文章的代碼直接可以復制使用&#xff0c;樣式也是給到的&#xff0c;但是實現的是一頁一頁的顯示pdf內容&#xff0c;我的需求是要全部展示出來&#xff0c;頁碼切換時是做一個滾動定位操作。 思路&am…

【AI論文】OmniPart:基于語義解耦與結構連貫性的部件感知三維生成

摘要&#xff1a;創建具有顯式、可編輯部件結構的三維資產&#xff0c;對于推動交互式應用的發展至關重要。然而&#xff0c;大多數生成方法僅能生成整體式形狀&#xff0c;限制了其實際應用價值。我們提出OmniPart——一種新型的部件感知三維物體生成框架&#xff0c;旨在實現…

Pandas-數據查看與質量檢查

Pandas-數據查看與質量檢查一、數據查看&#xff1a;快速掌握數據概況1. 整體概覽&#xff1a;shape與info()2. 數值特征預覽&#xff1a;describe()3. 隨機抽樣&#xff1a;head()與sample()二、數據質量檢查&#xff1a;識別與處理問題1. 缺失值檢查與處理處理策略&#xff1…

類和對象拓展——日期類

一.前言通過前面對類和對象的學習&#xff0c;現在我們可以開始實踐日期類的代碼編寫。在實際操作過程中&#xff0c;我會補充之前文章中未提及的相關知識點。二.正文 1. 日期類代碼實現我們先來看看要實現什么功能吧&#xff0c;把他放在Date.h中#pragma once #include<ios…

大模型KV緩存量化誤差補償機制:提升推理效率的關鍵技術

大模型KV緩存量化誤差補償機制&#xff1a;提升推理效率的關鍵技術摘要 隨著大型語言模型&#xff08;LLM&#xff09;參數規模突破千億級別&#xff0c;推理過程中的顯存占用與計算延遲成為制約其實際部署的核心瓶頸。KV緩存&#xff08;Key-Value Cache&#xff09;作為Trans…

QT跨平臺應用程序開發框架(6)—— 常用顯示類控件

目錄 一&#xff0c;Label 1.1 主要屬性 1.2 文本格式 1.3 設置圖片 1.4 其它常用屬性 1.5 設置伙伴 二&#xff0c;LCD Number 2.1 主要屬性 2.2 實現倒計時 ?2.3 兩個問題 三&#xff0c;ProgressBar 3.1 主要屬性 3.2 進度條按時間增長 3.3 改變樣式 3.4 一個問題 四&#…

LINUX文件系統權限,命令解釋器alias,文件查看和查找

1、文件査看:查看/etc/passwd文件的第5行[rootserver ~]# head -5 /etc/passwd | tail -1 #先找到前5行&#xff0c;用管道符過濾&#xff0c;顯示倒數第一行2、文件查找(1)在當前目錄及子目錄中&#xff0c;查找大寫字母開頭的txt文件[rootserver ~]# find / -name "[…

AI圖像修復工具CodeFormer實測:馬賽克去除與畫質增強效果評測

大家好&#xff01;平時看圖片或視頻&#xff0c;是不是特別煩人臉被馬賽克遮住的地方&#xff1f;比如老照片模糊、視頻關鍵部分被打碼&#xff0c;看著很不舒服。今天給大家分享一款超好用的去馬賽克神器——CodeFormer&#xff0c;完全免費&#xff0c;新手也能輕松搞定&…

知識宇宙-思考篇:AI大模型如何重塑軟件開發流程?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄AI大模型重塑軟件開發&#xff1a;從碼農到AI編程伙伴的華麗轉身一、AI大模型的編程&…

Rocky Linux上使用NVM安裝Node.js 18

問題描述 Rocky Linux 9 默認 yum 安裝的 Node.js 版本是16&#xff0c;vite啟動報錯&#xff1a;TypeError: crypto$2.getRandomValues is not a function &#xff0c;需安裝更高版本的 Node.js 使用nvm安裝Node.js的好處 多版本管理&#xff0c;NVM 允許你安裝多個不同版本的…

JVM 中“對象存活判定方法”全面解析

1. 前言 在 Java 開發過程中&#xff0c;我們常常聽到“垃圾回收”&#xff08;Garbage Collection, GC&#xff09;這一術語。JVM 通過垃圾回收機制自動管理內存&#xff0c;極大地簡化了程序員的內存控制負擔。然而&#xff0c;GC 究竟是如何判斷哪些對象該回收、哪些應保留…

蘋果公司高ROE分析

公司通過增加負債提升凈資產收益率&#xff08;ROE&#xff09;的核心機制在于財務杠桿效應和資本結構優化&#xff0c;以下從原理、操作路徑、風險邊界及蘋果案例四維度展開分析&#xff1a;名稱解釋&#xff1a; ROIC(投入資本回報率)&#xff1a;ROICNOPATInvested Capital …

【Linux系統】進程概念

1. 進程概念1.1 進程的本質核心定義用戶視角&#xff1a;程序的動態執行實例&#xff08;如同時運行多個Chrome窗口即多個進程&#xff09;。內核視角&#xff1a;資源分配的最小實體單位&#xff0c;獨享CPU時間片、內存空間和文件資源。現代定義&#xff1a;進程 內核數據結…

從LLM到VLM:視覺語言模型的核心技術與Python實現

本教程的完整代碼可以在GitHub上找到&#xff0c;如果你有任何問題或建議&#xff0c;歡迎交流討論。 引言&#xff1a;為什么需要VLM&#xff1f; 當我們與ChatGPT對話時&#xff0c;它能夠理解復雜的文字描述&#xff0c;生成流暢的回答。但如果我們給它一張圖片&#xff0c…

老系統改造增加初始化,自動化數據源配置(tomcat+jsp+springmvc)

老系統改造增加初始化&#xff0c;自動化數據源配置一、前言二、改造描述1、環境說明2、實現步驟簡要思考三、開始改造1、準備sql初始化文件2、啟動時自動讀取jdbc文件&#xff0c;創建數據源&#xff0c;如未配置&#xff0c;需要一個默認的臨時數據源2.1去掉sping mvc原本配置…

衛星通信終端天線的5種對星模式之二:DVB跟蹤

要實現穩定可靠的衛星通信&#xff0c;地面終端天線必須精準地對準遠方的衛星。對星的過程是一個不斷搜索、不斷逼近的過程&#xff0c;其目標是讓天線波束中心精確指向衛星&#xff0c;從而獲得最大信號接收與發射效率。 衛星通信終端天線的對星技術是保障衛星通信鏈路穩定的…

重構下一代智能電池“神經中樞”:GCKontrol定義高性能BMS系統級設計標桿

概述BMS&#xff08;電池管理系統&#xff09;作為新能源汽車動力電池與整車的核心紐帶&#xff0c;通過實時監控電壓、電流、溫度及SOC等參數&#xff0c;控制電池充放電過程&#xff0c;保障電池安全性與使用壽命。隨著電動汽車智能化發展&#xff0c;對BMS的響應速度、精度和…

面試150 對稱二叉樹

思路 聯想遞歸三部曲&#xff1a;傳入參數、遍歷方式、返回什么。本題聯想到先序遍歷的方式,需要遍歷整顆二叉樹,最后返回的是一個布爾值。然后我們需要傳入的是左子樹和左子樹的節點,然后分別進行比較。 # Definition for a binary tree node. # class TreeNode: # def __…

多線程的區別和聯系

進程和線程的區別和聯系1.一個進程可以包含多個線程&#xff0c;不能夠沒有線程2.進程是系統資源分配的基本單位&#xff0c;線程是系統調度執行的基本單位3.同一個進程里的線程之間&#xff0c;共用同一份系統資源4.線程是當下實現并發編程的主流方式&#xff0c;通過多線程&a…