10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)

概念:

交叉验证法,就是把一个大的数据集分为 k个小数据集,其中 k − 1 个作为训练集,剩下的 1  个作为测试集,在训练和测试的时候依次选择训练集和它对应的测试集。这种方法也被叫做 k 折交叉验证法(k-fold cross validation)。最终的结果是这 k 次验证的均值。
 

十折交叉验证是将训练集分割成10个子样本,一个单独的子样本被保留作为验证模型的数据,其他9个样本用来训练。交叉验证重复10次,每个子样本验证一次,平均10次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10次交叉验证是最常用的。
 

此外,还有一种交叉验证方法就是 留一法(Leave-One-Out,简称LOO),顾名思义,就是使 k 等于数据集中数据的个数,每次只使用一个作为测试集,剩下的全部作为训练集,这种方法得出的结果与训练整个测试集的期望值最为接近,但是成本过于庞大。
 

在机器学习领域,n折交叉验证(n是数据集中样本的数目)被称为留一法。我们已经提到,留一法的一个优点是每次迭代中都使用了最大可能数目的样本来训练。另一个优点是该方法具有确定性。


 
我们用SKlearn库来实现一下LOO:

from sklearn.model_selection import LeaveOneOut# 一维示例数据
data_dim1 = [1, 2, 3, 4, 5]# 二维示例数据
data_dim2 = [[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3],[4, 4, 4, 4],[5, 5, 5, 5]]loo = LeaveOneOut() # 实例化LOO对象# 取LOO训练、测试集数据索引
for train_idx, test_idx in loo.split(data_dim1):# train_idx 是指训练数据在总数据集上的索引位置# test_idx 是指测试数据在总数据集上的索引位置print("train_index: %s, test_index %s" % (train_idx, test_idx))# 取LOO训练、测试集数据值
for train_idx, test_idx in loo.split(data_dim1):# train_idx 是指训练数据在总数据集上的索引位置# test_idx 是指测试数据在总数据集上的索引位置train_data = [data_dim1[i] for i in train_idx]test_data = [data_dim1[i] for i in test_idx]print("train_data: %s, test_data %s" % (train_data, test_data))

data_dim1的输出:

train_index: [1 2 3 4], test_index [0]
train_index: [0 2 3 4], test_index [1]
train_index: [0 1 3 4], test_index [2]
train_index: [0 1 2 4], test_index [3]
train_index: [0 1 2 3], test_index [4]train_data: [2, 3, 4, 5], test_data [1]
train_data: [1, 3, 4, 5], test_data [2]
train_data: [1, 2, 4, 5], test_data [3]
train_data: [1, 2, 3, 5], test_data [4]
train_data: [1, 2, 3, 4], test_data [5]

data_dim2的输出:

train_index: [1 2 3 4], test_index [0]
train_index: [0 2 3 4], test_index [1]
train_index: [0 1 3 4], test_index [2]
train_index: [0 1 2 4], test_index [3]
train_index: [0 1 2 3], test_index [4]train_data: [[2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[1, 1, 1, 1]]
train_data: [[1, 1, 1, 1], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[2, 2, 2, 2]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [4, 4, 4, 4], [5, 5, 5, 5]], test_data [[3, 3, 3, 3]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [5, 5, 5, 5]], test_data [[4, 4, 4, 4]]
train_data: [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]], test_data [[5, 5, 5, 5]]

使用sklearn库的KFold模块进行随机森林十折交叉验证:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, KFold
from sklearn.datasets import load_iris# 加载数据集(以鸢尾花数据集为例)
iris = load_iris()
X = iris.data
y = iris.target# 创建随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100)# 创建十折交叉验证对象
kfold = KFold(n_splits=10)# 执行十折交叉验证
scores = cross_val_score(rf_classifier, X, y, cv=kfold)# 输出每折的准确率
for i, score in enumerate(scores):print("Fold {}: {:.4f}".format(i+1, score))# 输出平均准确率
print("Average Accuracy: {:.4f}".format(scores.mean()))

代码解释
在上述代码中

首先,导入了RandomForestClassifier(随机森林分类器)、cross_val_score(交叉验证函数)、KFold(交叉验证生成器)和load_iris(加载鸢尾花数据集)等必要的模块和函数。

然后,我们加载了鸢尾花数据集,并将特征数据赋值给X,目标变量赋值给y。

接下来,我们创建了一个随机森林分类器对象rf_classifier,并指定了树的数量为100。

然后,我们创建了一个KFold对象kfold,其中n_splits参数指定了将数据集分成几个折(这里是十折)。

最后,我们使用cross_val_score函数进行十折交叉验证,传入随机森林分类器对象、特征数据X和目标变量y,并指定交叉验证对象为kfold。函数将返回每个折的准确率。

