k折交叉验证(R语言)

96
小沁_3ca9
2017.11.26 13:19 字数 1050

原文链接: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

扫描二维码,关注我们。

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

快来关注我们吧!

日记本
Web note ad 1