机器学习面试题集 - 详解四种交叉验证方法
https://www.toutiao.com/a6701090733618627076/
本文结构:
- 什么是交叉验证法?
- 为什么用交叉验证法?
- 主要有哪些方法?优缺点?
- 各方法应用举例?
什么是交叉验证法?
它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。
为什么用交叉验证法?
- 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表,可以在一定程度上减小过拟合。
- 还可以从有限的数据中获取尽可能多的有效信息。
- 可以选择出合适的模型
主要有哪些方法?
- Holdout Method
- K-Fold CV
- Leave One out CV
- Bootstrap Methods
1. 留出法 (holdout cross validation)
这种方法是最简单的交叉验证:
在机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集、验证集和测试集。
训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。
这个方法操作简单,只需随机把原始数据分为三组即可。
不过如果只做一次分割,它对训练集、验证集和测试集的样本数比例,还有分割后数据的分布是否和原始数据集的分布相同等因素比较敏感,
不同的划分会得到不同的最优模型,
而且分成三个集合后,用于训练的数据更少了。
2. k 折交叉验证(k-fold cross validation)
于是有了 k 折交叉验证(k-fold cross validation) 加以改进:
k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,
因此模型的性能对数据的划分就不那么敏感。
- 第一步,不重复抽样将原始数据随机分为 k 份。
- 第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。
- 第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。
- 在每个训练集上训练后得到一个模型,
- 用这个模型在相应的测试集上测试,计算并保存模型的评估指标,
- 第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。
k 一般取 10,
数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。
数据量大的时候,k 可以设小一点。
3. 留一法(Leave one out cross validation)
当 k=m 即样本总数时,叫做 ** 留一法(Leave one out cross validation)**,
每次的测试集都只有一个样本,要进行 m 次训练和预测。
这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。
但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。
一般在数据缺乏时使用。
样本数很多的话,这种方法开销很大。
此外:
- 多次 k 折交叉验证再求均值,例如:10 次 10 折交叉验证,以求更精确一点。
- 划分时有多种方法,例如对非平衡数据可以用分层采样,就是在每一份子集中都保持和原始数据集相同的类别比例。
- 模型训练过程的所有步骤,包括模型选择,特征选择等都是在单个折叠 fold 中独立执行的。
4. Bootstrap
还有一种比较特殊的交叉验证方式,Bootstrapping: 通过自助采样法,
即在含有 m 个样本的数据集中,进行 m 次有放回地随机抽样,组成的新数据集作为训练集。
这种方法,有的样本会被多次采样,也会有一次都没有被选择过的样本,原数据集中大概有 36.8% 的样本不会出现在新组数据集中,这些没有被选择过的数据作为验证集。
优点是训练集的样本总数和原数据集一样都是 m,并且仍有约 1/3 的数据不被训练而可以作为测试集,对于样本数少的数据集,就不用再由于拆分得更小而影响模型的效果。
缺点是这样产生的训练集的数据分布和原数据集的不一样了,会引入估计偏差。
此种方法不是很常用,除非数据量真的很少。
36.8% 是怎么得到的?
各方法应用举例?
1. 留出法 (holdout cross validation)
下面例子,一共有 150 条数据:
>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> from sklearn import datasets
>>> from sklearn import svm
>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
用 train_test_split 来随机划分数据集,其中 40% 用于测试集,有 60 条数据,60% 为训练集,有 90 条数据:
>>> X_train, X_test, y_train, y_test = train_test_split(
... iris.data, iris.target, test_size=0.4, random_state=0)
>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))
用 train 来训练,用 test 来评价模型的分数。
>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.96...
2. k 折交叉验证(k-fold cross validation)
最简单的方法是直接调用 cross_val_score,这里用了 5 折交叉验证:
>>> from sklearn.model_selection import cross_val_score
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_val_score(clf, iris.data, iris.target, cv=5)
>>> scores
array([ 0.96..., 1. ..., 0.96..., 0.96..., 1. ])
得到最后平均分为 0.98,以及它的 95% 置信区间:
>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)
我们可以直接看一下 K-fold 是怎样划分数据的:
X 有四个数据,把它分成 2 折,
结果中最后一个集合是测试集,前面的是训练集,
每一行为 1 折:
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
... print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
同样的数据 X,我们看 LeaveOneOut 后是什么样子,
那就是把它分成 4 折,
结果中最后一个集合是测试集,只有一个元素,前面的是训练集,
每一行为 1 折:
>>> from sklearn.model_selection import LeaveOneOut
>>> X = [1, 2, 3, 4]
>>> loo = LeaveOneOut()
>>> for train, test in loo.split(X):
... print("%s %s" % (train, test))
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]
推荐学习资料:
https://www.youtube.com/watch?v=vQBIi3Bvt2M&t=105s
http://scikit-learn.org/stable/modules/cross_validation.html
https://ljalphabeta.gitbooks.io/python-/content/kfold.html
http://www.csuldw.com/2015/07/28/2015-07-28%20crossvalidation/
《百面机器学习》
https://ww3.arb.ca.gov/research/weekendeffect/carb041300/sld012.htm
机器学习面试题集 - 详解四种交叉验证方法相关推荐
- 交叉验证的缘由、原理以及四种交叉验证法(留出法,K-Fold,留一法,Bootstrap)
[机器学习]Cross-Validation(交叉验证)详解 普通情况下,就是将数据集分为训练集和测试集. 这个简单的划分方法存在两个弊端. 1.最终模型与参数的选取将极大程度依赖于你对训练集和测试集 ...
- 真香啊,机器学习中这3种交叉验证方法要掌握
交叉验证是机器学习中常用的一种策略,其核心是对数据集进行划分,本文介绍sklearn中的3种交叉验证时划分数据集的方法: KFold StratifiedKFold GroupKFold 这里来举例说 ...
- Android开发的之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- 一文详解四种经典限流算法,面试必备。
前言 最近一位朋友去拼夕夕面试,被问了这么一道题:限流算法有哪些?用代码实现令牌桶算法.跟好友讨论了一波,发现大家都忘记得差不多了.所以再整理一波,常见的四种限流算法,以及简单代码实现,相信大家看完, ...
- 八皇后问题详解(四种解法)
所有源码都在github上(https://github.com/seasonyao/eight_queen_question) 如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问 ...
- 深度盘点:详细介绍机器学习中的7种交叉验证方法!
来源:机器学习社区 本文约3400字,建议阅读10分钟 本文与你分享7种最常用的交叉验证技术及其优缺点,提供了每种技术的代码片段. 在任何有监督机器学习项目的模型构建阶段,我们训练模型的目的是从标记的 ...
- 【机器学习】深度盘点:详细介绍 Python 中的 7 种交叉验证方法!
在任何有监督机器学习项目的模型构建阶段,我们训练模型的目的是从标记的示例中学习所有权重和偏差的最佳值. 如果我们使用相同的标记示例来测试我们的模型,那么这将是一个方法论错误,因为一个只会重复刚刚看到的 ...
- python交叉验证法_详解python实现交叉验证法与留出法
在机器学习中,我们经常在训练集上训练模型,在测试集上测试模型.最终的目标是希望我们的模型在测试集上有最好的表现. 但是,我们往往只有一个包含m个观测的数据集D,我们既要用它进行训练,又要对它进行测试. ...
- 详解3种常用数据分析方法,满足你职场95%的高频需求
最近有一位刚入行的朋友跟我吐槽,说他提交了一份8月的经营数据分析报告给领导,报告里面放了很多图表,也罗列了很多数据,结果却被老板痛批了一顿,说分析了半天也看不懂他的分析逻辑在哪里,他觉得很委屈. 其实 ...
最新文章
- 09_Java面向对象_第9天(类、封装)_讲义
- 尺有所短寸有所长-物尽其用-也谈语言之争
- EF-CodeFirst-域模型配置
- oracle怎么以时间排序,查询表怎样按修改时间排序
- Linux命令之目录和文件操作
- arch模型的思路_时间序列--ARCH模型
- 转--大话session
- .NET中获取电脑名、IP地址及用户名方法
- 通过网易云api实现一个简单的音乐播放器
- 开关电源PFC电路原理详解及matlab仿真
- 大数据面试题知识点分析(十一)之Flume面试真题及答案
- Windows cmd命令行操作技巧
- 公孙殃同学是很有见地啊
- cxfreeze 打包exe
- 安卓10 来电流程梳理
- 组播IGMP-原理介绍+报文分析+配置示例
- 计算机毕业后的打算英语作文,毕业后的打算高中英语作文
- RabbitMQ狂神说笔记(RabbitMQ B站狂神说笔记、KuangStudy、学相伴飞哥)
- 不使用root权限安装zsh和oh-my-zsh
- 攻防世界_难度8_happy_puzzle
热门文章
- docker与VM虚拟机区别
- JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。
- 如何看待「上帝掷骰子」这场概率骗局
- 这几本豆瓣高分设计好书,人人都应该读!
- 看懂了这套书,你就看懂了程序的灵魂。
- Mongo北京大会3月3号召开!报名抢注火爆进行中!(免费)
- DivCo: Diverse Conditional Image Synthesis via Contrastive Generative Adversarial Network
- 随机器学习兴起的Julia编程语言
- XGBoost调参技巧(二)Titanic实战Top9%
- 轻量级图卷积网络LightGCN介绍和构建推荐系统示例