最后,我们遍历输出每折的准确率,并计算并输出平均准确率。

请注意,以上代码只是一个示例,并假设您已经安装了scikit-learn库。您可以根据自己的数据集和需求进行适当的修改。

错误分析

在实验中遇到了结果为负数的情况,分析了原因如下。

Fold 1: -276.8099
Fold 2: -273.9000
Fold 3: -352.8485
Fold 4: -341.5226
Fold 5: -303.3925
Fold 6: -121.9296
Fold 7: -119.7461
Fold 8: -232.8983
Fold 9: -366.5070
Fold 10: -300.5332
Average Accuracy: -269.0088

根据以上结果,准确率的值为负数,这在一般情况下是不可能的,因为准确率的范围通常是0到1之间。负数的准确率可能是由于以下原因之一导致的:

评估指标选择错误:可能是您在计算准确率时选择了错误的评估指标。在cross_val_score函数中,默认情况下使用了分类问题的准确率评估指标,但如果您的问题是回归问题,那么准确率评估指标不适用。请确保您选择了适当的评估指标。

数据标签处理错误:检查一下您的目标变量y的标签是否被正确处理。如果目标变量的标签是连续值而不是分类值,并且您错误地将其用作分类变量进行训练和评估,那么会导致不正常的结果。确保目标变量是分类变量,并且其标签被正确地映射到类别。

数据集划分错误:在执行交叉验证时,确保数据集的划分是正确的。可能存在数据泄漏或未正确随机化数据的问题。使用KFold对象进行交叉验证时,确保数据的划分是随机且平衡的。

数据预处理错误:在应用随机森林算法之前,对数据进行预处理是很重要的。请确保数据被正确地缩放、编码或进行其他必要的预处理步骤。特别是对于包含连续值特征的数据,可能需要进行标准化或归一化处理。

请检查上述可能导致不正常结果的因素,并确保数据处理和代码逻辑的正确性。如果问题仍然存在,请提供更多的代码和数据细节,以便更好地理解问题并提供帮助。

根据以上结果,准确率的值看起来非常不正常。这个问题可能是由于数据处理或代码逻辑上的错误导致的。下面是一些可能导致此问题的原因:

数据处理错误:请确保您的特征数据X和目标变量y被正确加载和处理。检查数据的维度、数据类型和缺失值等问题。确保特征数据和目标变量的数量和顺序匹配。

参数设置错误:在随机森林分类器的初始化中,可能存在一些参数设置错误。例如,n_estimators参数指定了树的数量,确保它设置为一个合理的值。还要注意其他与随机森林相关的参数,如max_depth、min_samples_split等,以确保它们适合您的数据集。

交叉验证错误:在创建KFold对象时,确保n_splits参数设置为一个合理的值,通常使用10作为常见选择。还要注意交叉验证的策略,例如随机性的控制和数据是否被正确划分。

代码逻辑错误:请确保您的代码逻辑正确,特别是在执行交叉验证和计算准确率时。确认代码中没有引入额外的错误。

建议您仔细检查代码和数据处理的每个步骤,并根据需要进行调试和修改。确保数据加载正确、模型参数设置合理,并正确执行交叉验证和准确率计算。如果问题仍然存在,提供更多的代码和数据细节可能有助于进一步的排查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

harmony开发之image组件的使用

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机、PC、智能音箱、耳机、AR/VR眼镜等多种终端…

决策树 ID3 算法

ID3 算法 ID3 算法 ID3 算法最早是由罗斯昆 (J.Ross Quinlan) 于1975年提出的一种决策树构建算法,算法的核心是“信息熵”,期望信息越小,信息熵越大,样本纯度越低。。ID3 算法是以信息论为基础,以信息增益为衡量标准…

一位半加法器,一位全加器,四位全加器

我们这里的加法器只考虑一位的情况。 当我们两个一位相加的话,那么就有两个输入,两个输出,两个输入很好理解,就是两个个位上的数字,0或者是1,那么为什么需要有有个输出呢?难道不是输出一个数就…

【3】PyQt文本和图片

1. 文本控件 文本控件是QLabel from PyQt5.QtWidgets import QWidget, QApplication, QLabel import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 修改窗口标题 w.setWindowTitle(文本展示)# ---------------------------------------------…

【Trino权威指南(第二版)】Trino介绍:trino解决大数带来的问题

文章目录 一. 大数据带来的问题二. Trino来救场1. 为性能和规模而生2. SQL-on-Anything3. 数据存储与查询计算资源分离 三. Trino使用场景 一. 大数据带来的问题 数据现状 数据存储机制日益多样:关系型数据库、NoSQL数据库、文档数据库、键值存储和对象存储系统等。…

