1. 程式人生 > >特征工程指南

特征工程指南

空間 依賴性 錯誤 可能 nts 獲得 label opera 永遠

特征工程
數據科學最有創造力的方面。
要像其他任何有創造力的嘗試一樣對待它,就想寫一個喜劇的秀。
堅持頭腦風暴
創建模板或公式
檢查/重新審視以前的工作
特征分類
一些預處理似乎永遠都是必要的
很高的基數(即包含大量不同的值)會帶來很稀疏的數據
填補缺失值是一個難點
Onehot 編碼
One-of-K 給一個長度為 K 的數組編碼
基本方法:大多使用一些線性的算法
去掉第一列避免共線性
稀疏格式是記憶友好的(便於存儲)
目前對待缺失值的大部分實現方法都不夠優雅,沒有考慮變量。
哈希編碼
對固定長度的數組進行 Onehot 編碼
避免極度稀疏的數據
可能會引發沖突性
可用不同的哈希函數重復操作並 bagging 小凹凸精度的結果
沖突性可能會降低結果的準確度,也可能提升結果的準確度
優雅的處理新的變量(比如 new user-agents)
標簽編碼
給每個類一個獨一無二的數字化 ID
對於非線性的基於樹模型的算法很有用
不增加維度
完全打亂 cat_var --num_id 的映射並重新訓練,平均小凹凸精度。
Count 編碼
用訓練集裏的 count 替換對應的變量
對線性或非線性的算法都適用
對異常值敏感
可以加入對數變換,和 counts 一起使用時效果良好
用‘1’代替沒有考慮的變量
可以主動給一些沖突性:相同的編碼,不同的變量
LabelCount 編碼
按訓練集中的 counts 等級給變量分類
對線性或非線性算法都適用
對異常值不敏感
不會對不同的變量進行相同的編碼
兩全其美
目標編碼
用目標的比例對類別變量編碼(二元分類或回歸)
註意避免過擬合
Stacking 的形式:輸出目標的平均值的單變量模型
記得做交叉驗證
加入平滑性避免出現編碼為 0 的情況
加入隨機噪聲避免過擬合
當被正確的應用時,是最好的線性或非線性編碼
嵌入類別
用神經網絡來創建類別變量的稠密層
在函數近似問題中將類別變量映射到歐式空間
模型訓練更快
更少的存儲開銷
比 Onehot 編碼更精準
NaN 編碼
給 NAN 值一個明確的值來代替其被忽略的情況
NAN 值可以保存信息
註意避免過擬合
僅當 NAN 值在訓練集和測試集中一致或在本地驗證了其獨立性時方
可使用
多項式編碼
為類別變量間的交互進行編碼
沒有交互的線性算法不能解決 XOR 問題(邏輯運算)
一個擁有多項式的內核可以解決 XOR 問題
探索特征空間,用:FS,Hashing and/or VW
擴張編碼
從一個單變量創建多個類別變量
一些高基數的特征,比如 user-agents,裏面有非常多的信息:
is_mobile?
Is_latest_version?
Operation_system
Browser_build
Etc
整合編碼
將不同的類別變量映射到同一個變量中
拼寫錯誤,稍有不同的工作描述,全名 vs 縮寫
真實的數據是散亂的,自由文本尤其如此
找出特征是很難的,費時,需要專業的知識。應用機器學習基本上就
等於特征工程。

--------------Andrew Ng
數字化特征
使數據進入算法更容易
可由 floats,counts,numbers 組成
更易估算缺失值
湊整
數字化變量的湊整
有損耗的壓縮方式:保存數據中大部分重要的特征
有時候太過精準反而會帶來噪聲
被湊整的變量可以當做類別變量
在湊整前可進行對數變換
裝箱
把數字化變量放入箱中,並用 bin-ID 編碼
用分位數裝箱是很實用的,甚至可以用模型找出可選的箱
可以優雅的找到訓練集範圍外的變量

