一 交叉验证

1 保留交叉验证HoldOut

holdOut Cross-validation(Train-Test Split)

在这种交叉验证技术中,整个技术集被随机划分为训练集和验证集。

根据经验法则,整个数据集的近70%被用作训练集,其余30%被用作验证集,也就是最常使用的直接划分数据集的方法。

1.1 缺点

1、不适用不平衡的数据集

假设有不平衡的数据集,有0类和1类。其中80%属于0类,20%属于1类。也就是说,训练集的大小为80%,测试数据的大小为数据集的20%。可能发生的情况是,所有80%的0类数据都在训练集中,所有1类数据都在测试集中。那么模型不能很好地概括测试数据,原因也很简单,就是在训练的时候就没见过1类数据,自然也识别不出来。

2、一大块数据被剥夺了训练模型的机会

在小数据集的情况下,有一部分数据被保留下来用于测试模型,这些数据可能具有重要的特征,模型可能因为没有在被保留测试的数据上进行训练而错过。

2 K-折交叉验证(K-fold)

K-fold Cross Validation,记为K-CV或K-fold

K-Fold交叉验证技术中,整个数据集被划分为K个大小相同的部分。每个分区被称为 一个”Fold”。所以我们有K个部分,我们称之为K-Fold。一个Fold被用作验证集,其余的K-1个Fold被用作训练集。

该技术重复K次,直到每个Fold都被用作验证集,其余的作为训练集。

模型的最终准确度是通过取k个模型验证数据的平均准确度来计算的。

3 分层k-折交叉验证Stratified k-fold

Stratified k-fold cross validation,

K-折交叉验证的变种

分层是说在每一折中都保持着原始数据中各个类别的比例关系

比如说:原始数据有3类,比例为1:2:1,采用3折分层交叉验证,那么划分的3折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。

补充:去除p交叉验证、留一交叉验证、蒙特卡罗交叉验证、时间序列交叉验证

4 API

from sklearn.model_selection import StratifiedKFold

普通K折交叉验证和分层K折交叉验证的使用是一样的,只是引入的类不同

from sklearn.model_selection import KFold

使用时只是KFold这个类名不一样其他代码完全一样

strat_k_fold=sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

n_splits划分为几个折叠 ​ shuffle是否在拆分之前被打乱(随机化),False则按照顺序拆分 ​

random_state随机因子indexs=strat_k_fold.split(X,y)

返回一个可迭代对象,一共有5个折叠,每个折叠对应的是训练集和测试集的下标

for train_index, test_index in indexs:X[train_index] y[train_index] X[test_index ] y[test_index ]

用for循环取出每一个折叠对应的X和y下标来访问到对应的测试数据集和训练数据集 以及测试目标集和训练目标集

5 代码实例