SpringBoot拦截器、过滤器、自定义注解、监听器、全局异常-使用详解

一、拦截器 用springboot实现一个简单的拦截器 在Spring Boot中实现一个简单的拦截器涉及几个步骤。首先,你需要创建一个拦截器类,然后将其注册到Spring MVC的拦截器注册表中。下面是一个基本的例子来指导你如何操作: 1. 创建拦截器类 这个…

uniapp 云打包 生成安卓证书文件

现在使用uniapp来开发小程序,H5,APP越来越多了,目前开发了一款APP,使用的也是uniapp。在此记录下用uniapp开发app云打包时约到的一些问题吧。 前因是我司安卓同学休产假,像云打包时需要的证书文件只能自己动手来搞。看…

index加上alias

查询index记录 POST prod-lumi-demo3-alias*/_search {"size": 1000,"query": {"match_all": {}},"sort": [{"ts": {"order": "desc"}}] }给指定index加上或者删除某一alias POST /_aliases {"a…

【C语言】【二级】移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p的数组元素平移到数组的最后...

题目 请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p, p小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10…

算法-贪心思想

贪心的思想非常不好解释,而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来,但是非要解释一下怎么使用的贪心的话,就懵圈了。一般来说,贪心的题目没有固定的套路,一题一样,不过…

了解应用层的HTTP协议与HTTPS协议,在常规请求的应用中Get与Post的区别

一、HTTP协议 1、http协议的特性2、http协议的请求 请求行 GET请求POST 请求(人脸识别方案)两个请求的区别本质区别: (1)url 携带的参数是否可见:(2)参数传递方式(3)缓存性&#xf…

Java Socket编程:实现网络通信

引言: 在当今数字化时代,网络通信已经成为了人们生活中不可或缺的一部分。Java Socket编程是一种基于TCP/IP协议的网络通信技术,通过它我们可以实现不同计算机之间的数据传输和通信。本文将介绍Java Socket编程的基本概念、原理和实现方法&am…

【Maven】清理 maven 仓库

初始情况下,我们的本地仓库是没有任何jar包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载)。 可能由于网络的原因,jar包下载不完全,这些不完整的jar包都是以lastUpdated结尾。此…

rsync 一个可以让你抛弃scp的工具

目录 1. 基本语法 2. 例子 本地同步 本地同步并压缩传输 本地同步仅复制更新过的文件 本地同步保留软链接 通过SSH进行远程同步 模拟执行同步 3. 注意事项 rsync(Remote Sync)是一个用于在本地和远程系统之间同步文件和目录的工具。它使用一个远…

JVM arthas下载工具

工具下载地址 链接:https://pan.baidu.com/s/1qkn9HabhuwTiwbKVQ7BXnA?pwdv5ww 提取码:v5ww 启动语句 java -jar arthas-boot.jar输入你的线程,这里是2 dashboardJVM优化 堆的初始大小 最大大小 年轻代的大小 线程栈大小 新生代、伊甸…

娱乐类直播平台

娱乐类直播是一种以娱乐为主要内容的直播形式,包括音乐、舞蹈、游戏、搞笑、访谈等。这种直播形式通常由主播在平台上进行表演,吸引观众的关注和互动。 在娱乐类直播中,主播通常会通过展示自己的才艺、技能或者与观众进行互动来吸引关注。一…

vue-cli创建项目运行报错this[kHandle] = new _Hash(algorithm, xofLen);(完美解决)

1:问题出现的原因 出现这个问题是node.js 的版本问题,因为 node.js V17开始版本中发布的是OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。故此以前的项目在使用 nodejs V17以上版本后会报错。…

聊天注意事项

聊天成功的核心就是双方都能舒服 有些人不会聊天是缺乏引导性 聊天聊两句话就没了 聊天要把话题引导向对方 从倾诉者变为倾听者 才能不断交流 沟通不是一个人的独角戏 每个人都渴望被理解 要注意倾听别人说的话 不要只顾自己说一大堆,别人都瞌睡了 不要查户口式问…

flask web学习之flask与http(一)

文章目录 一、请求响应循环二、HTTP请求1. 请求报文2. request对象3. 在flask中处理请求3.1 路由匹配3.2 设置监听的http方法3.3 URL处理 三、请求钩子 一、请求响应循环 每一个web应用都包含这种处理方式,请求-响应循环:客户端发出请求,服务…

rvos 3编译与链接

做下面的两个练习需要: 在vmvb上装一个ubuntu会gcc、vi的基本使用 用vi写一个hello.cgcc -o hello.creadelf -h hello.oreadelf -S hello.oobjdump -S hello.o 用vi编辑一个test.cgcc -c test.creadelf -S test.o.text:代码 .data:初始化的全局变量和静态变量…