十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
(一)个案剔除法(Listwise Deletion) 最常见、最简单的处理缺失数据的方法是用个案剔除法(listwise deletion),也是很多统计软件(如SPSS和SAS)默认的缺失值处理方法。在这种方法中如果任何一个变量含有缺失数据的话,就把相对应的个案从分析中剔除。如果缺失值所占比例比较小的话,这一方法十分有效。至于具体多大的缺失比例算是“小”比例,专家们意见也存在较大的差距。有学者认为应在5%以下,也有学者认为20%以下即可。然而,这种方法却有很大的局限性。它是以减少样本量来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息。在样本量较小的情况下,删除少量对象就足以严重影响到数据的客观性和结果的正确性。因此,当缺失数据所占比例较大,特别是当缺数据非随机分布时,这种方法可能导致数据发生偏离,从而得出错误的结论。 (二)均值替换法(Mean Imputation) 在变量十分重要而所缺失的数据量又较为庞大的时候,个案剔除法就遇到了困难,因为许多有用的数据也同时被剔除。围绕着这一问题,研究者尝试了各种各样的办法。其中的一个方法是均值替换法(mean imputation)。我们将变量的属性分为数值型和非数值型来分别进行处理。如果缺失值是数值型的,就根据该变量在其他所有对象的取值的平均值来填充该缺失的变量值;如果缺失值是非数值型的,就根据统计学中的众数原理,用该变量在其他所有对象的取值次数最多的值来补齐该缺失的变量值。但这种方法会产生有偏估计,所以并不被推崇。均值替换法也是一种简便、快速的缺失数据处理方法。使用均值替换法插补缺失数据,对该变量的均值估计不会产生影响。但这种方法是建立在完全随机缺失(MCAR)的假设之上的,而且会造成变量的方差和标准差变小。 (三)热卡填充法(Hotdecking) 对于一个包含缺失值的变量,热卡填充法在数据库中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。最常见的是使用相关系数矩阵来确定哪个变量(如变量Y)与缺失值所在变量(如变量X)最相关。然后把所有个案按Y的取值大小进行排序。那么变量X的缺失值就可以用排在缺失值前的那个个案的数据来代替了。与均值替换法相比,利用热卡填充法插补数据后,其变量的标准差与插补前比较接近。但在回归方程中,使用热卡填充法容易使得回归方程的误差增大,参数估计变得不稳定,而且这种方法使用不便,比较耗时。 (四)回归替换法(Regression Imputation) 回归替换法首先需要选择若干个预测缺失值的自变量,然后建立回归方程估计缺失值,即用缺失数据的条件期望值对缺失值进行替换。与前述几种插补方法比较,该方法利用了数据库中尽量多的信息,而且一些统计软件(如Stata)也已经能够直接执行该功能。但该方法也有诸多弊端,第一,这虽然是一个无偏估计,但是却容易忽视随机误差,低估标准差和其他未知性质的测量值,而且这一问题会随着缺失信息的增多而变得更加严重。第二,研究者必须假设存在缺失值所在的变量与其他变量存在线性关系,很多时候这种关系是不存在的。 (五)多重替代法(Multiple Imputation) 多重估算是由Rubin等人于1987年建立起来的一种数据扩充和统计分析方法,作为简单估算的改进产物。首先,多重估算技术用一系列可能的值来替换每一个缺失值,以反映被替换的缺失数据的不确定性。然后,用标准的统计分析过程对多次替换后产生的若干个数据集进行分析。最后,把来自于各个数据集的统计结果进行综合,得到总体参数的估计值。由于多重估算技术并不是用单一的值来替换缺失值,而是试图产生缺失值的一个随机样本,这种方法反映出了由于数据缺失而导致的不确定性,能够产生更加有效的统计推断。结合这种方法,研究者可以比较容易地,在不舍弃任何数据的情况下对缺失数据的未知性质进行推断。NORM统计软件可以较为简便地操作该方法
碑林网站建设公司创新互联,碑林网站设计制作,有大型网站制作公司丰富经验。已为碑林成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的碑林做网站的公司定做!
缺失值的处理有3种:不处理(做建模铁定不选),删除(可以考虑),数据补差(99%的同僚选择)
而补差的方式主要用下面的5类,重点是第五个,插值法
1. 补插均值/中位数/众数
2. 使用固定值 .
3. 最近邻补插
4. 回归方法
5. 插值法
插值法又包含好多种:(1)拉格朗日插值法(最容易看的懂的,用的人较多,用错的也多)(2)牛顿插值法(3)Hermite插值 (4)分段插值 (5)样条插值 (后三种相对用的较少)
(1)拉格朗日插值法(划重点)
其原理百度就是构建一个多项式,这个多项式很厉害,假如说我们的数据是城市里的银行位置坐标,那这个多项式就是一条过所有银行的公路,所以,当我们要问50km外的银行在哪儿时,我们顺着这条路算就可以算出来。当然,算出来的坐标只是一个近似值。(当给出的已知银行坐标点越多,近似误差越小)。
关于拉格朗日多项式的构建原理,这里不说了,百度各种解释,这里只说一下它的优缺点:优点就是过程简单,很容易找到插值,而且还是唯一的。缺点也明显,就是当已知的点很多时候,阶数也会很高,所以不适合插那些百十来个数据点的题。处理十来个的还是很好的。(我个人建议还是用牛顿)
(2)牛顿插值法8
相比较与拉格朗日,其优点是当新增加插值点时,得到的拟合函数变化不大。其原理解释还是看百度或者找老师问吧,我的理解就是从第一个插值点开始修路,每修到一个银行就进行一次校正(高阶差商我的理解),然后这样的话插未知点就准一点。所以用的比较多吧也。
(x-c(1,2,3,NA))
is.na(x) #返回一个逻辑向量,TRUE为缺失值,FALSE为非缺失值
table(is.na(x)) #统计分类个数
sum(x) #当向量存在缺失值的时候统计结果也是缺失值
sum(x,na.rm = TRUE) #很多函数里都有na.rm=TRUE参数,此参数可以在运算时移除缺失值
(x[which(is.na(x))]-0) #可以用which()函数代替缺失值,which()函数返回符合条件的响应位置
(test-data.frame(x=c(1,2,3,4,NA),y=c(6,7,NA,8,9)))
is.na(test) #test中空值的判断
which(is.na(test),arr.ind = T) #arr.ind=T可以返回缺失值的相应行列坐标
test[which(is.na(test),arr.ind = T)]-0 #结合which进行缺失替代
(test_omit-na.omit(data.frame(x=c(1,2,3,4,NA),y=c(6,7,NA,8,9)))) #na.omit函数可以直接删除值所在的行
str(airquality)
complete.cases(airquality) #判断个案是否有缺失值
airquality[complete.cases(airquality),] #列出没有缺失值的行
nrow(airquality[complete.cases(airquality),]) #计算没有缺失值的样本量
airquality[!complete.cases(airquality),] #列出有缺失的值的行
nrow(airquality[!complete.cases(airquality),]) #计算有缺失值的样本量
is.na(airquality$Ozone) #TRUE为缺失值,FALSE为非缺失值
table(is.na(airquality$Ozone))
complete.cases(airquality$Ozone) #FALSE为缺失值,TRUE为非缺失值
table(complete.cases(airquality$Ozone))
可用sum()和mean()函数来获取关于缺失数据的有用信息
sum(is.na(airquality$Ozone)) #查看缺失值的个数
sum(complete.cases(airquality$Ozone)) #查看没有缺失值的个数
mean(is.na(airquality$Ozone)) #查看缺失值的占比
mean(is.na(airquality)) #查看数据集airquality中样本有缺失值的占比
列表缺失值探索
library(mice)
md.pattern(airquality)
图形缺失值探索
library(VIM)
aggr(airquality,prop=FALSE,number=TRUE)
aggr(airquality,prop=TRUE,number=TRUE) #生成相同的图形,但用比例代替了计数
aggr(airquality,prop=FALSE,number=FALSE) #选项numbers = FALSE(默认)删去数值型标签
airquality[complete.cases(airquality),] #方法一:删除缺失值行
na.omit(airquality) #方法二:删除缺失值的行
newnhanes2-nhanes2
sub-which(is.na(newnhanes2[,4])) #返回newnhanes2数据集中第4列NA的行标识
datatr-newnhanes2[-sub,] #方法一:将第4列不为NA的数存入数据集datatr中
datatr-newnhanes2[complete.cases(newnhanes2[,4]),] #方法二:将第4列不为NA的数存入数据集datatr中
datate-newnhanes2[sub,] #方法一:将第4列为NA的数存入数据集datate中
datate-newnhanes2[is.na(newnhanes2[,4]),] #方法二:将第4列为NA的数存入数据集datate中
fit-lm(chl~age,data = datatr) #利用datatr中age为自变量,chl为因变量构建线性回归模型lm
newnhanes2[sub,4]-round(predict(fit,datate)) #利用datate中数据按照模型fit对nhanes2中chl中的缺失数据进行预测
library(missForest)
z-missForest(airquality) #用随机森林迭代弥补缺失值
air.full-z$ximp
zz-missForest(nhanes2)
nhanes2.full-zz$ximp
mice::md.pattern(airquality)
index1-is.na(airquality$Ozone) #对Ozone变量进行缺失值处理
dput(colnames(airquality)) #求出变量列名称
Ozone_train-airquality[!index1,c("Ozone", "Wind", "Temp", "Month", "Day")] #训练集,需注意什么时候用!,什么时候用-
Ozone_test-airquality[index1,c("Ozone", "Wind", "Temp", "Month", "Day")] #测试集
fit-lm(Ozone~.,data = Ozone_train) #建立线性回归模型
summary(fit)
airquality[index1,"Ozone"]-predict(fit,newdata =Ozone_test )
index2-is.na(airquality$Solar.R) #Solar.R变量进行缺失值处理,Ozone变量数据已补齐
Solar.R_train-airquality[!index2,] #训练集
Solar.R_test-airquality[index2,] #测试集
Solar.R_fit-lm(Solar.R~.,data = Solar.R_train)
summary(Solar.R_fit)
airquality[index2,"Solar.R"]-predict(Solar.R_fit,newdata = Solar.R_test)
mice::md.pattern(airquality)
举例:knn和bag缺失值插补(利用caret包中的preProcess函数,method参数有多种方式可选)
question-read.csv("问卷调研数据.csv")
question-question[,-1]
str(question)
for(i in 1:ncol(question)){
question[,i]-as.factor(question[,i])
} #批量修改为因子类型
str(question)
question-read.csv("问卷调研数据.csv")
question-question[,-1]
mice::md.pattern(question) #列表缺失值探索
library(caret)
knn.model-preProcess(question,method = "knnImpute") #KNN处理数值型数据(欧式距离),不能处理因子型数据
question1-predict(knn.model,newdata = question)
install.packages("RANN")
mice::md.pattern(question1)
table(question1$性别) #不是之前的1和2了
table(question$性别)
最后结果:knn不适合处理该数据,需要做哑变量处理,再套模型
question-read.csv("问卷调研数据.csv")
question-question[,-1]
mice::md.pattern(question) #列表缺失值探索
library(caret)
bag.model-preProcess(question,method = "bagImpute") #bag算法模型建立
install.packages("ipred")
question2-predict(bag.model,question) #预测结果
mice::md.pattern(question2) #列表缺失值探索
table(question2$性别)
最后结果:bag算法不适合处理该数据
由于调查、编码和录入误差,数据中可能存在一些无效值和缺失值,需要给予适当的处理。常用的处理方法有:估算,整例删除,变量删除和成对删除。
计算机俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。由硬件系统和软件系统所组成,没有安装任何软件的计算机称为裸机。
可分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五类,较先进的计算机有生物计算机、光子计算机、量子计算机、神经网络计算机。蛋白质计算机等。
当今计算机系统的运算速度已达到每秒万亿次,微机也可达每秒几亿次以上,使大量复杂的科学计算问题得以解决。例如:卫星轨道的计算、大型水坝的计算、24小时天气预报的计算等,过去人工计算需要几年、几十年,而现在用计算机只需几天甚至几分钟就可完成。
科学技术的发展特别是尖端科学技术的发展,需要高度精确的计算。计算机控制的导弹之所以能准确地击中预定的目标,是与计算机的精确计算分不开的。一般计算机可以有十几位甚至几十位(二进制)有效数字,计算精度可由千分之几到百万分之几,是任何计算工具所望尘莫及的。
随着计算机存储容量的不断增大,可存储记忆的信息越来越多。计算机不仅能进行计算,而且能把参加运算的数据、程序以及中间结果和最后结果保存起来,以供用户随时调用;还可以对各种信息(如视频、语言、文字、图形、图像、音乐等)通过编码技术进行算术运算和逻辑运算,甚至进行推理和证明。
计算机内部操作是根据人们事先编好的程序自动控制进行的。用户根据解题需要,事先设计好运行步骤与程序,计算机十分严格地按程序规定的步骤操作,整个过程不需人工干预,自动执行,已达到用户的预期结果。
超级计算机(supercomputers)通常是指由数百数千甚至更多的处理器(机)组成的、能计算普通PC机和服务器不能完成的大型复杂课题的计算机。超级计算机是计算机中功能最强、运算速度最快、存储容量最大的一类计算机,是国家科技发展水平和综合国力的重要标志。
超级计算机拥有最强的并行计算能力,主要用于科学计算。在气象、军事、能源、航天、探矿等领域承担大规模、高速度的计算任务。
在结构上,虽然超级计算机和服务器都可能是多处理器系统,二者并无实质区别,但是现代超级计算机较多采用集群系统,更注重浮点运算的性能,可看着是一种专注于科学计算的高性能服务器,而且价格非常昂贵。
一般的超级计算器耗电量相当大,一秒钟电费就要上千,超级计算器的CPU至少50核也就是说是家用电脑的10倍左右,处理速度也是相当的快,但是这种CPU是无法购买的,而且价格要上千万。
建议:不同场景下的数据缺失机制不同,这需要工程师基于对业务选择合适的填充方法。
如何判断缺失值类型?
缺失值的分类按照数据缺失机制可分为:
可忽略的缺失
不可忽略的缺失
平常工作中遇到的缺失值大部分情况下是随机的(缺失变量和其他变量有关)
这个就可以用estimator来做了,选其中一个变量(y),然后用其他变量作为X,随便选个值填充X的缺失部分,用X train一个estimator,再预测y的缺失部分(大致思路)
此外有些数据是符合某种分布的,利用这个分布呢也可以填充缺失的数据,如(EM算法)
处理缺失数据的三个标准:
1. 非偏置的参数估计
不管你估计means, regressions或者是odds ratios,都希望参数估计可以准确代表真实的总体参数。在统计项中,这意味着估计需要是无偏的。有缺失值可能会影响无偏估计,所以需要处理。
2. 有效的能力:
删除缺失数据会降低采样的大小,因此会降低power。如果说问题是无偏的,那么得到的结果会是显著的,那么会有足够的能力来检验这个效力(have adequate power to detect your effects)。反之,整个检测可能失效。
3. 准确的标准差(影响p值和置信区间):
不仅需要参数估计无偏,还需要标准差估计准确,在统计推断中才会有效。
缺失值处理的方法大致分为这几类:1、删除法;2、基于插补的方法;3、基于模型的方法; 4、不处理; 5、映射高维
有些处理方法是基于完全随机缺失假设(MCAR),一般来说,当数据不是 MCAR 而 是随机缺失(MAR)时,这些方法是不适用的;而有些方法(如似然估计法)在 MAR 的假设下是适用的,因此,在进行缺失数据处理时,首先需要认真分析缺失数 据产生的原因,然后采取有针对性的补救措施,这样才能够获得无偏或弱偏估计。
此处关于使用多重插补来处理非随机缺失(MNAR)的问题,它其实效果不一定,也可能出现效果倒退的情况,总的说多重更适合MAR
注:此处一元与多元指的是仅有一个特征有缺失值与多个特征有缺失值
对于不同类别的缺失值的处理方法如上图。
以下展开介绍各个方法:
注: k-means插补 与KNN插补很相似,区别在于k-means是利用无缺失值的特征来寻找最近的N个点,然后用这N个点的我们所需的缺失的特征平均值来填充,而KNN则是先用均值填充缺失值再找最近的N个点。
类似的还有 随机回归插补 :也优于纯回归插补
其他单一插补法:
与单一插补方法相比较,多重插补方法充分地考虑了数据的不确定性。多重插补的主要分为三个步骤,综合起来即为:插补、分析、合并。插补步是为每个缺失值都构造出 m 个可能的插补值,缺失模型具有不确定性,这些插补值能体现出模型的这个性质,利用这些可能插补值对缺失值进行插补就得到了 m 个完整数据集。分析步是对插补后的 m 个完整数据集使用一样的统计数据分析方法进行分析,同时得到 m 个统计结果。综合步就是把得到的这 m 个统计结果综合起来得到的分析结果,把这个分析结果作为缺失值的替代值。多重插补构造多个插补值主要是通过模拟的方式对估计量的分布进行推测,然后采用不同的模型对缺失值进行插补,这种插补是随机抽取的方式,这样以来能提高估计的有效性和可靠性。
多重插补-python手册
多重插补法主要有以下几种:
(使用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。)
基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。如果带有缺失值的列是数值变量,采用回归模型补全;如果是分类变量,则采用分类模型补全。
常见能够自动处理缺失值模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等。
处理思路:
自动插补 :例如XGBoost会通过training loss reduction来学习并找到最佳插补值。
忽略 :缺失值不参与距离计算,例如:KNN,LightGBM
将缺失值作为分布的一种状态 :并参与到建模过程,例如:决策树以及变体。
不基于距离做计算 :因此基于值得距离计算本身的影响就消除了,例如:DBSCAN。
ID3、c4.5、cart、rf到底是如何处理缺失值的?
最精确的做法,把变量映射到高维空间。
比如性别,有男、女缺失三种情况,则映射成3个变量:是否男、否女、是否缺失。连续型变量也可以这样处理。比如Google、 百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。又或者可根据每个值的频数,将频数较小的值归为一类'other',降低维度。此做法可最大化保留变量的信息。
前推法 (LOCF,Last Observation Carried Forward,将每个缺失值替换为缺失之前的最后一次观测值)与 后推法 (NOCB,Next Observation Carried Backward,与LOCF方向相反——使用缺失值后面的观测值进行填补)
这是分析可能缺少后续观测值的纵向重复测量数据的常用方法。纵向数据在不同时间点跟踪同一样本。当数据具有明显的趋势时,这两种方法都可能在分析中引入偏差,表现不佳。
线性插值 。此方法适用于具有某些趋势但并非季节性数据的时间序列。
季节性调整+线性插值 。此方法适用于具有趋势与季节性的数据。
总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并不一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。
具体的方法采用还需要考虑多个方面的:
在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。
总结来说,没有一个最完美的策略,每个策略都会更适用于某些数据集和数据类型,但再另一些数据集上表现很差。虽然有一些规则能帮助你决定选用哪一种策略,但除此之外,你还应该尝试不同的方法,来找到最适用于你的数据集的插补策略。
当前最流行的方法应该是 删除法、KNN、多重插补法 。
参考文献: 庞新生. 缺失数据处理方法的比较[J]. 统计与决策, 2010(24):152-155.
处理缺失值的四种方法:
1、删除含有缺失值的个案
主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。
把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。
对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。
2、可能值插补缺失值
它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。
在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。常用的有如下几种方法。
(1)均值插补。数据的属性分为定距型和非定距型。如果缺失值是定距型的,就以该属性存在值的平均值来插补缺失的值;如果缺失值是非定距型的,就根据统计学中的众数原理,用该属性的众数(即出现频率最高的值)来补齐缺失的值。
(2)利用同类均值插补。同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。
如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。
(3)极大似然估计。在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化。
该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
(4)多重插补(MultipleImputation,MI)。多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。