(一)交叉验证

交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。在交叉验证中,数据被多次划分,并且需要训练多个模型。

最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。

5折交叉验证:
1、将数据划分为(大致)相等的 5 部分,每一部分叫作折(fold)
2、训练一系列模型,每折轮流作为测试集评估精度,其他作为训练集训练模型

mglearn.plots.plot_cross_validation()


得到5个精度值

通常来说,数据的前五分之一是第 1 折,第二个五分之一是第 2 折,以此类推。

一、scikit-learn中的交叉验证

scikit-learn 是利用 model_selection 模块中的 cross_val_score 函数来实现交叉验证的。cross_val_score 函数的参数是我们想要评估的模型、训练数据与真实标签。

(1)对 LogisticRegression 进行评估

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegressioniris = load_iris()
logreg = LogisticRegression()scores = cross_val_score(logreg, iris.data, iris.target)
print("Cross-validation scores: {}".format(scores))

Cross-validation scores: [0.961 0.922 0.958]

(2)修改 cv 参数来改变折数

scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
print("Cross-validation scores: {}".format(scores))

Cross-validation scores: [1. 0.967 0.933 0.9 1. ]
默认情况下,cross_val_score 执行 3 折交叉验证,返回 3 个精度值。可以通过修改 cv 参数来改变折数

(3)交叉验证精度的一种常用方法(计算平均值)

print("Average cross-validation score: {:.2f}".format(scores.mean()))

Average cross-validation score: 0.96

我们可以从交叉验证平均值中得出结论,我们预计模型的平均精度约为 96%。观察 5 折交叉验证得到的所有 5 个精度值,我们还可以发现,折与折之间的精度有较大的变化,范围为从 100% 精度到 90% 精度。这可能意味着模型强烈依赖于将某个折用于训练,但也可能
只是因为数据集的数据量太小。

二、交叉验证的优点

1、train_test_split 对数据进行随机划分,可能导致测试集将仅包含“容易分类的”样例或难以分类的样例都在训练集中,但如果使用交叉验证,每个样例都会刚好在测试集中出现一次:每个样例位于一个折中,而每个折都在测试集中出现一次。因此,模型需要对数据集中所有样本的泛化能力都很好,才能让所有的交叉验证得分(及其平均值)都很高。

2、对数据进行多次划分,还可以提供我们的模型对训练集选择的敏感性信息

3、是我们对数据的使用更加高效

缺点:增加了计算成本

重要的是要记住,交叉验证不是一种构建可应用于新数据的模型的方法。交叉验证不会返回一个模型。在调用 cross_val_score 时,内部会构建多个模型,但交叉验证的目的只是评估给定算法在特定数据集上训练后的泛化性能好坏

三、分层k折交叉验证和其他策略

将数据集划分为 k 折时,从数据的前 k 分之一开始划分(正如上一节所述),这可能并不总是一个好主意。

(1)iris 数据集

from sklearn.datasets import load_iris
iris = load_iris()
print("Iris labels:\n{}".format(iris.target))

Iris labels:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]

数据的前三分之一是类别 0,中间三分之一是类别 1,最后三分之一是类别 2。 1 折将只包含类别 0,所以在数据的第一次划分中,测试集将只包含类别 0,而训练集只包含类别 1 和 2。由于在 3 次划分中训练集和测试集中的类别都不相同,因此这个数据集上的 3 折交叉验证精度为 0。

使用分层 k 折交叉验证

(1)划分数据。当数据按类别标签排序时,标准交叉验证与分层交叉验证的对比

mglearn.plots.plot_stratified_cross_validation()


使用分层 k 折交叉验证而不是 k 折交叉验证来评估一个分类器,这通常是一个好主意,因为它可以对泛化性能做出更可靠的估计。

对于回归问题,scikit-learn 默认使用标准 k 折交叉验证。也可以尝试让每个折表示回归目标的不同取值。

1. 对交叉验证的更多控制

可以利用 cv 参数来调节 cross_val_score 所使用的折数。但 scikit-learn允许提供一个**交叉验证分离器(cross-validation splitter)**作为 cv 参数,来对数据划分过程进行更精细的控制。

回归问题默认的 k 折交叉验证与分类问题的分层 k 折交叉验证的表现都很好,但有些情况下你可能希望使用不同的策略。比如说,在一个分类数据集上使用标准 k 折交叉验证来重现别人的结果。
(1)导入 KFold 分离器类,实例化

from sklearn.model_selection import KFold
kfold = KFold(n_splits=5)

(2)以将 kfold 分离器对象作为 cv 参数传入 cross_val_score

print("Cross-validation scores:\n{}".format(cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

可以验证,在 iris 数据集上使用 3 折交叉验证(不分层)确实是一个
非常糟糕的主意:

(3)
kfold = KFold(n_splits=3)
print(“Cross-validation scores:\n{}”.format(
cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

(4)
kfold = KFold(n_splits=3, shuffle=True, random_state=0)
print(“Cross-validation scores:\n{}”.format(
cross_val_score(logreg, iris.data, iris.target, cv=kfold)))

2. 留一法交叉验证

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
print("Number of cv iterations: ", len(scores))
print("Mean accuracy: {:.2f}".format(scores.mean()))

3. 打乱划分交叉验证

mglearn.plots.plot_shuffle_split()

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.5, train_size=.5, n_splits=10)
scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)
print("Cross-validation scores:\n{}".format(scores))

4. 分组交叉验证

mglearn.plots.plot_group_kfold()

from sklearn.model_selection import GroupKFoldX, y = make_blobs(n_samples=12, random_state=0)groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]
scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))
print("Cross-validation scores:\n{}".format(scores))

