特征工程基本流程
前言
特征是數據中抽取出來的對結果預測有用的信息,可以是文本或者數據。特征工程是使用專業背景知識和技巧處理數據,使得特征能在機器學習算法上發揮更好的作用的過程。過程包含了特征提取、特征構建、特征選擇等模塊。
特征工程的目的是篩選出更好的特征,獲取更好的訓練數據。因為好的特征具有更強的靈活性,可以用簡單的模型做訓練,更可以得到優秀的結果。“工欲善其事,必先利其器”,特征工程可以理解為利其器的過程。互聯網公司裏大部分復雜的模型都是極少數的數據科學家在做,大多數工程師們做的事情基本是在數據倉庫裏搬磚,不斷地數據清洗,再一個是分析業務不斷地找特征。 例如,某廣告部門的數據挖掘工程師,2周內可以完成一次特征叠代,一個月左右可以完成模型的小優化,來提升auc。
1. 數據采集 / 清洗 / 采樣
數據采集:數據采集前需要明確采集哪些數據,一般的思路為:哪些數據對最後的結果預測有幫助?數據我們能夠采集到嗎?線上實時計算的時候獲取是否快捷?
舉例1:我現在要預測用戶對商品的下單情況,或者我要給用戶做商品推薦,那我需要采集什麽信息呢?
-店家:店鋪的評分、店鋪類別……
-商品:商品評分、購買人數、顏色、材質、領子形狀……
-用戶:歷史信息(購買商品的最低價最高價)、消費能力、商品停留時間……
數據清洗: 數據清洗也是很重要的一步,機器學習算法大多數時候就是一個加工機器,至於最後的產品如何,取決於原材料的好壞。數據清洗就是要去除臟數據,比如某些商品的刷單數據。
那麽如何判定臟數據呢?
1) 簡單屬性判定:一個人身高3米+的人;一個人一個月買了10w的發卡。
2) 組合或統計屬性判定:號稱在米國卻ip一直都是大陸的新聞閱讀用戶?你要判定一個人是否會買籃球鞋,樣本中女性用戶85%?
3) 補齊可對應的缺省值:不可信的樣本丟掉,缺省值極多的字段考慮不用。
數據采樣:采集、清洗過數據以後,正負樣本是不均衡的,要進行數據采樣。采樣的方法有隨機采樣和分層抽樣。但是隨機采樣會有隱患,因為可能某次隨機采樣得到的數據很不均勻,更多的是根據特征采用分層抽樣。
正負樣本不平衡處理辦法:
正樣本 >> 負樣本,且量都挺大 => downsampling
正樣本 >> 負樣本,量不大 =>
1)采集更多的數據
2)上采樣/oversampling(比如圖像識別中的鏡像和旋轉)
3)修改損失函數/loss function (設置樣本權重)
2. 特征處理
2.1 數值型
1. 幅度調整/歸一化:python中會有一些函數比如preprocessing.MinMaxScaler()將幅度調整到 [0,1] 區間。
2.統計值:包括max, min, mean, std等。python中用pandas庫序列化數據後,可以得到數據的統計值。
3.離散化:把連續值轉成非線性數據。例如電商會有各種連續的價格表,從0.03到100元,假如以一元錢的間距分割成99個區間,用99維的向量代表每一個價格所處的區間,1.2元和1.6元的向量都是 [0,1,0,…,0]。pd.cut() 可以直接把數據分成若幹段。
4.柱狀分布:離散化後統計每個區間的個數做柱狀圖。
2.2 類別型
類別型一般是文本信息,比如顏色是紅色、黃色還是藍色,我們存儲數據的時候就需要先處理數據。處理方法有:
1. one-hot編碼,編碼後得到啞變量。統計這個特征上有多少類,就設置幾維的向量,pd.get_dummies()可以進行one-hot編碼。
2. Hash編碼成詞向量:
3. Histogram映射:把每一列的特征拿出來,根據target內容做統計,把target中的每個內容對應的百分比填到對應的向量的位置。優點是把兩個特征聯系起來。
上表中,我們來統計“性別與愛好的關系”,性別有“男”、“女”,愛好有三種,表示成向量 [散步、足球、看電視劇],分別計算男性和女性中每個愛好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了兩個特征的關系。
2.3 時間型
時間型特征的用處特別大,既可以看做連續值(持續時間、間隔時間),也可以看做離散值(星期幾、幾月份)。
連續值
a) 持續時間(單頁瀏覽時長)
b) 間隔時間(上次購買/點擊離現在的時間)
離散值
a) 一天中哪個時間段(hour_0-23)
b) 一周中星期幾(week_monday...)
c) 一年中哪個星期
d) 一年中哪個季度
e) 工作日/周末
數據挖掘中經常會用時間作為重要特征,比如電商可以分析節假日和購物的關系,一天中用戶喜好的購物時間等。
2.4 文本型
1. 詞袋:文本數據預處理後,去掉停用詞,剩下的詞組成的list,在詞庫中的映射稀疏向量。Python中用CountVectorizer處理詞袋.
2. 把詞袋中的詞擴充到n-gram:n-gram代表n個詞的組合。比如“我喜歡你”、“你喜歡我”這兩句話如果用詞袋表示的話,分詞後包含相同的三個詞,組成一樣的向量:“我 喜歡 你”。顯然兩句話不是同一個意思,用n-gram可以解決這個問題。如果用2-gram,那麽“我喜歡你”的向量中會加上“我喜歡”和“喜歡你”,“你喜歡我”的向量中會加上“你喜歡”和“喜歡我”。這樣就區分開來了。
3. 使用TF-IDF特征:TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF(t) = (詞t在當前文中出現次數) / (t在全部文檔中出現次數),IDF(t) = ln(總文檔數/ 含t的文檔數),TF-IDF權重 = TF(t) * IDF(t)。自然語言處理中經常會用到。
2.5 統計型
加減平均:商品價格高於平均價格多少,用戶在某個品類下消費超過平均用戶多少,用戶連續登錄天數超過平均多少...
分位線:商品屬於售出商品價格的多少分位線處
次序型:排在第幾位
比例類:電商中,好/中/差評比例,你已超過全國百分之…的同學
2.6 組合特征
1. 拼接型:簡單的組合特征。例如挖掘用戶對某種類型的喜愛,對用戶和類型做拼接。正負權重,代表喜歡或不喜歡某種類型。
- user_id&&category: 10001&&女裙 10002&&男士牛仔
- user_id&&style: 10001&&蕾絲 10002&&全棉
2. 模型特征組合:
- 用GBDT產出特征組合路徑
- 組合特征和原始特征一起放進LR訓練
3. 特征選擇
特征選擇,就是從多個特征中,挑選出一些對結果預測最有用的特征。因為原始的特征中可能會有冗余和噪聲。
特征選擇和降維有什麽區別呢?前者只踢掉原本特征裏和結果預測關系不大的, 後者做特征的計算組合構成新特征。
3.1 過濾型
- 方法:? 評估單個特征和結果值之間的相關程度, 排序留下Top相關的特征部分。
- 評價方式:Pearson相關系數, 互信息, 距離相關度。
- 缺點:只評估了單個特征對結果的影響,沒有考慮到特征之間的關聯作用, 可能把有用的關聯特征誤踢掉。因此工業界使用比較少。
- python包:SelectKBest指定過濾個數、SelectPercentile指定過濾百分比。
3.2 包裹型
- 方法:把特征選擇看做一個特征子集搜索問題, 篩選各種特征子集, 用模型評估效果。
- 典型算法:“遞歸特征刪除算法”。
- 應用在邏輯回歸的過程:用全量特征跑一個模型;根據線性模型的系數(體現相關性),刪掉5-10%的弱特征,觀察準確率/auc的變化;逐步進行, 直至準確率/auc出現大的下滑停止。
- python包:RFE
3.3 嵌入型
- 方法:根據模型來分析特征的重要性,最常見的方式為用正則化方式來做特征選擇。
- 舉例:最早在電商用LR做CTR預估, 在3-5億維的系數特征上用L1正則化的LR模型。上一篇介紹了L1正則化有截斷作用,剩余2-3千萬的feature, 意味著其他的feature重要度不夠。
- python包:feature_selection.SelectFromModel選出權重不為0的特征。
《註:以上總結來自於七月在線課程》
特征工程基本流程