用交叉验证改善模型的预测表现-着重k重交叉验证

时间:2022-05-21 07:34:42

机器学习技术在应用之前使用“训练+检验”的模式(通常被称作”交叉验证“)。

用交叉验证改善模型的预测表现-着重k重交叉验证

预测模型为何无法保持稳定?

让我们通过以下几幅图来理解这个问题:

用交叉验证改善模型的预测表现-着重k重交叉验证

此处我们试图找到尺寸(size)和价格(price)的关系。三个模型各自做了如下工作:

  1. 第一个模型使用了线性等式。对于训练用的数据点,此模型有很大误差。这样的模型在初期排行榜和最终排行榜都会表现不好。这是“拟合不足”(“Under fitting”)的一个例子。此模型不足以发掘数据背后的趋势。
  2. 第二个模型发现了价格和尺寸的正确关系,此模型误差低/概括程度高。
  3. 第三个模型对于训练数据几乎是零误差。这是因为此关系模型把每个数据点的偏差(包括噪声)都纳入了考虑范围,也就是说,这个模型太过敏感,甚至会捕捉到只在当前数据训练集出现的一些随机模式。这是“过度拟合”(“Over fitting”)的一个例子。这个关系模型可能在初榜和终榜成绩变化很大。

在应用中,一个常见的做法是对多个模型进行迭代,从中选择表现更好的。然而,最终的分数是否会有改善依然未知,因为我们不知道这个模型是更好的发掘潜在关系了,还是过度拟合了。为了解答这个难题,我们应该使用交叉验证(cross validation)技术。它能帮我们得到更有概括性的关系模型。

实际上,机器学习关注的是通过训练集训练过后的模型对测试样本的分类效果,我们称之为泛化能力。左右两图的泛化能力就不好。在机器学习中,对偏差和方差的权衡是机器学习理论着重解决的问题。

什么是交叉验证?

交叉验证意味着需要保留一个样本数据集,不用来训练模型。在最终完成模型前,用这个数据集验证模型。

交叉验证包含以下步骤:

  1. 保留一个样本数据集。--测试集
  2. 用剩余部分训练模型。--训练集
  3. 用保留的数据集(测试集)验证模型。

这样做有助于了解模型的有效性。如果当前的模型在此数据集也表现良好,那就带着你的模型继续前进吧!它棒极了!

交叉验证的常用方法是什么?

交叉验证有很多方法。下面介绍其中几种:

1. “验证集”法

保留 50% 的数据集用作验证,剩下 50% 训练模型。之后用验证集测试模型表现。不过,这个方法的主要缺陷是,由于只使用了 50% 数据训练模型,原数据中一些重要的信息可能被忽略。也就是说,会有较大偏误。

2. 留一法交叉验证 ( LOOCV )

这种方法只保留一个数据点用作验证,用剩余的数据集训练模型。然后对每个数据点重复这个过程。这个方法有利有弊:

  • 由于使用了所有数据点,所以偏差较低。
  • 验证过程重复了 n 次( n 为数据点个数),导致执行时间很长。
  • 由于只使用一个数据点验证,这个方法导致模型有效性的差异更大。得到的估计结果深受此点的影响。如果这是个离群点,会引起较大偏差。

3. K 层交叉验证 (K- fold cross validation)

从以上两个验证方法中,我们学到了:

  1. 应该使用较大比例的数据集来训练模型,否则会导致失败,最终得到偏误很大的模型。
  2. 验证用的数据点,其比例应该恰到好处。如果太少,会导致验证模型有效性时,得到的结果波动较大。
  3. 训练和验证过程应该重复多次(迭代)。训练集和验证集不能一成不变。这样有助于验证模型有效性。

是否有一种方法可以兼顾这三个方面?

