分类模型评估方法

1.数据集划分¶

1.1 为什么要划分数据集?¶

思考:我们有以下场景:

  • 将所有的数据都作为训练数据,训练出一个模型直接上线预测

  • 每当得到一个新的数据,则计算新数据到训练数据的距离,预测得到新数据的类别

存在问题:

  • 上线之前,如何评估模型的好坏?

  • 模型使用所有数据训练,使用哪些数据来进行模型评估?

结论:不能将所有数据集全部用于训练

为了能够评估模型的泛化能力,可以通过实验测试对学习器的泛化能力进行评估,进而做出选择。因此需要使用一个 "测试集" 来测试学习器对新样本的判别能力,以测试集上的 "测试误差" 作为泛化误差的近似。

一般测试集满足:

  1. 能代表整个数据集
  2. 测试集与训练集互斥
  3. 测试集与训练集建议比例: 2比8、3比7 等

1.2 数据集划分的方法¶

留出法:将数据集划分成两个互斥的集合:训练集,测试集

  • 训练集用于模型训练
  • 测试集用于模型验证
  • 也称之为简单交叉验证

交叉验证:将数据集划分为训练集,验证集,测试集

  • 训练集用于模型训练
  • 验证集用于参数调整
  • 测试集用于模型验证

留一法:每次从训练数据中抽取一条数据作为测试集

自助法:以自助采样(可重复采样、有放回采样)为基础

  • 在数据集D中随机抽取m个样本作为训练集
  • 没被随机抽取到的D-m条数据作为测试集

1.3 留出法(简单交叉验证)

留出法 (hold-out) 将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 S,另一个作为测试集 T。

from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.model_selection import ShuffleSplit
from collections import Counter
from sklearn.datasets import load_irisdef test01():# 1. 加载数据集x, y = load_iris(return_X_y=True)print('原始类别比例:', Counter(y))# 2. 留出法(随机分割)x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)print('随机类别分割:', Counter(y_train), Counter(y_test))# 3. 留出法(分层分割)x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y)print('分层类别分割:', Counter(y_train), Counter(y_test))def test02():# 1. 加载数据集x, y = load_iris(return_X_y=True)print('原始类别比例:', Counter(y))print('*' * 40)# 2. 多次划分(随机分割)spliter = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)for train, test in spliter.split(x, y):print('随机多次分割:', Counter(y[test]))print('*' * 40)# 3. 多次划分(分层分割)spliter = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=0)for train, test in spliter.split(x, y):print('分层多次分割:', Counter(y[test]))if __name__ == '__main__':test01()test02()

1.4 交叉验证法 

K-Fold交叉验证,将数据随机且均匀地分成k分,如上图所示(k为10),假设每份数据的标号为0-9

  • 第一次使用标号为0-8的共9份数据来做训练,而使用标号为9的这一份数据来进行测试,得到一个准确率
  • 第二次使用标记为1-9的共9份数据进行训练,而使用标号为0的这份数据进行测试,得到第二个准确率
  • 以此类推,每次使用9份数据作为训练,而使用剩下的一份数据进行测试
  • 共进行10次训练,最后模型的准确率为10次准确率的平均值
  • 这样可以避免了数据划分而造成的评估不准确的问题。
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
from collections import Counter
from sklearn.datasets import load_irisdef test():# 1. 加载数据集x, y = load_iris(return_X_y=True)print('原始类别比例:', Counter(y))print('*' * 40)# 2. 随机交叉验证spliter = KFold(n_splits=5, shuffle=True, random_state=0)for train, test in spliter.split(x, y):print('随机交叉验证:', Counter(y[test]))print('*' * 40)# 3. 分层交叉验证spliter = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)for train, test in spliter.split(x, y):print('分层交叉验证:', Counter(y[test]))if __name__ == '__main__':test()

 1.5 留一法

留一法( Leave-One-Out,简称LOO),即每次抽取一个样本做为测试集。

from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import LeavePOut
from sklearn.datasets import load_iris
from collections import Counterdef test01():# 1. 加载数据集x, y = load_iris(return_X_y=True)print('原始类别比例:', Counter(y))print('*' * 40)# 2. 留一法spliter = LeaveOneOut()for train, test in spliter.split(x, y):print('训练集:', len(train), '测试集:', len(test), test)print('*' * 40)# 3. 留P法spliter = LeavePOut(p=3)for train, test in spliter.split(x, y):print('训练集:', len(train), '测试集:', len(test), test)if __name__ == '__main__':test01()

1.6 自助法

每次随机从D中抽出一个样本,将其拷贝放入D,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被抽到; 这个过程重复执行m次后,我们就得到了包含m个样本的数据集D′,这就是自助采样的结果。

import pandas as pdif __name__ == '__main__':# 1. 构造数据集data = [[90, 2, 10, 40],[60, 4, 15, 45],[75, 3, 13, 46],[78, 2, 64, 22]]data = pd.DataFrame(data)print('数据集:\n',data)print('*' * 30)# 2. 产生训练集train = data.sample(frac=1, replace=True)print('训练集:\n', train)print('*' * 30)# 3. 产生测试集test = data.loc[data.index.difference(train.index)]print('测试集:\n', test)

2.分类算法的评估标准¶

2.1 分类算法的评估

