推薦系統之---正負樣本構造trick

1.說明

  • 在推薦系統的排序階段,有一個很重要的步驟就是,構造用戶-物品的特徵向量,這個過程可以說直接決定了模型的優劣情況。正所謂 “數據是模型的上限”

  • 在後續的時間會持續更新一些小trick。

2.Some Tricks

2.1 Feed流場景下構造樣本

  • 在Feed流場景下,使用曝光(展示)日誌時,應該選擇APP的SDK埋點的日誌,而不是服務器Web接口返回的日誌,因爲Web接口返回的日誌中的接種是會增加很多無效負樣本;舉個栗子,Web接口每次返回10條數據,但是APP屏幕最多展示3條數據,剩下的7條數據需要用戶在Feed中滑動窗口後,才能算真正的曝光,但是很多用戶可能並不會滑動窗口或者滑動幅度比較下,導致剩下的7條數據並未真正的在APP上曝光。針對上述問題,有如下幾個解決方案:
    • 針對同一個內容在不同時間對同一個用戶曝光多次的情況,這時候訓練集中可能出現同一個用戶對同一個內容點擊與不點擊並存的情況,如果多次曝光的間隙非常短,考慮只使用其中的一次曝光數據。
    • 根據YouTube的早期論文中描述,他們爲了避免高度活躍用戶對loss的影響,在訓練集中對每個用戶提取相同數量的訓練樣本。
    • 根據《美團機器學習實戰》書中所說,他們在Feed流場景中採用了Skip-Above的方式來提高效果。具體的做法就是,根據用戶最後一次點擊行爲的位置,過濾掉最後一次點擊之後的展示,可以人認爲用戶沒有看到。當然可以選擇,保留最後一次點擊後的少數幾個
    • 保留有行爲的用戶的負樣本,其他負樣本(沒有過對應的正樣本),進行隨機負採樣,實踐證明這樣做效果要優於只保留有行爲的用戶的負樣本。
    • 與上一個方式對立的,可以考慮去除只有曝光但沒有點擊操作的用戶的樣本(也就是說有的用戶只有負樣本,沒有正樣本),不過去除的話,那模型就只能夠學習到活躍用戶或者有意向用戶的行爲習慣,這就導致線下數據與線上數據分佈有偏差,所以需要根據線上的AB-test測試效果來決定最終是否去除。

2.2 訓練樣本的構造時機

  • 訓練樣本的構造方法,儘可能的採用線上模型預測樣本時刻的特徵作爲之後訓練樣本中的數據,而不是使用離線回溯的方式去拼接訓練樣本中的各個特徵,這就要求當線上模型在預測時,需要將餵給模型的特徵做一次落地,比如傳到kafka,後續再由相應程序進行解析生成之後的的訓練樣本。

2.3 在線學習策略

  • 收到正樣本:可以直接進行訓練。
  • 收到負樣本(展示了但是沒有行爲):等待30分鐘後按一定比例採樣作爲負樣本進行訓練。負樣本在這裏的含義是隻有曝光沒有行爲,那麼負樣本的數量可能會很多,如果直接拿去訓練是不合理的,所以需要等待一段時間,然後在這個時間段內,保證正負樣本的比例再進行訓練。
  • 同一個request中,如果收到某樣本後面樣本的展示或者點擊事件,5min後還沒有收到該樣本的點擊事件,則作爲負樣本進行訓練;如果在作爲負樣本訓練之後,在一段時間之後又收到該樣本的正例行爲,則需要作出補償。

3.平衡正負樣本問題

  • 機器學習的訓練數據不是看它分佈是否平衡,而是看它是否符合原來的分佈。如果符合原來的分佈,那麼訓練誤差最小化也就意味着整體分佈誤差的最小化,也就沒必要進行平衡。

3.1什麼好的訓練集?不平衡的訓練集是否一定需要平衡?

  • 如果正負樣本不是極端的不平衡,不太會影響模型學習效果。相反修改全量數據的原始分佈,改的不好的話,有可能會降低模型的性能。
  • 樣本均衡的處理,一般很多機器學習案例數據都會叫做“專家樣本”,會融入很多的業務洞察,專家樣本做得好,幾百個樣本的模型,能擊敗幾萬甚至幾十萬樣本的模型。
  • 所以什麼是好的訓練集,沒辦法給一個準確的定義。那壞數據集相對來說就比較容易歸納了。

