機器學習特徵工程總結
阿新 • • 發佈:2018-11-09
一、前言
資料清洗:
- 不可信的樣本去除
- 缺失值極多的欄位考慮去除
- 補齊缺失值
資料取樣:很多情況下,正負樣本是不均衡的,大多數模型對正負樣本是敏感的(比如LR)
- 正樣本>>負樣本,且量都挺大:下采樣
- 正樣本>>負樣本,量不大:
- 採集更多的資料
- oversampling
- 修改損失函式
二、特徵處理
sklearn中preprocessing模組經常用來進行特徵處理
1、數值型
- 歸一化
- 線性函式歸一化:
將結果對映到[0,1]區間內,實現對原資料的等比縮放 - 零均值歸一化:
將結果對映到均值為0,方差為1的分佈上
為什麼要對數值型資料做歸一化處理?
以梯度下降的優化演算法來說明,假設 的取值範圍為[0,1], 的取值範圍為[0,100],在學習速率相同的情況下, 的更新速度會大於 ,需要較多的迭代才能找到最優解,如果歸一化到相同的區間之後,兩者的更新速度會變得一致,容易更快的通過梯度找到最優解。
- 對數變化
- 統計值(max,min,mean,std)
pd.value_counts() #類似於group計數
pd.describe() #可以檢視mean、min、mean、std等資訊
- 離散化
等距切分、等頻切分 - 轉換成類別型
2、類別型
- 序號編碼
- one-hot編碼
pd.get_dummies(data['column_name'],prefix='column_name')
- 二進位制編碼
- 統計每個人類別下各個target比例,轉成數值型
- hash與聚類處理
hash技巧類似於LDA中“單詞-主題”模型,即把一些特徵轉換到另一個特徵用作統計,“詞袋”模型中經常這樣處理
3、時間型
時間可以看做連續值,也可以看做離散值,看需要選擇
4、文字型
- 詞袋模型:將每篇文章看成一袋子詞,以詞為單位,去掉停用詞,剩下的詞對映成在詞庫中的稀疏向量,向量的每一維都是一個詞。(忽略詞的順序)
from sklearn feature_extraction.text import CountVectorizer
- n-gram:將連續出現的n個詞作為一個獨立特徵放到向量表中
- tf-idf:直觀的解釋是,如果一個單詞在很多文件中出現,那麼我們認為它可能是一個比較通用的詞彙,對於區分文件的貢獻較小,因此對權重做一定的懲罰
為單詞t在文件d中出現的頻率, 是文件逆頻率
其中, 是文件總數, 是包含單詞 的文件個數 - word2vec:一般有兩種網路結構,CBOW的目標是根據上下文來預測當前詞的概率,而skip-gram是根據當前詞來預測上下文出現的概率。
5、統計型
- 加減平均
- 分位線
- 次序型
- 比例
6、組合特徵
- 簡單組合:拼接兩到三個特徵
- 模型組合:可以利用決策樹的方法來找組合特徵,GBDT等
7、高維特徵的處理
三、特徵選擇
原因:
冗餘:部分特徵相關度太高了
噪聲:部分特徵對預測結果有負影響
特徵選擇和特徵降維
特徵選擇只是去掉了原本特徵裡和結果預測關係不大的特徵,做特徵的計算組合成新的特徵
svd和pca是做了空間轉換
1、過濾型
- 評估單個特徵和結果值之間的相關程度:pearson相關係數、互資訊、距離、相關度、卡方檢驗、資訊增益
- 缺點:沒有考慮特徵之間的關聯
2、包裹型
- 把特徵選擇看做是一個特徵子集搜尋問題,篩選各特徵子集,用模型評估效果
- 遞迴特徵刪除演算法:用全量特徵跑一遍模型,根據線性模型特徵的係數,刪掉5%-10%的弱特徵觀察AUC/準確率的變化,逐步進行,直到準確率/AUC出現大的下滑為止
3、嵌入型
- 根據模型來分析特徵的重要性,和包裹型不同的是,包裹型是產生權重,嵌入型是讓模型自動選擇特徵
- 最常見的方式是使用正則化來做特徵選擇,還有決策樹