【数据清洗】处理异常值和缺失值目录参考

【数据清洗】处理异常值和缺失值目录参考

  • 识别异常值
  • 处理异常值
  • 缺失值插补
    • 插补方法
    • 插值效果检验
    • 处理缺失值的R包

我本来,就只是想随便看一下有啥正儿八经处理异常值的方法,看着看着心想,看都看了那随手记一下总结一下好了,结果…我…怎么这么多陌生名词…
都是在CSDN四处搜刮的信息,存在大段复制粘贴,本来只是写在记事本里,就没有贴原链接。

识别异常值

异常点检测,采用异常点检测算法对样本进行分析:
a.常用的异常点检测算法包括偏差检测,例如聚类,最近邻等;
b.基于统计的异常点检测算法,例如极差,四分位数间距,均差,标准差等;
c.基于距离的异常点检测算法,主要通过距离方法来检测异常点,遍历所有的数据点之间的距离,与大部分数据的距离都比较远的点,就是异常点,主要使用的距离度量方法有绝对距离(曼哈顿距离)、欧氏距离和马氏距离等方法;
d.基于密度的异常点检测算法,normal数据一定是处于密度集中的区域,abnormal数据一定是在相对稀疏的领域,考察当前点周围密度,可以发现局部异常点,例如LOF算法;
e.其他异常检测算法,如Isolation Forest算法。

方法1:Boxplot / 四分位数和四分位距。boxplot.stats()
方法2:当前值在平均值的±3个标准差之外。
方法3:(趋势数据)moving window,该点超出邻近n个点(window)的均值±3个标准差之外,则判断为异常值。
方法4:(趋势数据)去掉该点时线性模型R方的变化,增加超过某值,则判断为异常值。
方法5:(机器学习方法)SVM(支持向量机,非监督学习)、随机森林(很多很多决策树组成的森林投票出结果,RandomForestClassifier和RandomForestRegressor)、Isolation Forest算法(Isolation Forest的思路就是,如果是normal数据,你需要更多地切割平面才能区分这条数据。如果是abnormal数据,就可以用较少的平面切割。和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择)、LOF算法(Local Outlier Factor,可以满足密度分散情况迥异的集合的异常点识别,使用包‘DMwR’和包‘dprep’中的lofactor()可以计算LOF算法中的局部异常因子。)
方法6:(多样品数据,用于GWAS全基因组关联分析)PCA

处理异常值

方法1:改成NA,然后和缺失值一起插补。
方法2:盖帽法,整行替换数据框里99%以上和1%以下的点,将99%以上的点值=99%的点值;小于1%的点值=1%的点值。

缺失值插补

插补方法

方法1:简单(非随机)插补。即用某个值(如均值、中位数或众数)来替换变量中的缺失值。注意,替换是非随机的,这意味着不会引入随机误差(与多重插补不同)。简单插补的一个优点是,解决“缺失值问题”时不会减少分析过程中可用的样本量。虽然 简单插补用法简单,但对于非MCAR(完全随机缺失)的数据会产生有偏的结果。若缺失数据的数目非常大,那么简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验的p值。应尽量避免使用该方法。选择中位数、平均数、众数中哪一个由分布决定,近似正态分布:均值插补;偏态分布:中位数插补。

library(Hmisc)
impute(env$Ca,mean)        ####平均值
impute(env$K,median)       ####中位数
env$Ca<-impute(env$Ca,mean)       ####平均值,适用于接近正态分布
env$K<-impute(env$K,median)       ####中位数,偏态不是很严重

方法2:回归插补,最大似然插补。

inputfile$date <- as.numeric(inputfile$date)  # 将日期转换成数值型变量,为了下边的回归插补法。
sub <- which(is.na(inputfile$sales))  # 识别缺失值所在行数
inputfile1 <- inputfile[-sub, ]  # 将数据集分成完整数据和缺失数据两部分
inputfile2 <- inputfile[sub, ]
model <- lm(sales ~ date, data = inputfile1)  # 回归模型拟合
inputfile2$sales <- predict(model, inputfile2)  # 模型预测
result3 <- rbind(inputfile1, inputfile2)

方法3:多重插补(Multiple Imputation)。思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

方法4:KNN(K临近法)。根据样本观测值之间的相关性,利用欧氏距离寻找与缺失观测最相似的k个样本中的观测,填补缺失值,DMwR包中knnInputation()函数可以实现这种方法。

方法5:(机器学习类)决策树、随机森林(很多很多决策树组成的森林投票出结果)等等。

方法6:(图像处理类)图像缩放的核心也就是怎么样根据已知图像计算目标图像的各点像素值。最邻近插值(近邻取样法)、双线性内插值(四邻域乘以相应的权重决定)、三次卷积法算法(4*4邻域乘以相应的权重决定)。

插值效果检验

在计算插补效果需要用到DMwR包的regr.eval()函数,结果中的mape值越小越好。

处理缺失值的R包

Amelia、mice和mi包 多重插补
Hmisc 包含多种函数,支持简单插补、多重插补和典型变量插补
mvnmle 对多元正态颁数据中缺失值的最大似然估计
cat 对数线性模型中多元类别型变量的多重插补
arrayImpute\arraryMissPattern、SeqKnn 处理微阵列缺失值数据的实用函数
longitudinalData 相关的函数列表,比如对时间序列缺失值进行插补的一系列函数

  • 因为在做时间序列相关的数据,所以留意了一下这个包,里面的imputation()函数主要有5类插补方法:(i)linearInterpol.bisector:局域线性插补(用缺失点周围的点做线性)-末端点就近复制locf|按照全局趋势global|按照局域线性趋势local|同时考虑全局和局域bisector;(ii)copyMean.bisector:局域线性插补+复制t时其他点的均值(效果最好);(iii)就近复制-向前复制|向后复制(效果太差不建议使用);(iv)trajMean:简单插补-均值|中位数|随机一个数;(v)crossMean:交叉插补-复制t时其他点的均值|中位数|随机一个数。

kmi 处理生存分析缺失值的Kaplan-Meier多重插补
mix 一般位置模型中混合类别型和连续型数据的多重插补
pan 多元面板数据或聚类的多重插补

大规模时间序列数据自动异常检测架构:EGADS,是雅虎开发的、开源、可扩展的,异常检测综合系统。EGADS框架由三个主要部分组成:时间序列建模模块(TMM),异常检测模块(ADM)和报警模块(AM)。给定一个时间序列,TMM组件模拟产生时间序列,由ADM和AM组件进行消费处理,分别计算误差并过滤不感兴趣的异常。TMM提供时间t的xt的预测值,由ut表示。我们也将这个量称为xt的预期值(不要与期望的数学概念混淆)。TMM可以是机器学习模型,其基于数据或基于规则进行预测,在时间t上挖掘数据点xt的具体表现特征(如波动或异常)。目前,EGADS能够检测出三类异常:

  • 异常值:给定输入时间序列x,异常值是时间戳值对(t,xt),其中观测值xt与该时间序列的期望值(即 E(xt))不同。
  • 波动点(Change Points):给定输入时间序列x,波动点是指在某个时间t,其状态(行为)在这个时间序列上表现出与t前后的值不同。
  • 异常时间序列:给定一组时间序列X={xi},异常时间序列xj∈X是在X上与大多数时间序列值不一致的部分。

你可能感兴趣的:(数据清洗)