如何评估分类算法?

  • 利用训练好的模型使用测试集的特征值进行预测

  • 将预测结果和测试集的目标值比较,计算预测正确的百分比

  • 这个百分比就是准确率 accuracy, 准确率越高说明模型效果越好

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
#加载鸢尾花数据
X,y = datasets.load_iris(return_X_y = True)
#训练集 测试集划分
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
# 创建KNN分类器对象 近邻数为6
knn_clf = KNeighborsClassifier(n_neighbors=6)
#训练集训练模型
knn_clf.fit(X_train,y_train)
#使用训练好的模型进行预测
y_predict = knn_clf.predict(X_test)

 计算准确率:

sum(y_predict==y_test)/y_test.shape[0]

2.2 SKlearn中模型评估API介绍

sklearn封装了计算准确率的相关API:

  • sklearn.metrics包中的accuracy_score方法: 传入预测结果和测试集的标签, 返回预测准去率
  • 分类模型对象的 score 方法:传入测试集特征值,测试集目标值
#计算准确率
from sklearn.metrics import accuracy_score
#方式1:
accuracy_score(y_test,y_predict)
#方式2:
knn_classifier.score(X_test,y_test)

3. 小结¶

  1. 留出法每次从数据集中选择一部分作为测试集、一部分作为训练集
  2. 交叉验证法将数据集等份为 N 份,其中一部分做验证集,其他做训练集
  3. 留一法每次选择一个样本做验证集,其他数据集做训练集
  4. 自助法通过有放回的抽样产生训练集、验证集
  5. 通过accuracy_score方法 或者分类模型对象的score方法可以计算分类模型的预测准确率用于模型评估

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

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

相关文章

阿里后端实习二面

阿里后端实习二面 记录面试题目,希望可以帮助到大家 类加载的流程? 类加载分为三个部分:加载、连接、初始化 加载 类的加载主要的职责为将.class文件的二进制字节流读入内存(JDK1.7及之前为JVM内存,JDK1.8及之后为本地内存)&…

HTML5+CSS3②——图像、超链接、音频、视频

目录 图像 超链接 音频 视频 图像 作用&#xff1a;在网页中插入图片 单标签&#xff1a; 标签名&#xff1a;<img src"图片的URL"> <img src"图片的URL" alt"替换文本" title"提示文本"> 属性写在尖括号里面&#xff0c;…

微服务注册与发现——Eureka

文章目录 Eureka使用引用配置启动类标记访问微服务注册微服务工程添加引用增加配置启动类增加注解启动服务注册 Eureka Server集群部署修改配置文件启动多个eureka实例微服务注册到多个eureka实例 为Eureka Server添加用户认证引入spring-security配置关闭security的csrf&#…

将网页变身移动应用:网址封装成App的完全指南

什么是网址封装&#xff1f; 网址封装是一个将你的网站或网页直接嵌入到一个原生应用容器中的过程。用户可以通过下载你的App来访问网站&#xff0c;而无需通过浏览器。这种方式不仅提升了用户体验&#xff0c;还可利用移动设备的功能&#xff0c;如推送通知和硬件集成。 小猪…

[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接

介绍&#xff1a; opencvsharp进行图像拼一般有2种方式&#xff1a;一种是传统方法将2个图片上下或者左右拼接&#xff0c;还有一个方法就是融合拼接&#xff0c;stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果&#xff1a; …

信息网络协议基础_IP网络服务质量

文章目录 概述为什么要增加服务质量支持功能?如何表述服务质量?如何区分数据QoS网络服务等级协议综合服务原理区分服务原理PHB综合-区分服务概述 为什么要增加服务质量支持功能? 如何表述服务质量?

NVMe over Fabrics:概念、应用和实现

对于大部分人来说&#xff0c;NVMe over Fabrics&#xff08;简称NVMf&#xff09;还是个新东西&#xff0c;因为其第一个正式版本的协议在今年6月份才发布。但是这并不影响人们对NVMf的关注&#xff0c;因为这项依托于NVMe的技术很可能继续改变存储市场格局。 NVMf的贡献在于…

unity随笔- 2D动画制作animation

1.前提&#xff1a;将连续的动作图片制为图集。 2.在Hierarchy中选中含图集的sprites对象。 3.打开animator组件&#xff0c;点击create创建动画组件 4.添加property选择sprite 5.选择图集需要的部分加入animation。&#xff08;animation使用见animator&#xff09;

AI绘画工具Midjourney绘画提示词Prompt分享

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

Mysql 容易忘的 sql 指令总结

目录 一、操作数据库的基本指令 二、查询语句的指令 1、基本查询语句 2、模糊查询 3、分支查询 4、 分组查询 5、分组查询 6、基本查询总结&#xff1a; 7、子查询 8、连接查询 三、MySQL中的常用函数 1、时间函数 2、字符串函数 3、聚合函数 4、运算函数 四、表…

macos 打开终端提示 You have new mail. 去除方法

这个提示信息是macos里面的mail消息提示, 如果需要查看详细的信息可以在终端输入 mail 命令即可查看所有信息, 这些信息都保存在 /private/var/mail/xxx 文件中 xxx 是你的macos的登录用户名, 要去除这些提示,只需要删除这个文件即可 # 删除mail信息存储文件 sudo rm -rf /…

css实现一个斑马条纹动画,实现一个理发店门口的小转转,进度条动画同理!

css实现一个斑马条纹动画&#xff0c;实现一个理发店门口的小转转 前置基础知识 css背景background的重复渐变属性repeating-linear-gradient() 该属性类似于linear-gradient(),但他会在整个方向上重复渐变以覆盖整个容器 一、先写一个普通渐变例子linear-gradient() &…