【Python机器学习系列】一文讲透机器学习中的K折交叉验证(源码)

一、简介

    前面我详细介绍了关于机器学习的归一化和反归一化以及表格数据在机器学习中的输入格式问题:

    一文彻底搞懂机器学习中的归一化与反归一化问题

    【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式(理论+源码)

    本文将介绍机器系学习中的K折交叉验证的使用方法。

    交叉验证(Cross-validation)是一种在机器学习中常用的模型评估技术,用于估计模型在未知数据上的性能。它通过将数据集划分为训练集和验证集,并多次重复这个过程来评估模型的性能。

    k折交叉验证是将数据分为k份,选取其中的k-1份为训练数据,剩余的一份为测试数据。k份数据循环做测试集进行测试。此原理适用于数据量小的数据。

    使用交叉验证,可以实现:

  • 寻找单个模型最好的效果时候的数据集划分以及参数

  • 比较多个模型,选择最佳模型

二、实现

准备数据

import pandas as pd# 准备数据
data = pd.read_csv(r'G:\数据杂坛\\UCI Heart Disease Dataset.csv')
df = pd.DataFrame(data)# 目标变量和特征变量
target = 'target'
features = df.columns.drop(target)
X = df[features].values
y = df[target].values

方法1

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFoldkf = KFold(n_splits = 5, shuffle=True, random_state=0)
score=0
for train_index, test_index in kf.split(y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]clt = DecisionTreeClassifier(max_depth=5, random_state=0).fit(X_train, y_train)curr_score = clt.score(X_test, y_test)print("准确率为:", curr_score)score = score + curr_scoreavg_score = score / 5
print("平均准确率为:", avg_score)

n_splits = 5,表示进行5折交叉验证,分别计算每一次的准确率,最后求得平均准确率。使用KFold.split()实现,效果如下:

图片

方法2

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_scorekf = KFold(n_splits=5, shuffle=True, random_state=0)
model1 = DecisionTreeClassifier(max_depth=5, random_state=0)
scores_model1 = cross_val_score(model1, X, y, cv=kf)
print("准确率为:", scores_model1)
print("平均准确率为:", scores_model1.mean())

直接使用sklearn中的cross_val_score()函数实现,效果和第一种方法一样,结果如下:

图片

三、应用场景

方法1 选择模型效果最好的数据集划分

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFoldkf = KFold(n_splits = 5, shuffle=True, random_state=0)
score=0
best_score = -float('inf')  # 初始化为正无穷大
best_train_index = None
best_test_index = None
for train_index, test_index in kf.split(y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]clt = DecisionTreeClassifier(max_depth=5, random_state=0).fit(X_train, y_train)curr_score = clt.score(X_test, y_test)print("准确率为:", curr_score)score = score + curr_score# 如果当前数据集划分的性能更好,则更新最佳数据集划分if curr_score > best_score:best_score = curr_scorebest_train_index = train_indexbest_test_index = test_indexavg_score = score / 5
print("平均准确率为:", avg_score)
print("Best train indices:", best_train_index)
print("Best test indices:", best_test_index)
X_train, X_test = X[best_train_index], X[best_test_index]
y_train, y_test = y[best_train_index], y[best_test_index]

KFold的split方法会生成交叉验证的训练集和测试集索引,然后你可以使用这些索引将数据集划分为相应的训练集和测试集。通过在每个数据集划分上训练模型并评估性能,你可以选择具有最佳性能的数据集划分。最后,你可以打印最佳数据集划分的索引,以便进一步分析和使用。

方法2 用于比较不同模型的评分,选择最优模型

from sklearn.linear_model import LogisticRegressionkf = KFold(n_splits=5, shuffle=True, random_state=0)
model1 = DecisionTreeClassifier(max_depth=5, random_state=0)
model2 = LogisticRegression()
scores_model1 = cross_val_score(model1, X, y, cv=kf)
scores_model2 = cross_val_score(model2, X, y, cv=kf)
print("model1准确率为:", scores_model1)
print("model1平均准确率为:", scores_model1.mean())
print("model2准确率为:", scores_model2)
print("model2平均准确率为:", scores_model2.mean())

通过比较不同模型的评分,你可以选择最佳模型,评分较高的模型通常具有更好的性能。

图片

好了,本篇内容就到这里,需要数据集和源码的小伙伴可以关注我领取

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。

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

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

相关文章

Mysql workbench

下载地址: https://download.csdn.net/download/a876106354/88616595

Numpy: 修改numpy的dtype

要修改NumPy数组的dtype,可以使用astype()方法。这个方法将创建一个新的数组,其数据类型(dtype)由参数指定。 下面是一个例子,展示如何将一个NumPy数组的dtype从int64修改为float32: import numpy as np# 创建一个in…

进程概念【linux】

