【Python机器学习】模型评估与改进——分层k折交叉验证

在k折分层验证中,将数据集划分为k折时,从数据的前k分之一开始划分,这可能并不总是一个好主意,例如iris数据集中:

python 复制代码
from sklearn.datasets import load_iris

iris=load_iris()
print('Iris labels:\n:{}'.format(iris.target))

可以看到,数据的前1/3是类别0,中间1/3是类别1,后1/3是类别2。如果在这个数据集上进行3折交叉验证,第一折将只包含类别0,所以在数据的第一次划分中,测试集将只包含类别0,而训练集只包含类别1和2。由于在3次划分中训练集和测试集中的类别都不一样,所以这个数据集上的3折交叉验证精度为0,这没什么用,因为我们在iris上可以得到比0%好得多的精度。

因为简单的k折策略在这里失效了,所以scikit-learn在分类问题中不适用这种策略,而是使用分层k折交叉验证。

在分层交叉验证中,我们划分数据,使每个折中类别之间的比例与整个数据集中的比例相同,比如:

python 复制代码
mglearn.plots.plot_stratified_cross_validation()
plt.show()

举个例子,如果按照90%的样本属于类别A而10%的样本属于类别B,那么分层交叉验证可以确保,在每个折中90%的样本属于类别A而10%的样本属于类别B。

使用分层k折交叉验证而不是k折交叉验证来评估一个分类器,这通常是一个好主意,因为它可以对泛化性能做出更可靠的评估。在只有10%的样本属于类别B的情况下,如果使用标准k折交叉验证,很可能某个折中只包含类别A的样本。利用这个折作为测试集的话,无法给出分类器整体性能的信息。

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

相关推荐
深蓝电商API几秒前
图片验证码识别:pytesseract+opencv入门
人工智能·opencv·计算机视觉·pytesseract
念何架构之路几秒前
Go进阶之panic
开发语言·后端·golang
.Katherine௰几秒前
AI数字人模拟面试机器人
人工智能
光影少年2 分钟前
AI 前端 / 高级前端
前端·人工智能·状态模式
亓才孓4 分钟前
[Properties]写配置文件前,必须初始化Properties(引用变量没执行有效对象,调用方法会报空指针错误)
开发语言·python
zhangshuang-peta7 分钟前
OpenCode vs Claude Code vs OpenAI Codex:AI编程助手全面对比
人工智能·ai agent·mcp·peta
傻乐u兔8 分钟前
C语言进阶————指针3
c语言·开发语言
Bruk.Liu9 分钟前
(LangChain 实战14):基于 ChatMessageHistory 自定义实现对话记忆功能
人工智能·python·langchain·agent
代码改善世界11 分钟前
CANN中的AI算子开发:ops-nn仓库深度解读
人工智能
两点王爷18 分钟前
Java基础面试题——【Java语言特性】
java·开发语言