缺失值、異常值、重復值處理及啞變量變換


一、數據缺失值處理

處理方法:

1、刪除

2、補全:  常用補全方法有(1)用基本統計量填充(最大值、最小值、均值、中位數、眾數)

                                         (2) 用表內臨近值填充

                                         (3)用分類臨界值、基本統計量填充

                                         (4)用回歸模型填充,將缺失字段作為目標變量進行預測

                                         (5)多重插補

3、真值轉換法:該方法將缺失值也作為數據分布規律的一部分,將缺失值和實際值都作為輸入維度參與后續  數據處理和模型計算。

4、不處理:若后期的模型對缺失值有容忍度或有靈活的處理方法,則可不進行處理。常見的能夠自動處理缺失值的模型包括:KNN、決策樹、隨機森林、神經網絡、朴素貝葉斯、DBSCAN等。

#生成缺失數據
1
import numpy as np 2 import pandas as pd 3 df=pd.DataFrame(np.random.randn(6,3),columns=['var_1','var_2','var_3']) 4 df.ix[2,1:]=np.nan 5 df.ix[4:,0]=np.nan 6 print(df)

      var_1     var_2     var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318       NaN       NaN
3  1.101776  0.042510  0.333608
4       NaN -0.127705 -1.165975
5       NaN -1.027285 -0.005494
#查看缺失值
1
print(df[(df.isnull()).any(1)])

      var_1     var_2     var_3
2 -0.058318       NaN       NaN
4       NaN -0.127705 -1.165975
5       NaN -1.027285 -0.00549
#刪除有缺失值的行
1
df2=df.dropna() 2 print(df2)

var_1    var_2     var_3
0 -0.861766 -0.48522 -1.377067
1 -0.897174 -1.21441 -1.922518
3  1.101776  0.04251  0.333608
#用臨界值填補
1
df_ffill=df.fillna(method='ffill') #向前填充 2 print(df_ffill) 3 df_bfill=df.fillna(method='bfill') #向后填充 4 print(df_bfill)

  var_1     var_2     var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 -1.214410 -1.922518
3  1.101776  0.042510  0.333608
4  1.101776 -0.127705 -1.165975
5  1.101776 -1.027285 -0.005494

      var_1     var_2     var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318  0.042510  0.333608
3  1.101776  0.042510  0.333608
4       NaN -0.127705 -1.165975
5       NaN -1.027285 -0.00549
#用各列的均值填充
1
df_mean=df.fillna(df.mean()['var_1':'var_3']) 2 print(df_mean)

 var_1     var_2     var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 -0.562422 -0.827489
3  1.101776  0.042510  0.333608
4 -0.178870 -0.127705 -1.165975
5 -0.178870 -1.027285 -0.00549
#用指定值填充
1
df_num=df.fillna({'var_1':99,'var_2':100,'var_3':199}) 2 print(df_num)

     var_1       var_2       var_3
0  -0.861766   -0.485220   -1.377067
1  -0.897174   -1.214410   -1.922518
2  -0.058318  100.000000  199.000000
3   1.101776    0.042510    0.333608
4  99.000000   -0.127705   -1.165975
5  99.000000   -1.027285   -0.005494

 

二、異常值處理

異常值是數據分布的常態,處於特定分布區域或范圍之外的數據通常被定義為異常或噪聲。異常分為兩種:“偽異常”,由於特定的業務運營動作產生,是正常反應業務的狀態,而不是數據本身的異常;“真異常”,不是由於特定的業務運營動作產生,而是數據本身分布異常。通常異常值會在數據的預處理中被刪除掉。

下例代碼使用Z標准化得到的閥值作為判斷標准,當標准化后的得分超過閥值則為異常。

#生成異常值數據
1
import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'var_1':[1,2,3,4,5,6,150],'var_2':[3,4,180,1,2,5,3]}) 4 print(df)

  var_1  var_2
0      1      3
1      2      4
2      3    180
3      4      1
4      5      2
5      6      5
6    150      3
#判斷異常值
1
z_score=(df-df.mean())/df.std() 2 df_zscore=z_score.abs()>2.2 3 print(df_zscore)

 var_1  var_2
0  False  False
1  False  False
2  False   True
3  False  False
4  False  False
5  False  False
6   True  Fals
#用中位數替換掉異常值
1
df_num=df.copy() 2 df_num=pd.DataFrame(np.where(df_zscore,df_num.median(),df_num),columns=['var_1','var_2']) 3 print(df_num)

   var_1  var_2
0    1.0    3.0
1    2.0    4.0
2    3.0    3.0
3    4.0    1.0
4    5.0    2.0
5    6.0    5.0
6    4.0    3.0
#刪除異常值
1
df_drop=pd.DataFrame(np.where(df_zscore,np.nan,df),columns=['var_1','var_2']) 2 df_drop=df_drop.dropna() 3 print(df_drop)

   var_1  var_2
0    1.0    3.0
1    2.0    4.0
3    4.0    1.0
4    5.0    2.0
5    6.0    5.0

 

三、重復值處理

重復值處理的方法是去重,目的是保留能顯示特征的唯一記錄數據。

#生成重復數據
1
import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'var_1':['a','b','c','a'],'var_2':[4,5,6,4]}) 4 print(df)

 var_1  var_2
0     a      4
1     b      5
2     c      6
3     a      4
#判斷重復數據
1
df_isduplicated=df.duplicated(keep=False) #只要不是唯一值都顯示true 2 print(df_isduplicated) 3 print(df[df_isduplicated])

0     True
1    False
2    False
3     True
dtype: bool

  var_1  var_2
0     a      4
3     a      4
#刪除重復值
1
df_drop=df.drop_duplicates() 2 print(df_drop)

var_1  var_2
0     a      4
1     b      5
2     c      6

 

四、將分類變量轉換為啞變量

非數值型數據可以分為:(1)分類數據:分類數據中的值沒有大小、等級、好壞等的划分,僅僅表示不同的類別,例性別的划分。

                                        (2)順序數據:不同的類別有排序規律和邏輯層次的划分,例學歷的划分

非數值型數據轉換為數值型數據的最佳方法是:將分類變量轉換為啞變量矩陣。

不用數字來表示不同分類的原因是,這樣表示無法還原不同類別信息間的差異和相互關聯性。

對於分類數據,例性別,用1代表男性,2代表女性,數值1,2間有距離為1的差異,但實際上,男女性別是不存在這種差異的;對於順序數據,例學歷變量中的博士、研究生、學士分別用3,2,1來代表,如何確定這三個類別間距是1而不是其他值呢,因此有序數字的排序無法准確表達出順序數據的差異性。

#生成數據
1
import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'id':[111,222,333],'city':['beijing','tianjin','beijing'],'sex':['male','male','female'],'level':['high','middle','low']},columns=['id','city','sex','level']) 4 print(df)

    id     city     sex   level
0  111  beijing    male    high
1  222  tianjin    male  middle
2  333  beijing  female     low
#生成啞變量
1
df_dv=df.copy() 2 col=df.columns.delete(0) 3 for i in col: 4 new=pd.get_dummies(df_dv[i],prefix=i) 5 df_dv=df_dv.join(new) 6 df_dv=df_dv.drop(i,axis=1) 7 print(df_dv)

    id  city_beijing  city_tianjin  sex_female  sex_male  level_high  level_low  level_middle
0  111             1             0           0         1           1     0             0
1  222             0             1           0         1           0           0             1
2  333             1             0           1         0           0           1             0

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM