1. 程式人生 > >資料分析基本技巧總結-特徵工程(二)

資料分析基本技巧總結-特徵工程(二)

特徵工程

資料分析的首要問題是,清楚自己要通過資料分析去驗證闡述發現一個什麼樣的目標。
那麼特徵工程要做的是:

  1. 特徵的獲取:圍繞著目標去選擇一份最相關的資料,或者知道應該怎麼樣去獲取一些資料來實現這個目標,哪些資料可以獲取,哪些不能,不能獲取的資料重不重要,可以用什麼資料代替或從側面分析出來。
  2. 特徵的處理:獲得的資料由於人工標註,歷史版本不一,資料部分丟失,甚至資料混淆等原因需要進行清洗和預處理。比如資料格式的規整,異常值的取出,髒資料的刪除、在特徵數量大的情況下進行降維等等。

  3. 特徵的監控:歷史的資料能否始終說明和支撐當前的資料分析結論?新的資料,新的特徵能否利用起來增強、改善、甚至推翻當前的結論?

那麼當你獲得資料之後,首先進行的是資料預處理,處理好異常值和髒資料等。之後應該進行特徵選擇,選擇出對之後構建資料模型最有意義的特徵。當然資料預處理特徵選擇這兩者在某些情況下,也可以不分先後。

資料清洗(特徵預處理)

異常值的識別:
#判斷是否空值
df.isnull()
#是否重複
df.duplicated()
#四分位上下界的方法判定異常值(見下文)

異常值處理:

1、丟棄:

#dropna 預設axis= 0 表示丟棄NaN和None的行,
#axis= 1表示丟棄列,subset可指定特定丟棄的屬性
df.dropna(subset=['colA','colB'
],axis= 0) df.drop() #drop_duplicates 預設保留首次出現的行即keep = 'First', #keep也可以是'last'(表示保留最後出現的行)或'False'(全部不保留) df.drop_duplicates(['colA'],keep='First')

2、代替:

#邊界值,均值,差值等替換NaN 或者 None
fillna()
#interpolate 表示用差值填充,預設:
#若NaN在第一行,則填充第二行的數代替NaN
#若NaN在最後行,則填充倒數第二行的數代替NaN
#若NaN在中間,則填充前面數與後面數的均值代替NaN
#method
= 可指定差值的類別,具體可參看[官方文件](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.interpolate.html)pd.Series.interpolate(method='spline')
四分位上下界的方法判定異常值

該方法經常用在定位連續資料異常值上。如下圖,不妨假設資料資料有序,那麼很容易得出資料的下四分位數、中位數、上四分位數,分別對應圖中的Q1、Q2、Q3,設定一個係數k(一般取1.5-3),k的取值視資料分佈情況而定。取偏離(大於)上分位數k*(Q3-Q1)的值為資料的上界,偏離(小於)下分位數k*(Q3-Q1)的值為資料的下界,然後將不屬於上界和下界之間 的值定義為異常值,進而拋棄掉。
在python中,quantile(0.25)quantile(0.75) 就可以得出某個資料序列的下四分位數和上四分位數。你還想知道中位數怎麼求? data.median()可以實現你的願望。
那麼,該方法的具體操作為:

  1. 計算下分位數,上分位數
  2. 計算出上界、下界
  3. 定義引數k
  4. 去掉異常值

這裡寫圖片描述

舉一個栗子:

In [1]: import pandas as pd
#若資料為多次重複試驗觀測,則data中 0.1 顯然跟其它的值有所偏離
In [2]: data = pd.Series([0.1,10.2,11.4,8.9,9.1,12.0])
#計算上四分位數
In [3]: upper = data.quantile(0.75)
#計算下四分位數
In [4]: lower = data.quantile(0.25)
#計算四分位間距
In [5]: q_int = upper - lower
#指定係數k
In [6]: k  = 2.5
#獲取合理資料
In [7]: data[data>lower-k*q_int][data<upper + k*q_int]
Out[7]: 
1    10.2
2    11.4
3     8.9
4     9.1
5    12.0
dtype: float64
#這樣我們就取出了異常值。

特徵的選擇和變換

特徵選擇的目的是篩選出能訓練出更好的模型的資料。
特徵選擇的方法有:

1、過濾思想:利用特徵與標註的距離(可以是相關性、歐氏距離、假設檢驗等)剔除最不相關的特徵。sklearn.feature_selection.SelectKBest
2、包裹思想:通過構造簡單模型,根據係數、逐步過濾特徵集合(比如RFE演算法)。sklearn.feature_selection.RFE
3、嵌入思想:通過所有特徵構建的模型(如線性迴歸)擬合當前的標註,最後根據各個特徵的權重篩選掉權重小的特徵。