'''使用StratifiedKFold来创建5个折叠,每个折叠中鸢尾花数据集的类别分布与整体数据集的分布一致。然后我们对每个折叠进行了训练和测试,计算了分类器的准确性。'''
from sklearn.datasets import load_iris#加载鸢尾花数据集
from sklearn.model_selection import StratifiedKFold#分层K折交叉验证,确保每折中各类别比例相同
from sklearn.neighbors import KNeighborsClassifier#K近邻分类器
from sklearn.preprocessing import StandardScaler#书标准化处理器'''加载鸢尾花数据集
提取特征和标签:
x:特征数据,150*4矩阵,包含4个特征
y:目标标签,150*1向量,包含012三个类别'''
iris = load_iris()
X = iris.data
y = iris.target'''初始化分层k-折交叉验证器
#n_splits划分为几个折叠 ,5个,80%训练,20测试
shuffle是否在拆分之前被打乱(随机化),True打乱顺序,避免顺序偏差,False则按照顺序拆分
random_state随机因子,确保结果可重现'''
strat_k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)'''创建一个K近邻分类器实例,使用7个最近邻'''
knn = KNeighborsClassifier(n_neighbors=7)'''初始化准确率列表,用于存储每次交叉验证的准确率得分'''
accuracies = []'''开始交叉验证循环
strat_k_fold.split(X,y)生成5对训练集和测试机索引
每次循环得到一对索引train_index(训练样本索引)和test_index(测试样本索引)'''
for train_index, test_index in strat_k_fold.split(X, y):print(train_index, test_index)#显示每次折叠的训练集和测试集样本索引'''划分训练集和测试集,根据索引从完整数据中提取对应的特征和标签'''X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]'''数据预处理(标准化)StandardScaler(): 创建标准化处理器(均值为0,标准差为1)fit_transform(X_train): 计算训练集的均值和标准差,并转换训练集transform(X_test): 使用训练集的参数来转换测试集(避免数据泄露)'''scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)'''使用标准化的训练数据来训练K近邻分类器'''knn.fit(X_train_scaled, y_train)'''计算在测试机的准确率,因为测试数据也需要标准化'''score = knn.score(X_test_scaled,y_test)print(score)'''把每次折叠的准确率并添加到列表中'''accuracies.append(score)'''输出5次交叉验证的平均准确率'''
print(sum(accuracies)/len(accuracies))

结果:

[  0   1   2   3   4   5   6   7   8   9  10  12  16  17  18  19  21  22
23  24  26  27  28  30  31  32  34  36  37  38  39  40  41  42  43  44
46  47  48  49  50  51  53  54  55  56  57  58  60  61  62  63  64  66
67  68  69  70  71  72  73  74  75  76  77  79  80  81  82  83  84  86
88  89  90  91  93  95  96  98 101 103 104 105 106 108 109 110 111 113
114 115 116 117 118 119 120 121 122 123 125 126 127 128 129 131 132 133
134 135 136 137 140 141 142 143 145 146 147 149] [ 11  13  14  15  20  25  29  33  35  45  52  59  65  78  85  87  92  94
97  99 100 102 107 112 124 130 138 139 144 148]
0.9666666666666667
[  1   2   3   5   6   7   8  11  12  13  14  15  16  17  18  20  22  23
24  25  26  27  28  29  30  32  33  34  35  36  37  38  39  41  43  44
45  46  48  49  50  51  52  53  54  55  56  57  59  61  62  63  64  65
66  67  69  70  71  72  73  76  77  78  79  81  83  84  85  86  87  88
91  92  93  94  95  97  98  99 100 101 102 103 104 105 107 112 113 115
116 117 118 119 122 123 124 125 126 127 128 129 130 131 132 133 134 135
137 138 139 140 141 142 143 144 145 146 147 148] [  0   4   9  10  19  21  31  40  42  47  58  60  68  74  75  80  82  89
90  96 106 108 109 110 111 114 120 121 136 149]
0.9666666666666667
[  0   1   2   3   4   5   8   9  10  11  12  13  14  15  16  17  18  19
20  21  23  24  25  26  28  29  31  32  33  35  36  37  39  40  42  43
45  46  47  49  51  52  53  54  55  57  58  59  60  61  62  63  65  67
68  69  73  74  75  76  77  78  79  80  81  82  84  85  86  87  88  89
90  91  92  93  94  96  97  99 100 101 102 103 106 107 108 109 110 111
112 113 114 115 117 119 120 121 122 124 125 128 129 130 131 134 135 136
137 138 139 141 142 143 144 145 146 147 148 149] [  6   7  22  27  30  34  38  41  44  48  50  56  64  66  70  71  72  83
95  98 104 105 116 118 123 126 127 132 133 140]
0.9
[  0   3   4   5   6   7   9  10  11  13  14  15  16  17  18  19  20  21
22  25  26  27  29  30  31  33  34  35  36  38  39  40  41  42  43  44
45  46  47  48  50  52  53  54  56  57  58  59  60  62  64  65  66  68
70  71  72  73  74  75  76  77  78  80  81  82  83  85  86  87  89  90
92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109
110 111 112 113 114 116 118 119 120 121 123 124 126 127 130 131 132 133
134 136 137 138 139 140 141 143 144 146 148 149] [  1   2   8  12  23  24  28  32  37  49  51  55  61  63  67  69  79  84
88  91 115 117 122 125 128 129 135 142 145 147]
1.0
[  0   1   2   4   6   7   8   9  10  11  12  13  14  15  19  20  21  22
23  24  25  27  28  29  30  31  32  33  34  35  37  38  40  41  42  44
45  47  48  49  50  51  52  55  56  58  59  60  61  63  64  65  66  67
68  69  70  71  72  74  75  78  79  80  82  83  84  85  87  88  89  90
91  92  94  95  96  97  98  99 100 102 104 105 106 107 108 109 110 111
112 114 115 116 117 118 120 121 122 123 124 125 126 127 128 129 130 132
133 135 136 138 139 140 142 144 145 147 148 149] [  3   5  16  17  18  26  36  39  43  46  53  54  57  62  73  76  77  81
86  93 101 103 113 119 131 134 137 141 143 146]
0.9666666666666667
0.96

二 超参数搜索

超参数搜索也叫网格搜索(Grid Search)

例如,在KNN算法中,K是一个可以人为设置的参数,所以就是一个超参数。网格搜索能够自动帮助我们找到最好的超参数值。

三 Sklearn API

同时进行交叉验证(cv)、网络搜索(GridSearch)

GridSearchCV实际上也是一个估计器(estimator),它有几个重要属性:

估计器(estimator),同时它有几个重要属性:
best_params_  最佳参数
best_score_ 在训练集中的准确率
best_estimator_ 最佳估计器
cv_results_ 交叉验证过程描述
best_index_最佳k在列表中的下标

class sklearn.model_selection.GridSearchCV(estimator, param_grid)

参数:

estimator:scikit-learn估计器实例;

param_grid:以参数名称(str)作为键,将参数设置列表尝试作为值的字典;

示例:

{"n_neighbors": [1, 3, 5, 7, 9, 11]}
cv: 确定交叉验证切分策略,值为:
(1)None  默认5折
(2)integer  设置多少折
如果估计器是分类器,使用"分层k-折交叉验证(StratifiedKFold)"。在所有其他情况下,使用KFold。

四 代码实例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCVdef knn_iris_gscv():# 1)获取数据iris = load_iris()# 2)划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)# 3)特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4)KNN算法预估器, 这里就不传参数n_neighbors了,交给GridSearchCV来传递estimator = KNeighborsClassifier()# 加入网格搜索与交叉验证, GridSearchCV会让k分别等于1,2,5,7,9,11进行网格搜索偿试。cv=10表示进行10次交叉验证estimator = GridSearchCV(estimator, param_grid={"n_neighbors": [1, 3, 5, 7, 9, 11]}, cv=10)estimator.fit(x_train, y_train)# 5)模型评估# 方法1:直接比对真实值和预测值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接比对真实值和预测值:\n", y_test == y_predict)# 方法2:计算准确率score = estimator.score(x_test, y_test)print("在测试集中的准确率为:\n", score)  #0.9736842105263158# 最佳参数:best_params_print("最佳参数:\n", estimator.best_params_) #{'n_neighbors': 3}, 说明k=3时最好# 最佳结果:best_score_print("在训练集中的准确率:\n", estimator.best_score_)  #0.9553030303030303# 最佳估计器:best_estimator_print("最佳估计器:\n", estimator.best_estimator_) # KNeighborsClassifier(n_neighbors=3)# 交叉验证结果:cv_results_print("交叉验证过程描述:\n", estimator.cv_results_)#最佳参数组合的索引:最佳k在列表中的下标print("最佳参数组合的索引:\n",estimator.best_index_)#通常情况下,直接使用best_params_更为方便return Noneknn_iris_gscv()

五 补充

20 新闻KNN,加GridSearchCV

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

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

相关文章

Ubuntu 服务器实战:Docker 部署 Nextcloud+ZeroTier,打造可远程访问的个人云

本次部署基于 Ubuntu 系统(桌面版 / Server 版通用,核心操作一致),硬件配置参考如下,低配置主机可顺畅运行: ubuntu服务器配置如下 硬件类型具体型号/参数CPUIntel Core i3-6100T内存条8GB(DD…

移动硬盘删除东西后,没有释放空间

请按照以下步骤,从最简单、最常见的原因开始排查和解决:主要原因和解决方案1. 检查操作系统回收站 (最常见原因!)这是最容易被忽略的一点。当您直接在外接移动硬盘上删除文件时,文件并不会直接消失,而是被移到了该移动…

spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)

摘要 本文介绍了基于Spring Boot框架开发的驴友结伴游网站的设计与实现。该网站旨在为旅行爱好者提供一个便捷的平台,使他们能够轻松地寻找伙伴、预定酒店、参与活动以及分享旅行经历。系统主要分为两大模块:用户模块和管理员模块。用户可以通过注册账号…

人机之间的强交互与弱交互

人机交互不是简单的人机,其本质是人机环境系统的交互。在这个系统中,人和机器不是孤立的存在,而是在特定环境下相互影响、相互作用的一部分。人机之间的强交互与弱交互可以从以下几个方面来理解:1、人机强交互通常是指人与机器之间…

OpenCV 基础知识总结

学习网站 https://zhuanlan.zhihu.com/p/483604320 命名空间 using namespace cv; Mat 作用 创建图像(矩阵) 格式 Mat image; //创建一个空图像image,大小为0 Mat image(100,100,CV_8U); //指定矩阵大小(矩阵行数/列数&#xff09…

C#基础(⑦user32.dll)

我们来详细学习如何使用 user32.dll,它是 Windows 系统中负责用户界面交互的核心 DLL,包含窗口管理、消息处理、键盘鼠标输入等功能。下面从基础到进阶,一步一步教你调用其中的常用函数。在 C# 中调用 user32.dll 需要使用 DllImport 特性&am…

Markdown格式.md文件的编辑预览使用

推荐工具Visual Studio Code (VS Code) - 强烈推荐特点:微软出品,免费、开源、跨平台(Windows, macOS, Linux)。拥有海量插件市场。编辑体验:安装 Markdown All in One 等插件后,可以获得语法高亮、实时预览…

TypeScript:unknown 类型

作为前端开发工程师,在 TypeScript 中使用 unknown 类型是提升类型安全的关键实践。下面我会结合实际开发场景详细讲解其特性和价值。unknown 核心特性1.类型安全的顶级类型与 any 类似,可接受任何类型的赋值:let userInput: unknown; userIn…

2025 批量下载hasmart所有知乎回答,文章和想法,导出txt,html和pdf

之前分享过文章2025 一键批量下载备份知乎回答/文章/想法/专栏/视频/收藏夹,导出txt,html和 pdf ,今天继续下载hasmart这个号的所有知乎回答 下载的知乎回答目录,包含发布时间和标题,点击可跳转对应回答。 2019年发布…

mapbox高阶,结合threejs(threebox)添加管道,实现管道流动效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox add加载网格对象 二、🍀…

语音识别后处理——如何语音断句加上标点、顺滑、ITN等

基本流程 基于cpu的计算: 前往intel官网下载libmkl相关的库:libmkl_core.a、libmkl_gf_lp64.a、libmkl_sequential.a # 静默安装 ./intel-onemkl-2025.2.0.629_offline.sh -a -s --eula accept默认安装目录:/opt/intel/oneapi libmkl相关的…

[吾爱出品] 图片转换王 v1.01 - 多格式支持 / 支持pds、Ai格式

[吾爱出品] 图片转换王 多格式支持 链接:https://pan.xunlei.com/s/VOZ81aeES9JDqlcvXPKYlxwqA1?pwdni9b# 图片转换王」是一款专为设计师、自媒体从业者及普通用户打造的专业图片格式转换工具,秉持绿色便携理念,无需繁琐安装步骤&#xf…

GitLab 18.3 正式发布,更新多项 DevOps、CI/CD 功能【一】

沿袭我们的月度发布传统,极狐GitLab 发布了 18.3 版本,该版本带来了通过直接转移进行迁移、CI/CD 作业令牌的细粒度权限控制、自定义管理员角色、Kubernetes 1.33 支持、通过 API 让流水线执行策略访问 CI/CD 配置等几十个重点功能的改进。下面是对部分重…

【macOS】垃圾箱中文件无法清理的--特殊方法

【macOS】垃圾箱中文件无法清理的特殊方法直接拖拽到 Beyond Compare App中,删除时,选择以下选项即可彻底删除。1.在macOS桌面,将垃圾箱打开2.将垃圾文件和文件夹,拖拽到Beyond Compare界面3.选中待删除的文件和文件夹如上图。4.鼠…

Python UV 管理如何使用镜像源安装 Python

uv python install [版本号] --mirrorhttps://github.com/astral-sh/python-build-standalone/releases/download/这是默认情况下 uv python 安装命令,命令会找到 astral 公司在 Github 上的存储库,然后进行下载。我们只需要为 mirror 增加任意 Github 镜…

SPI片选踩坑实录(硬件片选和软件片选)

SPI(Serial Peripheral Interface,串行外设接口)的片选信号(Chip Select,简称 CS 或 SS,即 Slave Select)是 SPI 通信中用于选择从设备的关键控制信号,其作用是在多从设备的 SPI 总线…

从理论到RTL,实战实现高可靠ECC校验(附完整开源代码/脚本)(3) RTL实现实战

第二部分:ECC (30, 24)RTL实现实战 - 精雕细琢的硬件卫士 理论是基石,实现是关键。本部分将 手把手构建参数化、可综合、高可靠的ECC编解码器 。本部分将以MIPI 协议中Packet Header 用到的ECC(30,24) 为例…

揭密设计模式:像搭乐高一样构建功能的装饰器模式

揭密设计模式:像搭乐高一样构建功能的装饰器模式 在软件开发中,我们常常会遇到一个问题:如何给一个对象动态地添加新功能,同时又不想修改它的代码?如果直接在原有类上修修补补,代码会变得臃肿复杂&#xff…

【Vue】前端 vue2项目搭建入门级(二)

本文不同于【Vue】前端 vue2项目搭建入门级(一),本文创建vue2项目方式是一键创建vue2 项目,不需要自己配置。1.cmd进入根目录,输入vue create project(vue create 项目名)创建一个project的项目…

基于SQLite索引的智能图片压缩存储系统设计与实现

摘要 本文介绍一种基于SQLite索引的智能图片压缩存储系统,通过融合图像质量压缩与数据压缩技术,实现60-80%的压缩率,较传统方法压缩效率提升4-5倍。系统采用“大文件存储索引数据库”架构,针对性解决海量图片数据迁移与存储中的核…