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

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

作者: 小易学统计 | 来源:发表于2021-08-27 23:01 被阅读0次

    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回归
    如何进行变量筛选和特征选择(二)?最优子集回归
    以上就是本次跟大家分享的内容,觉得有用的话点赞、转发哦~

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/xvsviltx.html