1、人工填補 該方法僅適用於小數據集,受個人因素影響。
2、平均值填補 對某一列的缺失值,采用該列的平均值填充
df.fillna(method=a.mean(),inplace=True)
#此處重點講解一下fillna的參數,后面不做說明
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
#value:固定值,可以用固定數字、均值、中位數、眾數等,此外還可以用字典,series等形式數據;
#method:填充方法,'bfill','backfill','pad','ffill'
#axis: 填充方向,默認0和index,還可以填1和columns
#inplace:在原有數據上直接修改
#limit:填充個數,如1,每列只填充1個缺失值
3、臨近值填補 對每一列的缺失值,采用臨近位置的數據進行填充。
#使用每列缺失值前面的值進行填充(按相應列填充,按照相應index前后填充)
df.fillna(method='ffill',inplace=True)
df.fillna(method='pad',inplace=True)
#使用每列缺失值后面的值進行填充(按相應列填充,按照相應index前后填充)
df.fillna(method='backfill',inplace=True)
df.fillna(method='bfill',inplace=True)
#使用每列缺失值前面的值進行填充(按相鄰列填充,按照相應columns前后填充)
df.fillna(method='ffill',inplace=True,axis=1)
df.fillna(method='pad',inplace=True,axis='columns')
#使用每列缺失值后面的值進行填充(按相鄰列填充,按照相應columns前后填充)
df.fillna(method='backfill',inplace=True,axis=1)
df.fillna(method='bfill',inplace=True,axis='columns')
對每一列的缺失值,采用臨近位置上下兩個值的平均值來填充
#上下兩個值的平均值進行填充
df=df.fillna(df.interpolate())
#在此詳細介紹下interpolate函數的參數:'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'spline', 'barycentric', 'polynomial'
4、中位數填補 對每列的數值采用中位數進行填補
df.fillna(df.median(),inplace=True)
5、眾數填補 對每列數值采用眾數填補
df.fillna(df.mode(),inplace=True)
6、回歸填補 對於有缺失值的特征值,將已知特征值代入模型來估計未知特征值,以此估計值來進行填充,該填充方法適用於缺失值為定量的數據類型。
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
#data為缺失的數據集
imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit(data)
print(np.round(imp.transform(data)))
7、熱平台填補
-
熱平台插補又被稱為熱卡插補,是從每一缺失數據的估計分布抽取插補值來取代缺失值,使用回答單元中的抽樣分布作為抽樣分布是常見的方法。熱卡插補包括隨機抽樣插補、分層熱卡插補、最近距離熱卡插補和序貫熱卡插補。
-
隨機抽樣插補。缺失值為Missing Completely at Random,MCAR,即完全隨機缺失的情況下,對某個確實字段進行簡單隨機抽樣、限制對回答單元的使用次數、對回答單元進行排序並進行抽樣;
-
分層熱卡填補。首先按照某些輔助變量對y進行分層,然后對分層的數據進行熱卡插補;
-
最近距離熱卡插補。利用輔助變量,定義一個測量單元間距離的函數,在變量y的無回答單元臨近的回答單元中,選擇滿則設定的距離條件的輔助變量中的單元所對應的變量y的回答單元作為插補值。由於使用較為復雜的距離函數,很難對插補后的均值和方差等估計量的性質進行考察;
-
序貫熱卡填充。基於最近距離熱卡插補來實現的,首先對數據分層,在每層中按照選定的某個輔助變量排序,並在其前后相鄰的10個數據中,找到是的設定的某一個距離函數的值達到最小的單元,使用該單元對應的變量y的回答單元作為插補值。
8、冷平台填補 從以前的調查中或其他信息來源中獲得,如歷史數據。
9、極大似然估計 缺失類型為隨機缺失的條件下,假設模型對於完整的樣本是正確的,那么通過觀測數據的邊際分布可以對未知參數進行極大似然估計。這種方法也被稱為忽略缺失值的極大似然估計,對於極大似然的參數估計實際中常采用的計算方法是期望值最大化。該方法適用於大樣本。
10、k均值聚類法 該方法又被稱為K最近距離鄰法。實現方式為:采用k-means聚類將所有樣本進行聚類划分,然后再通過划分的種類的均值對各自類中的缺失值進行填補。
11、隨機森林填補 采用隨機森林來對缺失值進行擬合。
from sklearn import ensemble
from sklearn.preprocessing import LabelEncoder
def set_missing(df,estimate_list,miss_col):
"""df要處理的數據幀,estimate_list用來估計缺失值的字段列表,miss_col缺失字段名稱;會直接在原來的數據幀上修改"""
col_list=estimate_list
col_list.append(miss_col)
process_df = df.loc[:,col_list]
class_le= LabelEncoder()
for i in col_list[:-1]:
process_df.loc[:,i]=class_le.fit_transform(process_df.loc[:,i].values)
#分成已知該特征和未知該特征兩部分
known=process_df[process_df[miss_col].notnull()].values
known[:, -1]=class_le.fit_transform(known[:, -1])
unknown = process_df[process_df[miss_col].isnull()].values
#X為特征屬性值
X = known[:, :-1]
#y為結果標簽值
y = known[:, -1]
#fit到RandomForestRegressor之中
rfr = ensemble.RandomForestRegressor(random_state=1, n_estimators=200,max_depth=4,n_jobs=-1)
rfr.fit(X,y)
#用得到的模型進行未知特征值預測
predicted = rfr.predict(unknown[:, :-1]).round(0).astype(int)
predicted=class_le.inverse_transform(predicted)
print(predicted)
# 用得到的預測結果填補原缺失數據
df.loc[(df[miss_col].isnull()), miss_col] = predicted
return df
#還可以用決策樹做擬合
from sklearn import tree
dt=tree.DecisionTreeRegressor()
dt.fit(X,y)
predicted = clf.predict(unknown[:, :3]).round(0)
predicted=class_le.inverse_transform(predicted)
print(predicted)
12、趨勢得分法
13、馬爾科夫鏈蒙德洛夫法