答案是肯定的!这种方法就是“ K 层交叉验证”这种方法简单易行。简要步骤如下:

  1. 把整个数据集随机分成 K“层”
  2. 用其中 K-1 层训练模型,然后用第K层验证。
  3. 记录从每个预测结果获得的误差。
  4. 重复这个过程,直到每“层”数据都作过验证集。
  5. 记录下的 k 个误差的平均值,被称为交叉验证误差(cross-validation error)。可以被用做衡量模型表现的标准。
  1. 把整个数据集随机分成 K“层”

  2. 对于每一份来说:

    1).以该份作为测试集,其余作为训练集; (用其中 K-1 层训练模型,然后用第K层验证)

    2).在训练集上得到模型

    3).在测试集上得到生成误差,这样对每一份数据都有一个预测结果;(记录从每个预测结果获得的误差)

  3. 记录下的 k 个误差的平均值,被称为交叉验证误差(cross-validation error)。可以被用做衡量模型表现的标准

  4. 误差最小的那一个模型。

通常。此算法的缺点是计算量较大。

当 k=10 时,k 层交叉验证示意图如下:

用交叉验证改善模型的预测表现-着重k重交叉验证

这里一个常见的问题是:“如何确定合适的k值?”

记住,K 值越小,偏误越大,所以越不推荐。另一方面,K 值太大,所得结果会变化多端。K 值小,则会变得像“验证集法”;K 值大,则会变得像“留一法”(LOOCV)。所以通常建议的值是 k=10 。

如何衡量模型的偏误/变化程度?

K 层交叉检验之后,我们得到 K 个不同的模型误差估算值(e1, e2 …..ek)。理想的情况是,这些误差值相加得 0 。要计算模型的偏误,我们把所有这些误差值相加。平均值越低,模型越优秀。

模型表现变化程度的计算与之类似。取所有误差值的标准差,标准差越小说明模型随训练数据的变化越小

我们应该试图在偏误和变化程度间找到一种平衡。降低变化程度、控制偏误可以达到这个目的。这样会得到更好的预测模型。进行这个取舍,通常会得出复杂程度较低的预测模型。

Python Code

from sklearn import cross_validation

model = RandomForestClassifier(n_estimators=100)

#简单K层交叉验证,10层。

cv = cross_validation.KFold(len(train), n_folds=10, indices=False)

results = []

# "Error_function" 可由你的分析所需的error function替代

for traincv, testcv in cv:

probas = model.fit(train[traincv], target[traincv]).predict_proba(train[testcv])

results.append( Error_function )

print "Results: " + str( np.array(results).mean() )

R Code

library(data.table)
library(randomForest)
data <- iris
str(data)
#交叉验证,使用rf预测sepal.length
k = 5
data$id <- sample(1:k, nrow(data), replace = TRUE)
list <- 1:k
# 每次迭代的预测用数据框,测试用数据框
# the folds
prediction <- data.table()
testsetCopy <- data.table()
# 写一个进度条,用来了解CV的进度
progress.bar <- create_progress_bar("text")
progress.bar$init(k)
#k层的函数
for(i in 1:k){
# 删除id为i的行,创建训练集
# 选id为i的行,创建训练集
trainingset <- subset(data, id %in% list[-i])
testset <- subset(data, id %in% c(i))
#运行一个随机森林模型
mymodel <- randomForest(trainingset$Sepal.Length ~ ., data = trainingset, ntree = 100)
#去掉回应列1, Sepal.Length
temp <- as.data.frame(predict(mymodel, testset[,-1]))
# 将迭代出的预测结果添加到预测数据框的末尾
prediction <- rbind(prediction, temp)
# 将迭代出的测试集结果添加到测试集数据框的末尾
# 只保留Sepal Length一列
testsetCopy <- rbind(testsetCopy, as.data.frame(testset[,1]))
progress.bar$step()
}
# 将预测和实际值放在一起
result <- cbind(prediction, testsetCopy[, 1])
names(result) <- c("Predicted", "Actual")
result$Difference <- abs(result$Actual - result$Predicted)
# 用误差的绝对平均值作为评估
summary(result$Difference)


原文链接:

http://www.analyticsvidhya.com/blog/2015/11/improve-model-performance-cross-validation-in-python-r/

http://datartisan.com/article/detail/62.html

