機器學習之特徵工程

什麼是特徵工程

特徵:從數據中抽取出來對結果預測有用的信息。那麼,現在有很多的數據,並不是每一個數據都有用,需要抽取。

特徵工程:使用專業背景知識和技巧處理數據,使得特徵能在機器學習算法上發揮更好作用的過程。

數據採集

採集那些對預測結果有幫助的信息。能影響結果的,和結果有關聯的,有表面的也有內部的,需要去辨別。

數據清洗

去掉髒數據。這個過程很花時間,但是能幫助你對業務的理解變得透徹。

有哪些角度去看呢?關鍵是合不合理,reasonable。包括,單維度考量,組合或者統計屬性判定,統計方法,補齊可對應的缺省值。

數據採樣:

 

  • 分類問題中,正負樣本不均衡問題,大部分模型對正負樣本不均衡敏感,因爲它損失函數是對loss求和,如果不均衡,肯定傾向於更多的那一類。需要隨機採樣和分層採樣。分層採樣:先將總體的單位按某種特徵分爲若干次級總體(層),然後再從每一層內進行單純隨機抽樣,組成一個樣本。
  • 對於正負樣本不均衡問題,若正樣本遠大於負樣本,量很大,對正樣本做下采樣;若量不大,就要採集更多的數據;過採樣,oversampleing(過擬合風險,需要處理數據);修改損失函數。

常見的特徵工程

針對數據的類型,有不同的處理方法。

數值型

幅度調整,歸一化

 

 

  • 爲什麼進行調整?每個column(特徵)的數值表達的意思不同,那麼幅度也應該不同。比如房子面積和臥室個數,這兩個是不一樣的幅度,那麼進入模型之前如果不加調整,會更加偏向大的那個數據。

 

如何進行調整?幅度縮放,標準化,歸一化

  • 幅度縮放(Scaling): x~ = ( x - xmin)/(xmax - xmin) 那麼,數值型數據都在(0,1)
  • 標準化(standardization):x~ = ( x - mean(x)/var(x)) 把數值的分佈進行調整
  • 歸一化(Normalization): L2 Normalization x~ = x/||x||2 (|||x||2 = sqrt(xi))
  • 數值型特徵python處理:
    #數值統計
    df.mean(1) #按行統計均值
    df.mean(0) #按列統計均值
    #離散化 pd.cut 和 pd.qcut
    pd.cut(arr/df, n) #把連續數值按數大小切分爲n個樁,那麼就有n-1個區域,這樣可以給每個區域賦值0,1,2,3...等距劃分
    pd.qcut(arr/df, n) #把連續數值按個數的分佈切分爲n個樁 等頻劃分 佔我總數百分之十的區域是多少
    pd.cut(df,3)
    [(1,4],(4,9]] #切分爲2個區域
    df['new_column'] = pd.cut(df,3) #創建一個新屬性,新屬性裏面是區間的值(簡單方法)
    
    
    

對數幅度變化

離散化(分箱,分桶)

高次或者四則運算特徵

數值型變成類別型 

統計值 max,min,std,mean

 

類別型特徵

one-hot編碼/啞變量變換

dummies_cabin = pd.get_dummies(data['Cabin'], prefix = 'Carbin')
#爲什麼要這樣?不能把類別做成 0,1,2,3,4麼?
#比如紅,黃,藍三種顏色,如果不做one-hotencoding,僅僅只是把他們改成了數值,那麼在模型中,這一列向量的x就有大小區別了,藍色如果是3,紅色是1
#那麼藍色3*θ 比 1*θ大二倍,那麼loss function的計算會改變。

Hash技巧

分桶映射

時間型

比較特殊,包含的信息多,既可以處理成離散型,也可以是連續型。

 

  • 連續值 轉換成持續時間或者間隔時間 (可以用pandas datetime去運算)
  • 離散值 轉換成哪幾個時間段(比如美團點餐中午點的多),哪天(節假日點餐多),週末還是工作日(週末點餐多)。

文本型

詞袋:

from sklearn.feature_extraction.txt import CountVectorizer

TF-idf特徵

