1. 程式人生 > >機器學習特徵工程總結

機器學習特徵工程總結

一、前言

資料清洗:

  • 不可信的樣本去除
  • 缺失值極多的欄位考慮去除
  • 補齊缺失值

資料取樣:很多情況下,正負樣本是不均衡的,大多數模型對正負樣本是敏感的(比如LR)

  • 正樣本>>負樣本,且量都挺大:下采樣
  • 正樣本>>負樣本,量不大:
  1. 採集更多的資料
  2. oversampling
  3. 修改損失函式

二、特徵處理

sklearn中preprocessing模組經常用來進行特徵處理

1、數值型

  1. 歸一化
  • 線性函式歸一化:
    將結果對映到[0,1]區間內,實現對原資料的等比縮放
  • 零均值歸一化:
    將結果對映到均值為0,方差為1的分佈上

為什麼要對數值型資料做歸一化處理?

以梯度下降的優化演算法來說明,假設 X 1 X_1 的取值範圍為[0,1], X

2 X_2 的取值範圍為[0,100],在學習速率相同的情況下, X 1 X_1 的更新速度會大於 X
2 X_2
,需要較多的迭代才能找到最優解,如果歸一化到相同的區間之後,兩者的更新速度會變得一致,容易更快的通過梯度找到最優解。

  1. 對數變化
  2. 統計值(max,min,mean,std)
pd.value_counts() #類似於group計數
pd.describe() #可以檢視mean、min、mean、std等資訊
  1. 離散化
    等距切分、等頻切分
  2. 轉換成類別型

2、類別型

  1. 序號編碼
  2. one-hot編碼
pd.get_dummies(data['column_name'],prefix='column_name')
  1. 二進位制編碼
  2. 統計每個人類別下各個target比例,轉成數值型
  3. hash與聚類處理
    hash技巧類似於LDA中“單詞-主題”模型,即把一些特徵轉換到另一個特徵用作統計,“詞袋”模型中經常這樣處理

3、時間型

時間可以看做連續值,也可以看做離散值,看需要選擇

4、文字型

  • 詞袋模型:將每篇文章看成一袋子詞,以詞為單位,去掉停用詞,剩下的詞對映成在詞庫中的稀疏向量,向量的每一維都是一個詞。(忽略詞的順序)
from sklearn feature_extraction.text import CountVectorizer 
  • n-gram:將連續出現的n個詞作為一個獨立特徵放到向量表中
  • tf-idf:直觀的解釋是,如果一個單詞在很多文件中出現,那麼我們認為它可能是一個比較通用的詞彙,對於區分文件的貢獻較小,因此對權重做一定的懲罰
    t f i d f ( t , d ) = t f ( t , d ) i d f ( t ) tf-idf(t,d) = tf(t,d)*idf(t)
    t f ( t , d ) tf(t,d) 為單詞t在文件d中出現的頻率, i d f ( t ) idf(t) 是文件逆頻率
    i d f ( t ) = l o g N N t + 1 idf(t) = log \frac{N}{N_t+1}
    其中, N N 是文件總數, N t N_t 是包含單詞 t t 的文件個數
  • word2vec:一般有兩種網路結構,CBOW的目標是根據上下文來預測當前詞的概率,而skip-gram是根據當前詞來預測上下文出現的概率。

5、統計型

  • 加減平均
  • 分位線
  • 次序型
  • 比例

6、組合特徵

  • 簡單組合:拼接兩到三個特徵
  • 模型組合:可以利用決策樹的方法來找組合特徵,GBDT等

7、高維特徵的處理

三、特徵選擇

原因:
冗餘:部分特徵相關度太高了
噪聲:部分特徵對預測結果有負影響

特徵選擇和特徵降維

特徵選擇只是去掉了原本特徵裡和結果預測關係不大的特徵,做特徵的計算組合成新的特徵
svd和pca是做了空間轉換

1、過濾型

  • 評估單個特徵和結果值之間的相關程度:pearson相關係數、互資訊、距離、相關度、卡方檢驗、資訊增益
  • 缺點:沒有考慮特徵之間的關聯

2、包裹型

  • 把特徵選擇看做是一個特徵子集搜尋問題,篩選各特徵子集,用模型評估效果
  • 遞迴特徵刪除演算法:用全量特徵跑一遍模型,根據線性模型特徵的係數,刪掉5%-10%的弱特徵觀察AUC/準確率的變化,逐步進行,直到準確率/AUC出現大的下滑為止

3、嵌入型

  • 根據模型來分析特徵的重要性,和包裹型不同的是,包裹型是產生權重,嵌入型是讓模型自動選擇特徵
  • 最常見的方式是使用正則化來做特徵選擇,還有決策樹