用交叉验证改善模型的预测表现-着重k重交叉验证的更多相关文章

  1. 模型选择---KFold,StratifiedKFold k折交叉切分

    StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同. 例子: import numpy as np from sklearn.m ...

  2. Spark机器学习——模型选择与参数调优之交叉验证

    spark 模型选择与超参调优 机器学习可以简单的归纳为 通过数据训练y = f(x) 的过程,因此定义完训练模型之后,就需要考虑如何选择最终我们认为最优的模型. 如何选择最优的模型,就是本篇的主要内 ...

  3. 小白学习之pytorch框架&lpar;7&rpar;之实战Kaggle比赛:房价预测&lpar;K折交叉验证、&ast;args、&ast;&ast;kwargs&rpar;

    本篇博客代码来自于<动手学深度学习>pytorch版,也是代码较多,解释较少的一篇.不过好多方法在我以前的博客都有提,所以这次没提.还有一个原因是,这篇博客的代码,只要好好看看肯定能看懂( ...

  4. 小白学习之pytorch框架&lpar;6&rpar;-模型选择&lpar;K折交叉验证&rpar;、欠拟合、过拟合&lpar;权重衰减法&lpar;&equals;L2范数正则化&rpar;、丢弃法&rpar;、正向传播、反向传播

    下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) ...

  5. 模型验证与模型集成&lpar;Ensemble&rpar;

    作者:吴晓军 原文:https://zhuanlan.zhihu.com/p/27424282 模型验证(Validation) 在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证 ...

  6. cross&lowbar;val&lowbar;score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考

    因为sklearn cross_val_score 交叉验证,这个函数没有洗牌功能,添加K 折交叉验证,可以用来选择模型,也可以用来选择特征 sklearn.model_selection.cross ...

  7. 机器学习--K折交叉验证和非负矩阵分解

    1.交叉验证 交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法. 于是可以先在一个子集上做 ...

  8. Kaggle竞赛入门(二):如何验证机器学习模型

    本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的 ...

  9. &period;Net高级进阶,WebApi和MVC进行模型验证的时候,教你如何*控制需要进行验证的字段?

    现在,你有一个MVC架构的web项目,你要完成一个注册功能. 前台传了3个值到你的控制器,分别是账号.密码.邮箱. 如图:现在你要在控制器里面判断,账号名称.密码.邮箱不能为空,并且名称和密码不超过1 ...

随机推荐

  1. centos下python中添加easygui模块

    前提:python中要集成Tkinter,Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同 ...

  2. string和stringstream用法总结

    参考:http://blog.csdn.net/xw20084898/article/details/21939811

  3. html树形菜单控件

    html树形菜单控件  链接 http://www.ithao123.cn/content-713974.html         jQuery plugin: Treeview  这个插件能够把无序 ...

  4. 编程思想—面向切面编程&lpar;AOP&rpar;

    谈到面向切面的编程,我们很容易关联到面向对象编程(OOP).个人对这两种编程方式的解释为:两种编程思想只是站在编程的角度问题. OOP注重的是对象,怎么对对象行为和方法的抽象.如何封装一个具有完整属性 ...

  5. Java基础知识强化07:打印出空心菱形

    1.如图打印出空心菱形: 2.下面是逻辑实现代码: package himi.hebao04; import java.util.Scanner; public class TestDemo08 { ...

  6. Linux服务器断电导致挂载及xfs文件损坏的修复方法

    系统文件损坏后进入紧急修复模式,无法进行维护工作 welcome to emergency mode!after logging in ,type "journalctl -xb" ...

  7. PAT甲级 1001 A&plus;B Format

    题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805528788582400 1001 A+B Format ( ...

  8. 在Qt中调用Mupdf库进行pdf显示

    2018.5.10 更新内存对齐说明 感谢知乎网友@孤独子狮 指出QImage处需要考虑内存对齐的问题.因为本人缺乏跨平台.图形库开发经验,所以在调试成功后就没有深入探究. 主要修改了QImage的构 ...

  9. 《Linux内核设计与实现》读书笔记 3

    第三章 进程管理 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于程序,还包含其他资源(打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内催音社的内存地址空间及一个或多个执行线 ...

  10. &lbrack;转&rsqb;ubuntu bits&sol;predefs&period;h:没有那个文件或目录

    [转]ubuntu bits/predefs.h:没有那个文件或目录 (2012-04-28 10:09:38) 转载▼ 标签: it 分类: Linux In file included from ...