3.2 壞數據集

  • 抽樣不當的數據:
    • 抽樣數量太少,數據量太小不能代表全體樣本。或者說正樣本太少,就無法體現所有正樣本的特性。但是具體的抽樣數據量該多少沒有一個具體的標準。有的文獻說幾十個樣本就足夠了,但是有的文獻說需要幾萬個樣本,所以沒有統一的說法。但是,統一明確的一點是,抽樣的數量一定要儘量的去代表全體數據。
    • 抽樣偏差。這個就比較容易理解了,抽樣的數量要保證,同時質量也要保證。舉個栗子,我們要通過一些穿着特徵去或外貌特徵判斷一個人的性別,這時候如果去藝術學校去抽樣,這時候藝術系的男生也會留長髮、化妝等,這時候就會與社會整體的男性產生嚴重的偏差,沒有辦法表徵全部樣本。
  • 不滿足模型需求的的數據:
    • 有些算法對數據的平衡性非常的敏感,以及對特徵分佈或者特徵分段要求很高。對於這樣的模型,就需要注意正負樣本比例,否則性能可能顯著下降。
  • 不滿足業務需求的數據:
    • 在特定的業務場景下,正樣本本來就很少,此時訓練出來的參數表達能力有限,模型是否會不符合業務的召回率需求。
    • 舉個栗子,在信用卡欺詐模型中,對於召回率的要求比較高(不希望漏掉一個欺詐用戶),並且預測出來的數據還會經過人工審覈,相對的對於準確率要求就低一些。但是在我們的原始數據中,正樣本的比例本身就佔比非常小了,或者正樣本本身就是正太分佈部分,但是在預測的時候,連長尾分佈的部分也不能放過,(儘量的把所有欺詐用戶召回),比如信用卡欺詐裏有的超級用戶雖然數量小,但是一次違約就是幾十萬,比幾百個普通用戶還嚴重,這種時候是否要用權值設置或者複製正樣本的方式,來做識別增強。
    • 像上面的栗子中,就很有必要通過提高正樣本的數量,來覆蓋所有正樣本的情況,並降低負樣本的數量,使得正樣本特徵得到更強的表達。

3.3解決樣本不均衡問題的具體方法

3.3.1 採樣處理

採樣是解決樣本不均衡問題的相對簡單且常用的方法,包括過採樣和欠採樣兩種
【過採樣】

  • 過採樣(也叫上採樣,over-sampling)方法通過增加分類中少數類樣本的數量來實現樣本數量的均衡,最直接的方法是簡單賦值少數類樣本形成多條記錄。
  • 這種方法的缺點是如果樣本特徵少,很可能導致過擬合問題。
  • 改進的過採樣方法,通過在少數類中加入隨機噪聲、干擾數據或通過一定規則產生新的合成樣本。
  • 產生新的合成樣本的算法有SMOTE算法。

【欠採樣】

  • 欠採樣(也叫下采樣,under-sampling)方法通過減少分類中多數類樣本的樣本數量來實現樣本均衡,最直接的方法是隨機的丟掉一些多數類樣本來減少多數類樣本的規模。
  • 缺點是會丟失多數類樣本中的一些重要信息。

總體而言,過採樣和欠採樣更適合大數據分佈不均衡的情況,尤其是過採樣方法應用更加廣泛。

3.3.2 類別權重

  • 通過正負樣本的懲罰權重解決樣本不均衡的問題的思想是在算法實現過程中,對於分類中不同樣本數量的類別分別賦予不同的權重(一般思路分類中的小樣本量的類別權重高,大樣本量的類別權重低),然後進行計算和建模。
  • 使用這中方法時不需要對樣本本身做額外處理, 只需要在算法模型的參數中進行相應的設置即可。(調整超參數)
  • 很多算法中都有基於類別參數的調整設置,以sklearn中的SVM爲例,通過在class_weight:{dict,'balanced'}中針對不同類別針對不同權重,來手動的指定不同類別的權重。如果使用其默認的方法balanced,那麼SVM會將權重設置爲與不同類別樣本數量呈反比的權重來做自動均衡處理,計算公式爲:n_samples/(n_classes * np.bincount(y))
  • 如果在算法本身實現的時候有這樣的參數可以調整,這樣的方法更加簡單且有效。

3.3.3 集成方法

  • 組合/集成方法指的是在每次生成訓練集是使用所有分類中的小樣本量,同時從分類中的大樣本量中隨機抽取數據來與小樣本量合併構成訓練集,這樣反覆多次會得到很多訓練集,從而訓練處多個模型。最後在應用時,使用組合/集成的方法(比如,投票,加權投票等)產生分類預測結果。
  • 例如,在數據集中的正、負樣本分別爲100和10000條,比例爲1:100,此時可以將負樣本隨機切分爲100份,每份100條數據,然後每次形成訓練集時使用所有的正樣本(100條)和隨機抽取的負樣本(100條)形成新的訓練數據集。如此反覆可以得到100個模型。然後繼續集成表決。
  • 這種解決問題的思路類似於隨機森林,在隨機森林中,雖然每個小決策樹的分類能力很弱,但是通過大量的“小決策樹”組合形成“森林”就具有良好的模型預測能力。
  • 如果計算資源充足,並且對於模型的時效性要求不高的話,這是一個不錯的選擇。

3.3.4 特徵選擇方法

  • 上述的集中方法都是基於數據行的操作,通過不同的方法來使得不同類別的樣本數據行記錄均衡,除此以外,還可以考慮使用或輔助與基於獵德特徵選擇的方法。
  • 一般情況下,樣本不均衡也會導致特徵分佈不均衡(表徵正樣本的特徵肯定和表徵負樣本的特徵不同,否則就無法區分了),但是如果小類別樣本量具有一定的規模,那麼意味着其特徵值的分佈較爲均勻,可以通過選擇具有顯著型的特徵配合參與解決樣本不均衡問題,也能在一定程度上提高模型效果。
  • 怎麼理解上面的意思呢,非常簡單,如果某些特徵分佈極其不均勻,說明這個會造成分類的不穩定,那麼我們就需要吧這樣的特徵剔除,選擇哪種具有很好的表徵正樣本(小類樣本)的特徵。以便提高模型的性能。

未完待續~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章