《应用预测建模》Applied Predictive Modeling (2013) by Max Kuhn and Kjell Johnson,林荟等译
第三章 数据预处理
3. 1 UCI 机器学习数据库中有一个关于玻璃鉴定的数据。数据由214 个玻璃样本组成,分别被标记为7 个分类中的1 个。有9个预测变量,包括折射率和八种化学元素的百分比: Na, Mg, Al, Si, K,Ca, Ba 和Fe 。
(a)使用可视化展示预测变量分布以及预测变量间的关系。
(b)数据中是何存在离群值?有没有预测变量是有偏的?
(c)是否存在针对一个或多个预测变量的变换能够改进分类模型?
library(mlbench)
data(Glass)
str(Glass)
head(Glass)
> str(Glass)
'data.frame': 214 obs. of 10 variables:
$ RI : num 1.52 1.52 1.52 1.52 1.52 ...
$ Na : num 13.6 13.9 13.5 13.2 13.3 ...
$ Mg : num 4.49 3.6 3.55 3.69 3.62 3.61 3.6 3.61 3.58 3.6 ...
$ Al : num 1.1 1.36 1.54 1.29 1.24 1.62 1.14 1.05 1.37 1.36 ...
$ Si : num 71.8 72.7 73 72.6 73.1 ...
$ K : num 0.06 0.48 0.39 0.57 0.55 0.64 0.58 0.57 0.56 0.57 ...
$ Ca : num 8.75 7.83 7.78 8.22 8.07 8.07 8.17 8.24 8.3 8.4 ...
$ Ba : num 0 0 0 0 0 0 0 0 0 0 ...
$ Fe : num 0 0 0 0 0 0.26 0 0 0 0.11 ...
$ Type: Factor w/ 6 levels "1","2","3","5",..: 1 1 1 1 1 1 1 1 1 1 ...
> head(Glass)
RI Na Mg Al Si K Ca Ba Fe Type
1 1.52101 13.64 4.49 1.10 71.78 0.06 8.75 0 0.00 1
2 1.51761 13.89 3.60 1.36 72.73 0.48 7.83 0 0.00 1
3 1.51618 13.53 3.55 1.54 72.99 0.39 7.78 0 0.00 1
4 1.51766 13.21 3.69 1.29 72.61 0.57 8.22 0 0.00 1
5 1.51742 13.27 3.62 1.24 73.08 0.55 8.07 0 0.00 1
6 1.51596 12.79 3.61 1.62 72.97 0.64 8.07 0 0.26 1
(a)使用可视化展示预测变量分布以及预测变量间的关系。
画出各个预测变量的直方图:
par(mfrow=c(3,3))
myHist <- function(x) {
hist(Glass[,x],xlab=x,main="直方图")
}
sapply(names(Glass[-10]), myHist)
par(mfrow=c(1,1))
画出各个变量的散点图:
#pairs()函数可以创建基础的散点图矩阵
pairs(Glass)
#只对自变量做图
pairs(Glass[-10])
#scatterplotMatrix()函数默认在非对角线区域绘制变量间的散点图,并添加平滑和线性拟合曲线。对角线区域绘制每个变量的密度图和轴须图。
library(car)
scatterplotMatrix(Glass[-10],
spread=FALSE, smoother.args=list(lty=2),
main="Scatter Plot Matrix ")
可见 RI与Ga、Si呈较明显的线性关系
求预测变量之间的相关性:
correlations<-cor(Glass[-10])#求相关性 默认为pearson
library(corrplot)#可视化
corrplot(correlations,order='hclust', tl.cex = 1.35)
RI与Ga、RI与Si、Al与Mg、Mg与Ba的相关系数最大。
这预示着如果我们用线性回归模型建模,可能不能同时包含RI与Ga(0.81),因为在线性回归模型中,使用高度相关的变量可能会给出极不稳定的模型,以致数值计算的错误,以及弱化模型预测能力(p33)
(b)数据中是何存在离群值?有没有预测变量是有偏的?
画出箱线图
#箱线图
par(mfrow=c(3,3))
myBoxplot <- function(x) {
boxplot(Glass[,x],xlab=x,main="箱线图")
}
sapply(names(Glass[-10]), myBoxplot)
par(mfrow=c(1,1))
可见,除了Mg,都有离群点
参考:比上四分位数Q1小1.5∗IQR,比下四分位数Q3大1.5∗IQR都可视为离群点
IQR=Q3-Q1
计算偏态系数:
library(e1071)
ske<-apply(Glass[-10],2,skewness)#e1071 计算偏度
names(ske[ske>1]) #强烈有偏 #"RI" "K" "Ca" "Ba" "Fe"
ske.ind<-which(ske>1)#索引
> ske
RI Na Mg Al Si K Ca Ba Fe
1.6027151 0.4478343 -1.1364523 0.8946104 -0.7202392 6.4600889 2.0184463 3.3686800 1.7298107
因此,强烈有偏的为"RI" "K" "Ca" "Ba" "Fe"
注:上图来自于本人教授的课件。
(c)是否存在针对一个或多个预测变量的变换能够改进分类模型?
可单独对强烈有偏的"RI" "K" "Ca" "Ba" "Fe" 进行box-cox变换,也可对数据集整体应用box-cox变换
#可单独对强烈有偏的"RI" "K" "Ca" "Ba" "Fe" 进行box-cox变换,也可对数据集整体应用box-cox变换
#本代码尝试仅对强烈有偏的"RI" "K" "Ca" "Ba" "Fe" 进行box-cox变换
summary(Glass) #Mg K Ba Fe 有0值,不能直接用box-cox变换,需要添加一个常数,进行整体平移
#使用循环
Glass_trans<-Glass
for(i in 1:9){
if(min(Glass[i])==0 & i %in% ske.ind)
Glass_trans[i]=Glass[i]+1.e-6
}
apply(Glass_trans[-10],2,min)
#进行box-cox变换
library(caret)
for(i in ske.ind){
trans<-BoxCoxTrans(Glass_trans[,i])
Glass_trans[,i] <- predict(trans, Glass_trans[,i])
}
head(Glass_trans)
apply(Glass_trans[-10],2,skewness)#e1071 计算偏度
apply(Glass[-10],2,skewness)#e1071 计算偏度
> head(Glass_trans)
RI Na Mg Al Si K Ca Ba Fe Type
1 0.2838746 13.64 4.490001 1.10 71.78 -1.9000690 0.8254539 -625.4716 -13.81551 1
2 0.2829051 13.89 3.600001 1.36 72.73 -0.6587792 0.8145827 -625.4716 -13.81551 1
3 0.2824954 13.53 3.550001 1.54 72.99 -0.8202988 0.8139144 -625.4716 -13.81551 1
4 0.2829194 13.21 3.690001 1.29 72.61 -0.5172764 0.8195032 -625.4716 -13.81551 1
5 0.2828507 13.27 3.620001 1.24 73.08 -0.5472905 0.8176698 -625.4716 -13.81551 1
6 0.2824323 12.79 3.610001 1.62 72.97 -0.4176998 0.8176698 -625.4716 -1.34707 1
> apply(Glass_trans[-10],2,skewness)#e1071 计算偏度
RI Na Mg Al Si K Ca Ba Fe
1.5656604 0.4478343 -1.1364523 0.8946104 -0.7202392 -0.7821621 -0.1939557 1.6756661 0.7442440
> apply(Glass[-10],2,skewness)#e1071 计算偏度
RI Na Mg Al Si K Ca Ba Fe
1.6027151 0.4478343 -1.1364523 0.8946104 -0.7202392 6.4600889 2.0184463 3.3686800 1.7298107
可见,box-cox变化极大调整了k、Ca、Ba、Fe的偏度。