目录
缺失值产生的原因
- 机械原因:由于机械原因导致的数据收集或保存的失败造成的数据缺失,如收集车流量数据的地感线圈损坏等
- 人为原因: 由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据等
完全变量与不完全变量
数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量
缺失值的类型
- 完全随机缺失(Missing Completely at Random, MCAR)。数据的缺失与不完全变量以及完全变量都是无关的,比如家庭地址的缺失
- 随机缺失(Missing at Random, MAR)。数据的缺失仅仅依赖于完全变量,例如财务数据缺失情况与企业大小有关
- 非随机,不可忽略缺失(Not Missing at Random,NMAR, or nonignorable)。不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的,比如高收入人群不愿意提供他们的收入数据
缺失值的处理方法
- 直接删除法
- 填充法
- K最近距离邻法(K-means clustering)
- 多重填补(Multiple Imputation,MI)
直接删除法
直接删除含有缺失值的数据项,当含有缺失值的数据项只占总体数据量很小的一部分时效果最好
填充法
- 手动填充法(filling manually):在数据量较小的情况下可能是最好的方法,因为一般来说数据所有者对各列数据的含义更加清楚,手动填充后效果更好,但是在数据量较大时无法操作
- 特殊值填写 (Treating Missing Attribute values as Special values):将空值作为一种特殊的值来处理,比如R语言中的NA,python中的None,操作简单方便,但是可能对预测结果造成一定的影响,不推荐使用
- 平均值填充(Mean/Mode Completer): 将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值
K最近距离邻法(K-means clustering)
先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据
多重填补(Multiple Imputation,MI)
多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
缺失值处理的类库
sklearn中关于缺失值的处理类
R语言通过mice包应用多重插补的步骤
代码实现
- 直接删除法(Drop Columns with Missing Values)
cols_with_missing = [col for col in X_train.columns if X_train[col].isnull().any()]
# Drop columns in training and validation data
reduced_X_train = X_train.drop(cols_with_missing, axis=1)
reduced_X_valid = X_valid.drop(cols_with_missing, axis=1)
- 填充法(Filling method)
# Imputation
# use SimpleImputer to replace missing values with the mean value along each column.
my_imputer = SimpleImputer()
imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid))
# Imputation removed column names; put them back
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns
- K最近距离邻法(K-means clustering)
imputer = KNNImputer(n_neighbors=2, weights="uniform")
Imputed_X = imputer.fit_transform(X)
- 多重填补(Multiple Imputation,MI)
#R语言:基于mice包的分析通常分析过程:
library(mice)
imp<-mice(data,m)
fit<-with(imp,analysis)#analysis是一个表达式对象,设定用于m个插补数据集的统计方法。
pooled<-pool(fit)
summary(pooled)
参考资料
来源:oschina
链接:https://my.oschina.net/u/4265622/blog/4318184