一、數據缺失值處理
處理方法:
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