縮放
將數字化變量縮放到一個確定的範圍內
標準化縮放
最大最小縮放
根縮放
對數縮放
填補
填補缺失值
用缺失值組合硬編碼
求平均:相當基礎
求中位數:應對離群點時更健壯
直接忽略:只是推遲問題
使用模型:可以暴露算法偏差
交互
數字化變量間具體的交互編碼
嘗試:減,加,乘法,除法
使用:通過統計檢驗進行特征選擇,或通過訓練集對特征重要性排序
易忽略:人的直覺;有時一些詭異的交互會帶來出其不意的效果
機器學習項目眾多,有點成功了,有的失敗了。到底是什麽造成了它
們 的 區 別 ? 簡 單 來 說 最 重 要 的 就 是 對 特 征 的 使 用 。
------------Predro Domingos
線性算法的非線性編碼
用非線性硬編碼來改進線性算法
多項式內核
葉編碼(嵌入隨機森林)
遺傳算法
局部線性嵌入,譜嵌入,t-SNE
行統計
NAN 值數
零值數
負值數
平均值,最大值,最小值,偏度,等
時間變量
時間變量,比如日期,需要更好的本地驗證方案(比如回溯測試)
這裏很容易犯錯
有很多機會獲得重大突破
投影到圓內
將單個的特征,比如 day_of_week,投影到一個圓的兩個坐標上
確保 max 和 min 間的距離等於 min 和 min+1 間的距離
使用 day_of_week,day_of_month,hour_of_day
趨勢線
代替編碼:總花費,對某件事編碼要像:上周的花費,上個月的花費,
上一年的花費
給出一個算法趨勢:兩個顧客花費相當,但卻有截然不同的表現方式
-------一個顧客可能開始花的更多,而另一個接下來可能會減少花費
重大事件的臨近
硬編碼類別特征,如:data_3_days_before_holidays:1
Try:國慶節,重大體育事件,周末,每個月的第一個星期六,等
這些因素可能會對花費行為產生重大影響
空間變量
空間變量是對本地空間編碼的變量
示例:GPS,城市,國家,地址
將位置歸類
克裏金插值
K-means 分類
原經緯度
將城市轉換為經緯度
給街名添加郵政編碼
與中心的接近程度
確定當前位置與中心點的接近程度
小城鎮傳承了周邊的大城市的文化和語言
手機的位置可映射到最近的商業中心或超市
空間的欺騙行為
本地事件的數據可以作為可疑行為的指示
不可能的旅行速度:在多個國家同時出現交易
在不同城鎮的花費多過在家或送貨地址
從不在同一地點花費
探索
數據探索可以發現數據的健壯程度,離群點,噪聲,特征工程的想法,
以及特征清洗的想法
可用的有:控制臺,pandas,notebook
試試簡單的統計:min,max
合並目標,一遍找到項目間的相關性
叠代/調試
特征工程是一個叠代的過程:合理的規劃以便快速叠代
使用次線性調試:輸出過程中的信息,要做偽日誌
使用工具進行快速實驗
許多的想法會失敗,更多的想法就會成功
標簽工程
把標簽/目標/依賴性變量當做數據的特征,反之亦然
對數變換:y---> log(y+1) | exp(y_pred)-1
平方變換
箱行變換
創建一個 score,來當做最初的回歸目標函數
訓練回歸來預測測試集裏沒有的特征
自然語言處理
關於類別特征的所有想法都能用
深度學習(自動化特征工程)在這個領域越來越越來越吃香,但淺度
的學習和精細化特征設計仍然很有競爭力。
高度稀疏的數據可能會帶來維數災難
這部分有許多機會來做特征工程:
清洗:
大寫變小寫
解碼
去掉符號
修復
標誌法
編碼標點來標記:硬編碼“!”和“?”
標誌:將句子切分成單詞
N-Grams:連續的記號編碼:“I like the Beatles”--->[“I like”,”like the”,”the
Beatles”]
Char-grams: 和 N-Grams 一 樣 , 但 是 是 字 母 級 的 :“ Beatles ”
--->[“Bea”,”eat”,”atl”,”tle”,”les”]
詞綴:和 char-grams 一樣,但是只針對後綴和前綴
去除
停止詞:去掉出現在停止詞列表中的詞/標記
特殊詞:去掉只在訓練集中出現過幾次的單詞。
常見詞:去掉可能不在停止詞列表中但卻及其常見的詞

拼寫校正:改變正確拼寫的標誌
切分:只拿出一個單詞中的前 8 個字母
詞幹:去掉單詞/標記的詞根 cars-->car
把文中的詞按屈折變化形式進行歸類:never be late--->never are late
相似性
標記相似性:兩個文本中出現的標記個數
壓縮距離:尋找比當前文本更好的壓縮距離的另一個文本
編輯/漢明/傑卡德距離:檢查兩個字符串間的相似性
Word2Vec/Glove:檢查兩個平均向量間的余弦相似性
詞頻-逆文檔詞頻
詞頻:減少長文本的偏好
逆文檔詞頻:減少常見標記的偏好
詞頻-逆文檔詞頻:用於識別文檔中最重要的標記,來去除不重要的
標記,或預處理降維
降維
PCA:將文本的維度降到 50-100
SVD:將文本的維度降到 50-100
LDA: TF-IDF followed by SVD
LSA: 創建主題向量
外部模型
情緒分析:得出一個反應文本中積極或消極情緒的向量
主題模型:用另一個數據集來創建一個新數據集的主題向量
神經網絡&深度學習
神經網絡號稱 end-to-end 的自動化特征工程
特征工程垂死的領域?
不!繼續專註在建築工程領域
盡管許下了承諾:計算機視覺像這樣使用特征:HOG,SIFT,美白,
攝動,圖像金字塔,旋轉,縮放 z 縮放,日誌,架克,外部語義數據,
等。

特征工程指南