前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习之交叉验证

机器学习之交叉验证

作者头像
小一
发布2019-08-14 15:58:47
7140
发布2019-08-14 15:58:47
举报
文章被收录于专栏:谓之小一谓之小一
1.交叉验证简介

交叉验证(Cross Validation)是在机器学习建立模型和验证模型参数时常用的方法。顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。用训练集来训练模型,测试集来评估模型的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的样本,在下次可能成为测试集中的样本,也就是所谓的交叉

2.为什么用交叉验证?

  • 交叉验证用在数据量不是很充足的情况(比如数据量小于一万条),能够从有限的数据中获取尽可能多的有效信息。
  • 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,能够一定程度上减小过拟合。

3.交叉验证方法

3.1 留出法交叉验证

留出法(Hold-Out Cross Validation)是一种简单交叉验证,即针对原始数据集,通常分为训练集、测试集。训练集用于训练模型、测试集对于模型来说是未知数据,用于评估模型的泛化能力。

比如我们随机的将样本数据分为两部分(70%的训练集,30%的测试集),然后用训练集来训练模型,测试集上验证模型及参数,最后选择损失函数评估最优的模型和参数。 

代码语言:javascript
复制
from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#留出法
X_train, X_test, y_train, y_test = model_selection.train_test_split(digits.data, digits.target, test_size = 0.3, shuffle = True)
3.2 k折交叉验证

k折交叉验证(k-fold Cross Validation)过程如下所示:

  1. 不重复抽样将原始数据随机分成k份。
  2. 每次挑选其中1份作为测试集,剩余k-1份作为训练集用于训练模型。
  3. 重复第2步k次,在每个训练集上训练后得到一个模型。用这个模型在相应的测试集上测试,计算并保存模型的评估指标。
  4. 计算k组测试结果的平均值作为模型准确度的估计,并作为当前k折交叉验证下模型的性能指标。

k一般取10,数据量大的时候,k可以设置的小一些。数据量小的时候,k可以设置的大一些,这样训练集占整体数据的比例就比较大,不过同时训练的模型个数也就相应增加。

代码语言:javascript
复制
from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#K折交叉验证
#设置K为5
kf = model_selection.KFold(n_splits=5)
#使用5折交叉验验证划分数据集,返回一个生成器对象(即索引)
digits_gen = kf.split(digits.data)
for train_idx, test_idx in digits_gen:
        X_train = digits.data[train_idx] #训练集
        X_test = digits.data[test_idx] #测试集
        y_train = digits.target[train_idx] #训练集标签
        y_test = digits.target[test_idx] #测试及标签
3.3 留一法交叉验证

留一法交叉验证(Leave-one-out Cross Validation)是k折交叉验证的特例,此时的k等于样本数N。因此,对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型的好坏。此方法主要适用于数据量非常小的情况,比如N小于50的时候,推荐采用留一交叉验证。

代码语言:javascript
复制
from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#留一法交叉验证
loo = model_selection.LeaveOneOut()
digits_gen = loo.split(digits.data)
for train_idx, test_idx in digits_gen:
        X_train = digits.data[train_idx]
        X_test = digits.data[test_idx]
        y_train = digits.target[train_idx]
        y_test = digits.target[test_idx]
3.4 交叉验证方法选择

那这三种情况,到底应该选择哪一种方法呢?其实很简单,如果我们只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以。否则就用k折交叉验证。在样本量少的时候,使用留一交叉验证。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 谓之小一 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.为什么用交叉验证?
  • 3.交叉验证方法
    • 3.1 留出法交叉验证
      • 3.2 k折交叉验证
        • 3.3 留一法交叉验证
          • 3.4 交叉验证方法选择
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档