进程基础 在学习进程之前,首先要有一定的计算机硬件和软件基础。 硬件基础:冯诺依曼体系结构 如图,是计算机在硬件上的体系结构。 下面举出一些常见的输入输出设备(有些设备只作输出设备,或者只作输入设备&#xff…

LLM之Prompt(三)| XoT:使用强化学习和蒙特卡罗树搜索将外部知识注入Prompt中,性能超过CoT,ToT和GoT

​论文地址:https://arxiv.org/pdf/2311.04254.pdf 一、当前Prompt技术的局限性 LLM使用自然语言Prompt可以将复杂的问题分解为更易于管理的“thought”可以回复用户的问题。然而,大多数现有的Prompt技术都有局限性: 输入输出(I…

【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】

【QT 5 调试软件Linux下调用脚本shell-经验总结初步调试基础样例】 1、前言2、实验环境3、自我总结4、实验过程(1)准备工作-脚本1)、准备工作-编写运行脚本文件2)、给权限3)、运行脚本 (2)进入q…

pytorch一致数据增强

分割任务对 image 做(某些)transform 时,要对 label(segmentation mask)也做对应的 transform,如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍,则涉及随机操作的…

计算机网络网络层(期末、考研)

计算机网络总复习链接🔗 目录 路由算法静态路由与动态路由距离-向量算法链路状态路由算法层次路由 IPv4(这个必考)IPv4分组IPv4地址与NAT子网划分与子网掩码、CIDRARP、DHCP与ICMP地址解析协议ARP动态主机配置协议DHCP IPv6IPv6特点 路由协议…

android studio 创建按钮项目

1&#xff09;、新建一个empty activity项目&#xff0c;切换到project视图&#xff1a; 2&#xff09;、修改app\src\main\res\layout\activity_main.xml文件&#xff0c;修改后如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <andr…

设置Ubuntu或树莓派系统,允许root用户ssh方式连接

Ubuntu 或 Raspbian 系统默认不允许root 用户以ssh方式连接。连接会报如下错误&#xff1a; Permission denied&#xff0c; please try again. 解决步骤&#xff1a; &#xff08;如果是树莓派系统&#xff1a;烧录到内存卡后&#xff0c;拔掉内存卡再重新插到PC机上&#x…

html基础知识

1、文字阴影代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <meta http-eq…

Vue 工作开发小技巧

一、汇总 ​ 本博客&#xff0c;记录了一些Vue在日常开发工作中比较实用的小技巧&#xff0c;后续会陆续添加更新。 ​ 1、利用Sass的:global定义全局样式。 ​ 2、在<style>内部使用v-bind给CSS属性绑定属性值。 ​ 3、父子组件传值时&#xff0c;使用.sync修饰符后…

#HarmonyOS:访问应用资源--系统资源

访问应用资源 在工程中&#xff0c;通过"$r(‘app.type.name’)"的形式引用应用资源。app代表是应用内resources目录中定义的资源&#xff1b;type代表资源类型&#xff08;或资源的存放位置&#xff09;&#xff0c;可以取“color”、“float”、“string”、“plu…

cgteamwork与shotgrid对比

最近有项目接触使用并二开cgteamwork&#xff0c; 也重新认识了cgteamwork&#xff0c;感受到国产软件的强大&#xff0c;国内中小CG公司的首选&#xff0c;原因&#xff1a; 1 上手容易&#xff0c;不会的有售前工程师教&#xff0c;他们全国各地城市到处跑。 感概业务的强大…

Linux: 查看服务器的CPU信息

在linux服务器环境下&#xff0c;可以使用cat /proc/cpuinfo命令查看当前CPU的核数等信息。 cat /proc/cpuinfo 字段解析 /proc/cpuinfo 是一个特殊的文件&#xff0c;在 Linux 系统中提供有关 CPU 的详细信息。它实际上是一个伪文件系统中的文件&#xff0c;通过它可以获取到…

智能优化算法应用:基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法…

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目

下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…

c++向线程函数传递参数及编译错误排查

c向线程函数传递参数及编译错误排查 普通传递 void func(int a) {cout << "a " << a << endl; }int main() {thread t(func, 1); // 第一个是函数名字&#xff0c;第二个函数的参数t.join(); // 注意&#xff0c;不写join会报core dumped }当传…

find_package 和 find_library的区别

背景 经常看CMakeLists.txt中有find_package和find_library&#xff0c;有时候没留意以为都一样&#xff0c;其实二者差距比较大&#xff0c;下面简单记录一下。 find_package find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件&#xff0c;一般在安装库的…

在Java中,为什么在lambda表达式中访问局部变量时,必须将其声明为final或等效的原因是?

lambda表达式实际上是对该变量的一个拷贝而不是引用。 这样做有几个原因&#xff1a; 线程安全性&#xff1a;当一个lambda表达式被创建并传递给另一个线程时&#xff0c;它可能在另一个线程上执行。如果在lambda表达式中访问非final的局部变量&#xff0c;并且该变量在执行过…

桂电|《操作系统》实验一:UNIX/LINUX及其使用环境(实验报告)

桂林电子科技大学2023-2024学年 第 一 学期 操作系统A 实验报告 实验名称 实验一 UNIX/LINUX及其使用环境 实验指导老师&#xff1a; 成绩 院 系 计算机与信息安全学院 专业 计算机科学与技术(卓越工程) 学 号 姓名 课内序…