如何进行变量筛选和特征选择(三)?交叉验证

01 模型简介

交叉验证是机器学习中常用的一种验证和选择模型的方法,常用的交叉验证方法是K折交叉验证。将原始数据分成K组(一般是均分),将每个子集分别作一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,k个模型的验证误差的均值即作为模型的总体验证误差,取多次验证的平均值作为验证结果,误差小的模型则为最优模型。k一般大于等于2,一般而言 k=10 (作为一个经验参数)算是相当足够了。

采用的R包是bestglm,主要函数是bestglm()。
结合一个二元Logistic回归的例子,分享如何运用R软件实现10折交叉验证。

02 加载数据

####加载数据
library(MASS)
data(biopsy)  ##R包自带乳腺癌患者的数据
biopsy<-biopsy[,-1]
names(biopsy) = c("thick", "u.size", "u.shape", "adhsn", "s.size", "nucl", "chrom", "n.nuc", "mit", "class")
biopsy.v2 <- na.omit(biopsy)#删失
biopsy.v2$class1 <- ifelse(biopsy.v2$class == "malignant", 1, 0)
data <- biopsy.v2[,-10]

03 全变量建立LR模型

set.seed(123) 
ind <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
## 按照7:3切分数据集
train <- data[ind==1, ] #得到训练集
test <- data[ind==2, ] #得到测试集
full.fit <- glm(class1 ~ ., family = binomial, data = train)

搭建完模型,运用predict()得到预测概率,保存测试集的预测概率。

test.probs <- predict(full.fit, newdata = test, type = "response")

04 10折交叉验证建立模型

library(bestglm)
Xy <- train
Bestglm.fit <- bestglm(Xy = Xy, IC = "CV", CVArgs = list(Method = "HTF",K = 10, REP = 1), family=binomial)

函数中IC = "CV"表示采用交叉验证,CVArgs 表示交叉验证的参数,k=10表示分成10份,REP=1是每次一份作为测试集,family=binomial 表示因变量为二项分布。该函数是利用最优子集回归的原理,对于不同数量的特征,都用k折交叉验证法求一个验证误差,最后比较验证误差与特征数量的关系,选取最优变量。

05 交叉验证变量筛选

将返回结果的cv列作图,可以看到在模型变量个数为3的时候,验证误差变得很小,之后随着变量个数增加,误差变化不大。利用coef()函数可查看最优变量。

plot(0:(dim(Xy)[2]-1),Bestglm.fit$Subsets$CV,type='b',xlab = "numbers of Features", ylab = "error",main = "error by Feature Inclusion")
      ##画出变量数量和误差之间的关系
coef(Bestglm.fit$BestModel)  ##查看最终选择的最优变量
##返回结果
(Intercept)       thick      u.size        nucl 
 -7.8147191   0.6188466   0.6582015   0.5725902
1.png

根据筛选的最优变量,搭建模型,运用predict()得到预测概率。

reduce.fit <- glm(class1 ~ thick + u.size + nucl, family = binomial, data = train)
test.cv.probs <- predict(reduce.fit, newdata = test, type = "response")

06 全变量模型和交叉验证模型对比

根据ROC曲线面积对比两个模型在测试集上的预测性能,检验P值>0.05,且AUC均接近于1,说明两模型预测性能一致且很好,但交叉验证得到的模型变量为3个,模型简洁,在实际运用中效率更高,因此可选择交叉验证的模型作为最优模型。

library(pROC)
roc1 <- roc(test$class1, test.cv.probs)
roc2 <- roc(test$class1,test.probs)
roc.re <- roc.test(roc1, roc2)  
roc.re$p.value  ## 0.2898906
roc.re$estimate
AUC of roc1   AUC of roc2 
0.9954803   0.9972672 

在构建模型做变量筛选方法比较多,在前面推文中给大家介绍了2个,可以翻看一下
如何进行高维变量筛选和特征选择(一)?Lasso回归
如何进行变量筛选和特征选择(二)?最优子集回归
以上就是本次跟大家分享的内容,觉得有用的话点赞、转发哦~

你可能感兴趣的:(如何进行变量筛选和特征选择(三)?交叉验证)