1. 程式人生 > >CTR預估特徵工程

CTR預估特徵工程

特徵工程

專案資料格式

這裡寫圖片描述

CTR預估的流程

資料—>預處理—>特徵提取—>模型訓練—>後處理

模型和特徵的關係

一句話概括這個問題,特徵決定了上界,而模型決定了接近上界的程度。

資料預處理

首先要進行的是label匹配,由於我們拿到的資料為展示日誌和點選日誌,我們需要做的是將拿到的資料進行join操作,資料join完成之後我們,得到我們想要的訓練資料。資料的預處理主要就是資訊的組合,將其他檔案的相關資訊,組合到一個檔案中,形成我們的訓練資料。join的程式碼如下

#! /bin/bash
sort -t $'\t' -k "$2,$2" $1 >t1
sort -t $'\t'
-k "$4,$4" $3 >t2 join -t $'\t' -1 $2 -2 $4 t1 t2 -a 1 | awk -v n=$2 '{ s=$2; for(i=3;i<n+1;i++){ s=s"\t"$i } s=s"\t"$1 for(i=n+1;i<=NF;i++){ s=s"\t"$i } print s }' rm -f t1 t2

如果資料較多,我們一般對資料進行負取樣。負取樣就是採集label為0的日誌,保留正樣本,如果樣本數量不均衡,處理方法有,保留所有正樣本,同時向下負取樣,或者保留所有正樣本且複製多次,同時向下負取樣,使得比例大約為1:10左右。

資料特徵

這裡的特徵一般都三類,使用者特徵,廣告特徵和上下文特徵

標題 特徵
使用者特徵 userid、gender、age
廣告特徵 adid、titleid、advertedierid、keywordid、decription
上下文特徵 depth、position

以上的這些特徵按照,不同的能力,還可以有不同的劃分方法,High Level特徵和Low Level特徵。
High Level特徵:指的是泛化能力比較強的特徵
Low Level特徵:指的是子解釋性比較強的特徵
具體的關係如下圖所示:

這裡寫圖片描述

這裡的特徵還可以按照刻畫能力和覆蓋度進行劃分

這裡寫圖片描述

當然,我們最想要的就是在第一象限的完美特徵,但是這種特徵一般比較少,二三象限的特徵比較多,而第四象限的特徵的影響就比較微弱了。

資料特徵處理方法

One Hot Encoding

One-Hot編碼,又稱為一位有效編碼,主要是採用位狀態暫存器來對個狀態進行編碼,每個狀態都由他獨立的暫存器位,並且在任意時候只有一位有效。在實際的機器學習的應用任務中,特徵有時候並不總是連續值,有可能是一些分類值,如性別可分為“male”和“female”。在機器學習任務中,對於這樣的特徵,通常我們需要對其進行特徵數字化,舉例說明,我們有如下屬性:
性別:[“male”,”female”]
廣告id:[11,22,33,44,55,66]
位置:[1,2,3,4,5,6]
對以一個樣本[“feamle”,44,4],可以採用序列化的方式[1,3,3],但是這樣不能直接在演算法中使用。
One Hot Encoding的編碼思想是,”female”對應[0,1],廣告id44對應的是[0,0,0,1,0,0],位置4對應的是[0,0,0,1,0,0],則完整的特徵數字化的結果為:
[0,1,0,0,0,1,0,0,0,0,0,1,0,0]
具體的程式碼實現,有兩種方法,一種是通過加入字首,形成唯一的編號,一種是通過Hash函式的方法,雖然Hash函式的方法,在資料量比較大的時候會有一些衝突,但是這對最後的影響結果不是很大。
加入字首的特徵處理

def processIdFeature(prefix,id):
    global feature_map
    global feature_index
    str = prefix + "_" + id
    if str in feature_map:
        return feature_map[str]
    else:
        feature_index = feature_index + 1
        feature_map[str] = feature_index
    return feature_index

Hash函式的方法

def hashFeature(prefix,id):
    str = prefix + "_" + id
    return hash(str) % HASH_SIZE

離散化

為什麼要使用離散化的方法?
假設特徵在[0,1]之間,預測是有非線性關係y=(x0.5)2,線性模型:y=wx進行擬合,效果會怎麼樣呢?效果應該不會太好,如果我們將x劃分為若干段,比如:x1,x2...xn,我每一段每一段的去擬合,這樣的效果肯定會比線性模型要好一些。

等值離散

等值劃分是將特徵按照值域進行均分,每一段內的取值等同處理。

等量離散

等量劃分是根據樣本總數進行均分,每段等量個樣本劃分為1段。

特徵組合

特徵組合的目的,主要有兩種

特徵組合 目的
AUC之間進行組合 提高表達關係的能力
AUC內部進行組合 提高自解釋的能力