評估一個字詞對於一個文件集或者語料庫中某份文件的重要程度;重要度應該是和在文件中的出現次數成正比增加(文件中一個詞出現次數越多,重要度越高),同時和在整個語料庫中出現的頻率成反比(如果是大衆化詞,比如 this,that,就要檢索整個語料庫,整個語料庫this肯定出現的很多,所以佔比下降)。

TF: Term Frequency

TF(t) = t在當前文中出現的次數/t在全部文檔中出現的次數

IDF:

IDF(t) = ln( 總文檔數/含t的文檔數)

TF-IDF權重 = TF(t) * IDF(t)

 

組合特徵

 

  • 簡單組合特徵,拼接型 對於某個樣本把兩個特徵簡單拼接起來。
  • 樹模型+LR 

 

特徵選擇方法

有什麼用?

 

  • 冗餘:特徵之間相關度太高,消耗計算性能
  • 噪聲:有些特徵卵用都沒有,還有負影響。
  • 特徵選擇和降維:前者是剔除原本特徵裏和結果相關度不大的,後者降維,保留了絕大部分的信息。

 

過濾式特徵選擇方式

評估單個特徵和結果之間相關程度,排序留下top相關的特徵部分。

方法:Pearson相關係數,互信息或者距離相關性

缺點:沒考慮特徵之間關聯作用,可能會剔除有用的關聯特徵(當這個關聯特徵在單特徵時關聯不明顯時)。

from scipy.stats import pearsonr
from sklearn.feature_selection import SelectKBest, chi2

包裹式(wrapper)特徵選擇 

把特徵選擇看成一個特徵子集的搜索問題,篩選各種特徵子集,用模型評估效果。
遞歸特徵刪除算法

怎麼做?先用全量特徵跑一個模型,根據線性模型的係數,看相關度和貢獻度,刪除5%-10%的弱特徵,再跑一遍,看準確率/AUC的變化;如果變化不大,就說明被刪除的沒多少用,然後繼續這樣,直到變化出現雪崩。

from sklearn.feature_selection import RFR

嵌入型
根據模型來分析特徵重要性
常用正則化來做特徵選擇

  • L1正則化 有一個截斷性效應,最後會把不重要的特徵權重直接變成0,最常見。
  • l2正則化
from sklearn.feature_selection import SelectFromModel

 

 

 

 

 

 

 

 

模型調優與融合

模型融合 Model Ensemble

ensemble learning是一組individual learner的組合。

Trainning mutiple learners and then combine them for use,with Boosting and Bagging as representatives.                     (http://www2.islab.ntua.gr/attachments/article/86/Ensemble%20methods%20-%20Zhou.pdf)

Some people prefer calling the learners individual learners or component learners to “base learners”, while the names “individual learners” and “component learners” can also be used for homogeneous base learners. 所以統一叫做base learner。

爲什麼要做模型融合?

空間上,假設空間h的平均更接近真實空間f

計算上,迭代求解很可能找到局部最優解,多個局部最優解取平均更趨近全局最優解。

表現上,真實的假設f可能並不在h空間中,取平均可能能夠跳出h空間更接近空間外的f。

模型融合不同思路的策略:

 

  1. voting 投票器 單個模型很難控制過擬合 就只能多數表決。 from sklearn.ensemble import VotingClassifier
  2. bagging 應對欠擬合或者過擬合 過擬合常見 所以如何解決過擬合? from sklearn.ensemble import BaggingClassifier.
  3. RandomForest 基於樹模型的bagging優化方法。特徵是雙重採樣,先對樣本隨機採樣,構建樹時會對特徵隨機採樣。
  4. stacking 利用別的分類器的結果作爲特徵再分類。先學習出三個獨立的模型,得到預測結果;再用其他模型訓練這三個結果,得到最終結果。但是容易過擬合。
  5. blending 弱化版的stacking,對第一次訓練出來的結果做線性加權。也就是第二步不用複雜的模型。
  6. boosting 三個主要方面:重複迭代和訓練;每次分配給錯誤樣本更高的權重;最簡單分類器疊加。比如:Adaboost

例子:Adaboost  

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章