k折交叉验证(R语言)

作者: 三猫后端 | 来源:发表于2017-11-26 13:19 被阅读2249次

    原文链接:k折交叉验证(R语言)

    微信公众号:机器学习养成记    搜索添加微信公众号:chenchenwings


    机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为影响模型效果的重要因素。本文介绍一种常用的划分最优训练集和测试集的方法——k折交叉验证。

    k折交叉验证

    K折交叉验证(k-fold cross-validation)首先将所有数据分割成K个子样本,不重复的选取其中一个子样本作为测试集,其他K-1个样本用来训练。共重复K次,平均K次的结果或者使用其它指标,最终得到一个单一估测。

    这个方法的优势在于,保证每个子样本都参与训练且都被测试,降低泛化误差。其中,10折交叉验证是最常用的。

    实例代码

    线性分类器与性能评价(R语言)中,我们将数据集随机抽取70%作为训练集,剩下30%作为测试集,通过线性回归的方法进行预测,通过ROC和AUC评价模型效果。现在,我们使用k折交叉验证的方法,选取最优的训练集和测试集,建立线性分类器并评价模型效果。

    1、数据导入并分组。导入数据,并使用caret包中的createFolds()函数,根据标签列将数据分成10份 。

    target.url <- 'https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data'

    data <- read.csv(target.url,header = F)

    set.seed(17)

    require(caret)

    folds <- createFolds(y=data[,61],k=10)

    2、选取最优训练集与测试集。构建for循环,得到十次交叉验证预测的AUC值。并纪录取值最大的一组,作为最优的训练集与测试集划分。

    library(pROC)

    max=0

    num=0

    auc_value<-as.numeric()

    for(i in 1:10){

    fold_test <- data[folds[[i]],]   #取folds[[i]]作为测试集

    fold_train <- data[-folds[[i]],]   # 剩下的数据作为训练集

    fold_pre <- lm(as.numeric(V61)~.,data=fold_train)

    fold_predict <- predict(fold_pre,type='response',newdata=fold_test)

    auc_value<- append(auc_value,as.numeric(auc(as.numeric(fold_test[,61]),fold_predict)))

    }

    num<-which.max(auc_value)

    print(auc_value)

    10次auc取值结果如下:

    [1] 0.7636364 0.7474747 0.8484848 0.9363636 0.7272727 0.8454545 0.9181818 0.7454545 0.7979798

    [10] 0.7916667

    3、构建分类器并判断模型效果。根据前一步的结果,使用最优划分构建线性分类器并预测。绘制出测试集的ROC曲线。

    fold_test <- data[folds[[num]],]

    fold_train <- data[-folds[[num]],]

    fold_pre <- lm(as.numeric(V61)~.,data=fold_train)

    fold_predict <- predict(fold_pre,type='response',newdata=fold_test)

    roc_curve <- roc(as.numeric(fold_test[,61]),fold_predict)

    plot(roc_curve, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),

    grid.col=c("green", "red"), max.auc.polygon=TRUE,

    auc.polygon.col="skyblue", print.thres=TRUE,main="ROC curve for the set with the largest AUC value")

    线性分类器与性能评价(R语言)中随机选取训练集和测试集,最终测试集的AUC值仅为0.755,而本次我们通过k折交叉验证选取训练集和测试集,测试集AUC值达到0.936,可以看出模型效果提升显著。


    推荐文章:

    第一弹->小案例(一):商业街抽奖

    第二弹->小案例(二):面包是不是变轻了

    第三弹->小案例(三):调查问卷

    第四弹->小案例(四):销售额下滑

    第五弹->小案例(五):销量预测

    第六弹->小案例(六):预测小偷行为

    第七弹->小案例(七):口碑分析(python)

    机器学习养成记

    搜索添加微信公众号:chenchenwings

    扫描二维码,关注我们。

    如需转载,请在开篇显著位置注明作者和出处,并在文末放置机器学习养成记二维码和添加原文链接。

    快来关注我们吧!

    相关文章

      网友评论

        本文标题:k折交叉验证(R语言)

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