【笔记】【机器学习基础】交叉验证相关推荐

  1. UDA机器学习基础—交叉验证

    交叉验证的目的是为了有在训练集中有更多的数据点,以获得最佳的学习效果,同时也希望有跟多的测试集数据来获得最佳验证.交叉验证的要点是将训练数据平分到k个容器中,在k折交叉验证中,将运行k次单独的试验,每 ...

  2. 【机器学习】交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图

    [机器学习]交叉验证详细解释+10种常见的验证方法具体代码实现+可视化图 一.使用背景 由于在训练集上,通过调整参数设置使估计器的性能达到了最佳状态:但在测试集上可能会出现过拟合的情况. 此时,测试集 ...

  3. 神经网络与机器学习 笔记—泛化和交叉验证

    泛化和交叉验证 泛化 在反向传播学习中,一般从一个训练样本开始,而且通过网络中装载尽可能多的训练样本来使用反向传播算法计算一个多层感知器的突触权值.希望这样设计的神经网络可以很好的泛化.对于从未在生成 ...

  4. 机器学习笔记 - 机器学习基础面试题一

    1. 机器学习有哪些不同类型? 监督学习:模型根据过去或标记的数据做出预测或决策.例如,股票市场价格的预测.         无监督学习:没有标记数据.模型可以识别输入数据中的模式.异常和关系.例如, ...

  5. 【机器学习】交叉验证防止过拟合(含义+代码+演示)

    什么是过拟合? 对训练集拟合效果很好,对测试集拟合效果比较差,这种情况叫做过拟合. 一 训练集 vs 测试集 在模式识别(pattern recognition)与机器学习(machine learn ...

  6. 机器学习之交叉验证方法详解【基于Scikit-Learn】

    目录: 1 为什么交叉验证 2 交叉验证方法2.1 简单的交叉验证2.2 k折交叉验证 k-fold cross validation2.3 代码 3 留一法 leave-one-out cross ...

  7. python机器学习——十次交叉验证训练的数据准备算法

    摄于 2017年4月21日 台湾垦丁船帆石海滩 前言 python强大的机器学习包scikit-learn可以直接进行交叉分割,之所以写个相当于锻炼自己思维. 这两天本来打算开始写朴素贝叶斯分类器的算 ...

  8. 机器学习-CrossValidation交叉验证Python实现

    版权声明:本文为原创文章,转载请注明来源. 1.原理 1.1 概念 交叉验证(Cross-validation)主要用于模型训练或建模应用中,如分类预测.PCR.PLS回归建模等.在给定的样本空间中, ...

  9. 【机器学习】交叉验证筛选参数K值和weight

    交叉验证 导包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import data ...

  10. 机器学习- Sklearn (交叉验证和Pipeline)

    前面一节咱们已经介绍了决策树的原理已经在sklearn中的应用.那么这里还有两个数据处理和sklearn应用中的小知识点咱们还没有讲,但是在实践中却会经常要用到的,那就是交叉验证cross_valid ...

最新文章

  1. Cisco呼吁Arista停止在美国销售产品
  2. Using string literals in ref attributes is deprecated
  3. JQuery中ajax方法访问web服务
  4. 开服侠显示服务器已停止,蜘蛛侠:极限(已关服)无法连接服务器是什么原因...
  5. Arduino ESP8266编程深入要点
  6. mysql vacuum_PostgreSQL DBA快速入门(四) - 体系架构
  7. 对象引用 String引用 基本类型引用 差别
  8. 【STM32】修改芯片型号后报 Error 的解决方案
  9. 压缩/解压的软件 WinRAR 的去广告
  10. 计算机需要无线网卡进行网络连,usb无线网卡怎么用详细步骤
  11. 雷达图的实现(R语言及Python)
  12. 《西方确指》明心生极乐、专修净土乃大孝、持咒显空慧
  13. php 表示每月一号,关于适合每月一号发的说说
  14. kali自带浏览器上不了网的解决办法
  15. 【moment】moment生成日历图及日历事件展示
  16. 智能设计|零基础,低成本,轻松实现设计效率翻倍
  17. 使用chalk时颜色不变的问题解决
  18. 奥利给!有了这么豪横的指南,还愁不会逛 GitHub?!
  19. 火狐浏览器打不开淘宝首页的解决办法
  20. 注册的业务、登录业务、个人中心、nginx配置【VUE项目】

热门文章

  1. 贝贝网融资一亿美金,唱衰垂直电商是否言之过早?
  2. 科学家发现“超级原子” 元素周期表要扩大(图)
  3. 05-MySQL的完整性约束
  4. 第十七届山东省大学生软件设计大赛总结
  5. 企业网络营销发展前景趋势分析
  6. MFC中的MoveWindow 与 SetWindowPos
  7. A,B,C , D, E类地址的划分及子网划分汇总的详解
  8. grub命令 u盘安装linux,u盘安装ubuntu出现grub问题怎么办?
  9. 彻底了解JAVA-策略模式(皇室战争是怎样炼成的)
  10. linux所有账户都被锁了,Linux下的账户锁定