K折交叉验证大集合(KFold 、Stratified k-fold、Group k-fold、StratifiedGroupKFold)
最近在看kaggle比赛,其中用的最多的trick都有多折交叉验证,首先,交叉验证是区分训练集合验证集的一种方法,不同的交叉验证方法就是根据不同的规则来指定训练集合验证集,今天就来深扒一下每个多折交叉验证方法的详细内容和他们之间的区别吧!
1.KFold
KFold是最基本的K折交叉验证,表示将数据集拆分为k个连续group(默认情况下不进行打乱顺序)。然后,每个group被用作一次验证,而剩余的k-1个group形成训练集。KFold不会受到class和group的影响。
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]
2.Stratified k-fold
Stratified k-fold是KFold的变体,它会根据数据集的类别占比分布来划分训练集和验证集,使得划分后的数据集的类别占比和原始数据集近似。
>>> import numpy as np
>>> from sklearn.model_selection import StratifiedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> skf = StratifiedKFold(n_splits=2)
>>> skf.get_n_splits(X, y)
2
>>> print(skf)
StratifiedKFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in skf.split(X, y):
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
TRAIN: [1 3] TEST: [0 2]
TRAIN: [0 2] TEST: [1 3]
3.Group k-fold
GroupKFold 会保证同一个group的数据不会同时出现在训练集和验证集上。因为如果训练集中包含了每个group的几个样例,可能训练得到的模型能够足够灵活地从这些样例中学习到特征,在验证集上也会表现很好。但一旦遇到一个新的group它就会表现很差。
>>> from sklearn.model_selection import GroupKFold>>> X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
>>> y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
>>> groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]>>> gkf = GroupKFold(n_splits=3)
>>> for train, test in gkf.split(X, y, groups=groups):
... print("%s %s" % (train, test))
[0 1 2 3 4 5] [6 7 8 9]
[0 1 2 6 7 8 9] [3 4 5]
[3 4 5 6 7 8 9] [0 1 2]
4.StratifiedGroupKFold
StratifiedGroupKFold要求数据集划分时既要考虑类别占比大致不变,又要保证同一个group的数据不能同时出现在训练集和验证集上。
>>> from sklearn.model_selection import StratifiedGroupKFold
>>> X = list(range(18))
>>> y = [1] * 6 + [0] * 12
>>> groups = [1, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 4, 5, 5, 5, 6, 6, 6]
>>> sgkf = StratifiedGroupKFold(n_splits=3)
>>> for train, test in sgkf.split(X, y, groups=groups):
... print("%s %s" % (train, test))
[ 0 2 3 4 5 6 7 10 11 15 16 17] [ 1 8 9 12 13 14]
[ 0 1 4 5 6 7 8 9 11 12 13 14] [ 2 3 10 15 16 17]
[ 1 2 3 8 9 10 12 13 14 15 16 17] [ 0 4 5 6 7 11]
整理不易,欢迎一键三连!!!
K折交叉验证大集合(KFold 、Stratified k-fold、Group k-fold、StratifiedGroupKFold)相关推荐
- ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)
ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...
- 机器学习--K折交叉验证(K-fold cross validation)
K 折交叉验证(K-flod cross validation) 当样本数据不充足时,为了选择更好的模型,可以采用交叉验证方法. 基本思想:把给定的数据进行划分,将划分得到的数据集组合为训练集与测试集 ...
- k折交叉验证(k-fold Cross-validation)
一.基本概述 交叉验证是在机器学习建立模型和验证模型参数时常用的办法,一般被用于评估一个机器学习模型的表现.更多的情况下,我们也用交叉验证来进行模型选择(model sel ...
- 回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证
回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 目录 回归预测 | MATLAB实现SVR(支持向量机回归)K折交叉验证 基本介绍 划分原理 留一划分 交叉验证 K折交叉 程序设计 ...
- k折交叉验证 k-fold cross-validation
文章目录 k折交叉验证 k值的确定 实例 使用scikit-learn进行交叉验证 交叉验证是用来评估机器学习方法的有效性的统计学方法,可以使用有限的样本数量来评估模型对于验证集或测试集数据的效果. ...
- 交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么?
交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么? 交叉验证(cross validation)是什么? 交叉验证是一种模型的验 ...
- K折交叉验证(StratifiedKFold与KFold比较)
文章目录 一.交叉验证 二.K折交叉验证 KFold()方法 StratifiedKFold()方法 一.交叉验证 交叉验证的基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训 ...
- k折交叉验证优缺点_R语言中K邻近算法的初学者指南:从菜鸟到大神(附代码&链接)...
作者:Leihua Ye, UC Santa Barbara 翻译:陈超 校对:冯羽 本文约2300字,建议阅读10分钟 本文介绍了一种针对初学者的K临近算法在R语言中的实现方法. 本文呈现了一种在R ...
- K折交叉验证(KFold)
K折交叉验证:sklearn.model_selection.KFold(n_splits=n, shuffle=False, random_state=None) 思路:将训练/测试数据集划分为n个 ...
- matlab-K折交叉验证与分层K折交叉验证
文章目录 K折交叉验证有什么用? 如何实现K折交叉验证? K折交叉验证的要点:(文字版) 如何实现K折交叉验证(图片版) 如何实现K折交叉验证(matlab版) 为啥我们需要分层K折交叉验证? 如何实 ...
最新文章
- php中连接两个值,php - 如何从两个表的连接中选择一个值? - SO中文参考 - www.soinside.com...
- 使用PyTorch时,最常见的4个错误
- Android多点触摸交互处理,放大缩小图片
- react ,ant Design UI中table组件合并单元格并展开详情的问题
- synchronized不能锁静态变量_多线程编程不可错过——彻底理解synchronized
- 人工智能的时代?未来已至?
- 点阵字体显示系列之三:使用ncurses显示汉字
- 基于java的qq屏幕截图工具的设计与实现_几款鲜为人知的实用工具,你都尝试过吗?...
- ASD: Average Surface Distance
- 最新阿里巴巴Java开发手册发布和下载
- CentOS7.5.1804 Minimal 静默安装oracle 12c R1企业版
- matlab besselh,关于用matlab求bessel函数零点
- Matlab神经网络(一)
- 汇编语言 程序设计 顺序结构
- ubuntu18.04 最小安装后,setting-sharing 中没有了共享屏幕的选项,解决办法如下:
- Kaggle图像识别竞赛 Plant Seedlings Classification(植物幼苗分类)具体实现
- 我每次去德国出差必带的东西
- 点我一下,你将获得排查性能问题的超能力~
- 菊风云 | 视频会议在银行业的发展 - 机遇与挑战并存
- 如何处理Elixir中的异常
热门文章
- java安卓分屏是如何实现的_安卓原生分屏有了,谷歌说:Android Q要实现分屏应用多开...
- E - Alarm Clock (尺取法)
- 区块链自由意志数据隐私安全
- 《黑客与画家》读后感之一
- 洛谷 P3939 数颜色(主席树)
- golang 实现苹果内购服务端验证
- 麻烦大家给点C#的小程序的练习题做做,小女子谢谢了.......
- itest考试切屏能检测出来吗_itest测试
- Neo4j CQL语法
- 短网址还原 php,PHP将微博短地址还原为实际网址