sklearn常用數據處理方法(附python代碼)

1.缺失值/異常值處理

這里分四種情況討論(當然具體使用哪種方法還是要根據具體業務進行分析和調整哈~):

  • 數據量很大,缺失值較少:因為有足夠的數據量,刪除小部分數據可能對結果影響不大,因此這種情況我可能把缺失數據對應的行刪除。
  • 數據量很大,缺失值較多:如果這個特征很重要,可能需要做一下插值,如果這個特征不是很重要,我會把整個特征刪掉。
  • 數據量不大,缺失值較少:因為數據量不是很大,如果直接刪除對應的數據,數據量就會更少,對模型的訓練造成影響,因此這種情況我可能會進行插值。
  • 數據量不大,缺失值較多:如果這個特征很重要,可能需要做一下插值,如果這個特征不是很重要,我會把整個特征刪掉。
##用均值插值,也可以用中位數"median",眾數"most_frequent"
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
###from sklearn import preprocessing老版本
####imp =preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0)
X=np.array([[1, 2], [np.nan, 3], [7, 6]])
imp.fit(X)
imp.transform(X)
Out[184]: 
array([[ 1.,  2.],
       [ 4.,  3.],
       [ 7.,  6.]])

2.定量特征二值化

有些數值特征可能沒有實際的數值意義,需要將其轉化成布爾值,如邏輯回歸中需要將結果映射成0、1變量,可以用sklearn中的Binarizer()方法。

from sklearn import preprocessing
import numpy as np
x = np.array([
   [ 1., -1.,  2.],
   [ 2.,  0.,  0.],
   [ 0.,  1., -1.]])
###默認threshld = 0.0,即大于0.0的映射成1,小于等于0.0的映射成0
bina = preprocessing.Binarizer(threshold=1.0)
bina_x = bina.fit_transform(x)
Out[90]: 
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.]])

3. 定性特征啞編碼(one-hot encoding)

有些類別類型的變量一般無法直接應用在需要進行數值型計算的算法里,比如 LR,可以對這類特征變成多個二值特征(但這些特征會線性相關,因此在做回歸時,需要剔除一個特征,這個剔除的特征可以用其它特征線性表出)。例如,數據集中有2種性別[male,female],三種可能的地方[line1,line2,other],則會生成5個特征,前2個特征為編碼性別,接下來3個特征為地方編碼。可以有兩種實現方式:一種用sklearn自帶的OneHotEncoder(),但是這個方法要求輸入數據是數值型,即需要將[male,female]轉化成[1,0]這種類型;另一種實現方式是用pandas庫中的get_dummies()函數,這個不需要轉換,并且如果有數值類型的特征不需要啞編碼的時候,這種方法是比較適用的,它會自動檢測到,只對類別型變量進行啞編碼。

from sklearn import preprocessing
import pandas as pd
df = pd.DataFrame({'sex':['male','female','male'],'city':['line1','line2','other'],'value':[1,2,3.5]})
pd.get_dummies(df)
Out[164]: 
   value  city_line1  city_line2  city_other  sex_female  sex_male
0    1.0           1           0           0           0         1
1    2.0           0           1           0           1         0
2    3.5           0           0           1           0         1
##用OneHotEncoder()
enc = preprocessing.OneHotEncoder()
df = pd.DataFrame({'city':[0,1,2],'sex':[1,0,1]})
enc.fit_transform(df).toarray()
Out[169]: 
array([[ 1.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  1.]])

注意:啞編碼后的特征都是線性相關的,例如:上面的前3列是線性相關的,l3 = -l2 - l1 + 1,后兩列也是線性相關的,l4 = -l5 +1,其中li 表示第i列,因此在做模型訓練的時候要把其中相關的特征去掉,對于回歸模型尤其重要。

4. 數據標準化/中心化/歸一化

為了取消由于量綱不同、自身變異或者數值相差較大所引起的誤差,即使變量無量綱化,通常用到的方法有標準化,中心化,歸一化等。

  • 數據標準化(或者零-均值標準化):

    其中μ是樣本的均值,σ是樣本的標準差。

from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(x)
scaler.transform(x)
Out[93]: 
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])
  • 數據中心化:

    其中μ是樣本的均值。
    這個sklearn好像沒有現成的代碼,不過這個也很簡單,我自己寫了一個。

##axis=0,表示按列求均值
x-np.mean(x, axis=0)
Out[96]: 
array([[ 0.        , -1.        ,  1.66666667],
       [ 1.        ,  0.        , -0.33333333],
       [-1.        ,  1.        , -1.33333333]])
  • 數據歸一化:

    其中min是樣本中最小值,max是樣本中最大值,最大值與最小值非常容易受異常點影響。

from sklearn import preprocessing
minmaxscaler = preprocessing.MinMaxScaler()
minmaxscaler.fit_transform(x)
Out[100]: 
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])

5.生成多項式特征

在特征構造時,我們可能需要構造一些非線性特征或交叉特征,sklearn也提供了相應的函數,如果有兩個特征(x1,x2),則構造完后會生成(1, X1, X2, X1^2, X1X2, X2^ 2),python代碼如下:

from sklearn import preprocessing
##構造2次多項式, 默認也是2次
poly = preprocessing.PolynomialFeatures(2)
poly_x = poly.fit_transform(x)
poly_x 
Out[110]:
array([[ 1.,  1., -1.,  2.,  1., -1.,  2.,  1., -2.,  4.],
       [ 1.,  2.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  1., -1.,  0.,  0., -0.,  1., -1.,  1.]]) 
##查看多項式的名字
poly.get_feature_names()
Out[107]: ['1', 'x0', 'x1', 'x2', 'x0^2', 'x0 x1', 'x0 x2', 'x1^2', 'x1 x2', 'x2^2']

個人見解,如有錯誤,歡迎指正呀~
后面會繼續補充,歡迎關注呀~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容