验证集准确率上不去_Python机器学习之“模型验证”
有监督机器学习模型的基本步骤:
(1) 选择模型类;
(2) 选择模型超参数;
(3) 用模型拟合训练数据;
(4) 用模型预测新数据的标签。
前两步——模型选择和超参数选择——可能是有效使用各种机器学习工具和技术的最重要阶段。为了作出正确的选择,我们需要一种方式来验证选中的模型和超参数是否可以很好地拟合数据。这看起来是很简单,但要顺利地完成必须避过很多坑。
什么是模型验证
模型验证(model validation)其实很简单,就是在选择模型和超参数之后,通过对训练数据进行学习,对比模型对已知数据的预测值与实际值的差异。
在下面,我们首先通过一个简单方法实现模型验证,告诉你为什么那样做行不通。之后,介绍如何用留出集(holdout set)与交叉检验(cross-validation)实现更可靠的模型验证。
01 / 错误的模型验证方法
让我们再用前面介绍过的鸢尾花数据来演示一个简单的模型验证方
法。首先加载数据:
from sklearn.datasets import load_irisiris = load_iris()X = iris.datay = iris.target
然后选择模型和超参数。这里使用一个 k 近邻分类器,超参数为n_neighbors=1。这是一个非常简单直观的模型,“新数据的标签与其最接近的训练数据的标签相同”:
准确得分是 1.0,也就是说模型识别标签的正确率是 100% !但是这样测量的准确率可靠吗?我们真的有一个在任何时候准确率都是 100% 的模型吗?
你可能已经猜到了,答案是否定的。其实这个方法有个根本缺陷:它用同一套数据训练和评估模型。另外,最近邻模型是一种与距离相关的评估器,只会简单地存储训练数据,然后把新数据与存储的已知数据进行对比来预测标签。在理想情况下,模型的准确率总是 100%。
02 / 模型验证正确方法:留出集
那怎么才能模型验证呢?其实留出集可以更好地评估模型性能,也就是说,先从训练模型的数据中留出一部分,然后用这部分留出来的数据来检验模型性能。在 Scikit-Learn 里面用train_test_split 工具就可以实现:
from sklearn.model_selection import train_test_split# 每个数据集分一半数据X1, X2, y1, y2 = train_test_split(X, y, random_state=0,train_size=0.5)# 用模型拟合训练数据model.fit(X1, y1)# 在测试集中评估模型准确率y2_model = model.predict(X2)accuracy_score(y2, y2_model)
>>0.9066666666666666
这样就可以获得更合理的结果了:最近邻分类器在这份留出集上的准确率是 90%。这里的留出集类似新数据,因为模型之前没有“接触”过它们。
03 / 交叉验证
用留出集进行模型验证有一个缺点,就是模型失去了一部分训练机会。在上面的模型中,有一半数据都没有为模型训练做出贡献。这显然不是最优解,而且可能还会出现问题——尤其是在训练数据集规模比较小的时候。
解决这个问题的方法是交叉检验,也就是做一组拟合,让数据的每个子集既是训练集,又是验证集。用图形来说明的话,就下图所示:
这里进行了两轮验证实验,轮流用一半数据作为留出集。如果还有前面的数据集,我们可以这样实现交叉检验:
y2_model = model.fit(X1, y1).predict(X2)y1_model = model.fit(X2, y2).predict(X1)accuracy_score(y1, y1_model), accuracy_score(y2, y2_model)
>> (0.96, 0.9066666666666666)
这样就可以获得两个准确率,将二者结合(例如求均值)获取一个更准确的模型总体性能。这种形式的交叉检验被称为两轮交叉检验——将数据集分成两个子集,依次将每个子集作为验证集。
可以通过扩展这个概念,在数据中实现更多轮的实验,如下图是一个五轮交叉检验。
把数据分成五组,每一轮依次用模型拟合其中的四组数据,再预测第五组数据,评估模型准确率。手动实现这些过程会很无聊,用Scikit-Learn 的 cross_val_score 函数可以非常简便地实现:
from sklearn.model_selection import cross_val_scorecross_val_score(model, X, y, cv=5)
》》
array([0.96666667, 0.96666667, 0.93333333, 0.93333333, 1. ])
对数据的不同子集重复进行交叉检验,可以让我们对算法的性能有更好的认识。
Scikit-Learn 为不同应用场景提供了各种交叉检验方法,都以迭代器(iterator)形式在model_selection 模块 中实现。例如,我们可能会遇到交叉检验的轮数与样本数相同的极端情况,也就是说我们每次只有一个样本做测试,其他样本全用于训练。这种交叉检验类型被称为 LOO(leave-one-out)留一交叉检验,具体用法如下:
In [37]: from sklearn.model_selection import LeaveOneOut
In [38]: X = [1,2,3,4]
In [39]: loo = LeaveOneOut()
In [41]: for train, test in loo.split(X): print (train, test)
[1 2 3] [0][0 2 3] [1][0 1 3] [2][0 1 2] [3]
#使用KFold实现LeaveOneOtutIn [42]: kf = KFold(n_splits=len(X))
In [43]: for train, test in kf.split(X): ...: print (train, test) ...: [1 2 3] [0][0 2 3] [1][0 1 3] [2][0 1 2] [3]
LOOCV的优点:
充分利用数据
因为采样是确定的,所以最终误差也是确定的,不需要重复LOOCV
LOOCV的缺点:
训练起来耗时
由于每次只采一个样本作为验证,导致无法分层抽样,影响验证集上的误差。举个例子,数据集中有数量相等的两个类,对于一条随机数据,他的预测结果是被预测为多数的结果,如果每次划出一条数据作为验证,则其对应的训练集中则会少一条,导致训练集中该条数据占少数从而被预测为相反的类,这样原来的误差率为50%,在LOOCV中为100%。
欢迎关注、转发、评论
验证集准确率上不去_Python机器学习之“模型验证”相关推荐
- Pytorch实战:8层神经网络实现Cifar-10图像分类验证集准确率94.71%
实验环境: Pytorch 1.7.0 torchvision 0.8.2 Python 3.8 CUDA10.2 + cuDNN v7.6.5 Win10 + Pycharm GTX1660, 6G ...
- 训练集准确率很高,验证集准确率低问题
训练集在训练过程中,loss稳步下降,准确率上升,最后能达到97% 验证集准确率没有升高,一直维持在50%左右(二分类问题,随机概率) 测试集准确率57% 在网上搜索可能打的原因: 1.learnin ...
- ML之Validation:机器学习中模型验证方法的简介、代码实现、案例应用之详细攻略
ML之Validation:机器学习中模型验证方法的简介.代码实现.案例应用之详细攻略 目录 模型验证方法的简介 1.Hold-out验证 2.K-折交叉验证 3.自助重采样 模型验证方法的代码实现 ...
- 训练模型的准确率很高,但是验证集准确率特别低
训练图的过程如下: 训练结果: 训练的loss很低,而且正确率已经很高了,但是在验证集上面,loss比较高,而且准确率特别低,还一直不稳定. 产生原因: 将每个类别的数据集中的放在一起,而且数据标签也 ...
- python交叉验证结合线性回归_Python机器学习之交叉验证
交叉验证是一种非常常用的对于模型泛化能力进行评估 方法,交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题.常用的交叉验证方法有:简单交叉验证(HoldOut检验,例如train_t ...
- python训练模型测试模型_python 机器学习中模型评估和调参
在做数据处理时,需要用到不同的手法,如特征标准化,主成分分析,等等会重复用到某些参数,sklearn中提供了管道,可以一次性的解决该问题 先展示先通常的做法 import pandas as pd f ...
- python 验证模型_Python中的模型验证
python 验证模型 This is a memo to share what I have learnt in Model Validation (using Python), capturing ...
- python 两点曲线_python机器学习分类模型评估
python机器学习分类模型评估 1.混淆矩阵 在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多 ...
- python线性拟合模型_Python机器学习-线性回归模型篇
一.What机器学习是什么 机器学习简单来说,是从数据中归纳出有用的规则,它是一种新的编程方式,它不需要人类来总结经验.输入逻辑,人类只需要把大量数据输入计算机,然后计算机就可以自动总结经验归纳逻辑, ...
最新文章
- ajax iframe实现文件上传,iframe实现Ajax文件上传效果示例
- php tab标签,JavaScript代码分享:tab标签的切换
- 武器化道路越走越远的无人机
- bireme数据源同步工具--debezium+kafka+bireme
- 记录某段程序的运行时间
- 遇到指针别害怕!先把这篇笔记看一遍~
- vue中src文件夹下各文件_Win10下与虚拟机中的linux共享文件夹
- 除去WebView默认存在的一定像素的边距问题
- 【Elasticsearch】Elasticsearch 集群健康值黄色 解决方案 或者 分片 未分配
- SeaJS项目完整实例【转】
- win10树莓派改ip_用树莓派制作温湿度服务器
- 如何在Win11中恢复动态磁贴?
- 网站搭建:从零搭建个人网站教程(1)
- snkrs抽签协议获取
- Modifier在java_Java-Modifier类常用方法详解
- 菜鸟入门_Python_机器学习(1)_线性可分的双月实验
- 无需下载,优质网站分享
- pta简单的插入排序
- DELL 电脑 ubuntu20.04系统安装(最新最简版)
- switch中使用continue和break
热门文章
- Python: 自定义类对象序列化为Json串
- nginx二进制编译-启动脚本编写
- ftp协议及vsftpd的基本应用
- 写专业书确能帮助自己快速提升——写在我的书出版半年后,同时和大家分享选书的方式...
- 【转】建立一个更高级别的查询 API:正确使用Django ORM 的方式
- 数据结构与算法课程作业--奇数个数的数的查找方法-异或
- 【 Hibernate3-摘要 】 【 第1节 】:JPA常用注解
- HDU 4296 Buildings
- no identity found Command /usr/bin/codesign failed with exit code 1 报错解决方法
- 【干货】微信私域运营实战指南.pdf(附下载链接)