奇异值检测和处理
本文介绍数据奇异值检测和处理的知识。数据奇异值若是不检测和处理,会影响模型准确性,甚至对预测形成误导。
-
1 为什么要奇异值检测和处理
-
2 奇异值检测
-
2.1 单变量方法
-
2.2 双变量方法
-
2.3 多变量模型方法
-
2.4 奇异值包:outliers
-
3 奇异值处理
1 为什么要奇异值检测和处理
因为奇异值可以大大地偏向或者改变拟合估计和预测。
举例说明:汽车数据集,对比没有奇异值和有奇异值的简单线性回归模型的拟合,然后做预测。
R代码
## 汽车数据集
data(cars)
dim(cars)
par(mfrow = c(1,2))
## 原始数据集
cars1 <- cars[1:30, ]
## 情形一:没有奇异值
plot(
cars1$speed,
cars1$dist,
xlim = c(0, 28),
ylim = c(0, 230),
main = "没有奇异值 n 简单线性回归模型",
xlab = "速度",
ylab = "距离",
pch = "*",
col = "red",
cex = 2
)
abline(
lm(dist ~ speed, data = cars1),
col = "blue",
lwd = 3,
lty = 2
)
## 情形二:有奇异值
## 人工构造奇异值
cars.outliers <- data.frame(
speed = c(19, 19, 20, 20, 20),
dist = c(190, 186, 210, 220, 218)
)
cars2 <- rbind(cars1, cars.outliers)
plot(
cars2$speed,
cars2$dist,
xlim = c(0, 28),
ylim = c(0, 230),
main = "有奇异值 n 简单线性回归模型",
xlab = "速度",
ylab = "距离",
pch = "*",
col = "red",
cex = 2
)
abline(
lm(dist ~ speed, data = cars2),
col = "blue",
lwd = 3,
lty = 2
)
结果
总结
异常值导致预测模型斜率的变化,若是利用异常值数据拟合模型(右图),导致预测结果带来高误差。
2 奇异值检测
2.1 单变量方法
对于连续变量,奇异值位于1.5IQR范围之外。
IQR = 75%四分位数-25%四分位数
R代码
## 数据获取
url <- "http://rstatistics.net/wp-content/uploads/2015/09/ozone.csv"
inputData <- read.csv(url)
## 异常值
outlier.values <- boxplot.stats(
inputData$pressure_height
)$out
print(outlier.values)
par(mfrow=c(1,1))
## 异常值可视化
boxplot(
inputData$pressure_height,
main = "Pressure Height",
boxwex=0.1
)
mtext(
paste("Outliers: ", paste(outlier.values, collapse=", ")),
cex=0.6
)
结果
2.2 双变量方法
双变量x和y的盒子图,x是类别变量。
R代码
par(mfrow=c(1,2))
boxplot(
ozone_reading ~ Month,
data = inputData,
main = "Ozone reading across months"
)
boxplot(
ozone_reading ~ Day_of_week,
data = inputData,
main = "Ozone reading for days of week"
)
结果
总结
由图可知,月份对臭氧变化有影响,而星期没有。异常值见盒子图中空心圆圈。
2.3 多变量模型方法
Cooks Distance,简称CD
计算每个样本(观测)对预测结果的影响程度。
一般情况,一个样本的CD大于4倍CD的平均值,则被当做对预测是有影响力,这样的样本,可以当做异常值处理。
代码
mod <- lm(ozone_reading ~ ., data=inputData)
cooksd <- cooks.distance(mod)
par(mfrow=c(1,1))
plot(
cooksd,
pch = "*",
cex = 2,
main = "Influential Obs by Cooks distance"
)
abline(
h = 4 * mean(cooksd, na.rm = TRUE),
col = "red"
)
text(
x=1:length(cooksd)+1,
y=cooksd,
labels=ifelse(cooksd>4*mean(cooksd, na.rm=T),names(cooksd),""),
col="red"
)
influential <- as.numeric(names(cooksd)[(cooksd > 4*mean(cooksd, na.rm=T))]) # influential row numbers
View(head(inputData[influential, ]))
结果
2.4 奇异值包:outliers
outliers异常值包提供了许多有用函数来做异常值检测和处理,特别是outlier() 和scores() 函数。
奇异值包outliers的使用方法,阅读包文档。
3 奇异值处理
方法一:插值替换法
使用均值或者中位数或者众数填补
方法二:预测法
把异常值当做NA,然后利用NA的处理方法,拟合恰当模型,预测出NA的值
参考资料:
1 R做异常值检测:http://r-statistics.co/Outlier-Treatment-With-R.html
文章推荐:
2 R语言做数据探索
3 电商评论情感分析
公众号推荐:
数据科学与人工智能,分享数据科学和人工智能的内容。
阅读原文,更多精彩!
分享是收获,传播创价值!
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!