RWeka中ReplaceMissingValues过滤器失效:处理后仅返回27条记录
问题:RWeka处理缺失值后数据行数骤减的原因?
我正在用R语言的RWeka包探索Weka功能,步骤是:
- 用
ReplaceWithMissingValue过滤器给iris数据集故意添加缺失值(缺失概率设为0.3) - 尝试用
ReplaceMissingValues无监督过滤器填补缺失值
但处理后的数据框只返回27条记录,原数据集和添加缺失值后的数据集行数都是正常的。以下是我用的代码:
data<-select(iris,Species,everything()) # ADDING THE MISSING VALUES miss<-make_Weka_filter("weka.filters.unsupervised.attribute.ReplaceWithMissingValue") data.miss<-miss(data,control=Weka_control(P=.3)) %>% select(Species,everything()) # REPLACING BY MEAN found<-make_Weka_filter("weka.filters.unsupervised.attribute.ReplaceMissingValues") data.found<-found(data.miss) nrow(data) nrow(data.miss) nrow(data.found)
问题原因与解决办法
嘿,我知道你为啥踩这个坑了!问题的核心是你直接用dplyr的select()去操作RWeka返回的特殊对象了!
RWeka的过滤器(比如你用的miss())返回的不是咱们平时用的标准R数据框,而是Weka_instances类的对象——这个东西不仅存着数据,还带着Weka运行必须的元数据:比如哪一列是分类标签(Class属性)、每列的数据类型是数值还是分类等等。你直接用dplyr::select()去改这个对象,会把这些元数据搞乱,导致后面的ReplaceMissingValues过滤器根本没法正确识别你的数据,最后就出现了莫名其妙的行数截断。
另外还有个Weka的默认规则得提一下:ReplaceMissingValues是无监督过滤器,它只会填补特征列的缺失值,如果它认定的Class属性(标签列)有缺失,会直接删掉整行。要是因为元数据乱了,它把某列特征误当成了Class,那缺失值多的话,删完剩下的行数自然就少得离谱了。
给你两个解决办法:
- 先转成数据框再调列顺序:用完
ReplaceWithMissingValue之后,先把返回的Weka_instances转成标准数据框,再用dplyr调整列顺序,这样就不会破坏元数据了:
data<-select(iris,Species,everything()) # ADDING THE MISSING VALUES miss<-make_Weka_filter("weka.filters.unsupervised.attribute.ReplaceWithMissingValue") # 先转成data.frame再select data.miss<-miss(data,control=Weka_control(P=.3)) %>% as.data.frame() %>% select(Species,everything()) # REPLACING BY MEAN found<-make_Weka_filter("weka.filters.unsupervised.attribute.ReplaceMissingValues") data.found<-found(data.miss) # 查看行数 nrow(data) nrow(data.miss) nrow(data.found)
- 明确指定Class属性(更稳妥):为了避免Weka瞎猜哪列是Class,你可以在调用
ReplaceMissingValues时,手动指定Class列的位置(比如Species是第1列):
# 填补时指定第1列(Species)为Class data.found<-found(data.miss, control=Weka_control(classIndex=1))
这样过滤器就只会删掉Species列有缺失的行,其他列的缺失值会自动用均值(数值型列)或众数(分类列)填补,行数就正常了——大概会剩下105左右,毕竟每个Species值有30%的概率缺失嘛。
内容的提问来源于stack exchange,提问作者Fernando Menendez
相关产品推荐
相关产品推荐

