机器学习入门(六):分类模型评估方法

news2024/11/28 6:37:12

目录

1. 数据集划分

1.1 为什么要划分数据集?

1.2 数据集划分的方法

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

1.4 交叉验证法

1.5 留一法

1.6 自助法

2. 分类算法的评估标准

2.1 分类算法的评估

2.2 SKlearn中模型评估API介绍

3. 小结

前言

掌握分类模型评估方法对于数据科学家和机器学习工程师至关重要。它不仅帮助验证模型的有效性,还能指导模型优化方向,确保模型在实际应用中表现优异。通过精确率、召回率等指标,可以全面评估模型性能,识别误分类的类别,从而针对性地改进。

学习目标

  1. 掌握数据集划分中留出法、交叉验证法、留一法 API 的使用

  2. 了解数据集划分中自助法的采样规则

  3. 掌握分类问题评估方法

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_iris
​
​
def 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_iris
​
def 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 Counter
​
​
def 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 pd
​
​
if __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.coloradmin.cn/o/2034841.html

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

相关文章

测试流程规范--准入准出规则

简介: 为了加强测试部软件测试的质量控制及与测试相关部门、人员更好理解测试各阶段的准入/准出条件而建立的准入/准出规范。 一,目的 为了加强测试部软件测试的质量控制及与测试相关部门、人员更好理解测试各阶段的准入/准出条件而建立的准入/准出规范…

【python】在Python中操作MongoDB的详细用法教程与实战案例分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

《黑神话:悟空 性能测试工具》Steam已免费开放下载

《黑神话:悟空》将于8月20日上午10点正式解锁,届时大家就能体验到这款期待三年的国产3A之光了。为了方便大家游玩,官方提前上线了性能测试工具,目前《黑神话:悟空 性能测试工具》已在Steam商店开放免费下载。 据Steam评…

Qt | QSQLite内存数据库增删改查

点击上方"蓝字"关注我们 01、演示 参数随便设置 查询 修改 右键菜单是重点 手动提交,点击Submit All

2024下半年软考报考攻略:从报名到拿证全流程,看这一篇就够了!

下半年软考本月就要开启报名了,有一些同学可能是第一次参加,还不清楚具体流程。今天小编就来为大家总结软考从报名到拿证的全过程指南,有需要的可以收藏这篇攻略哦! 一、报名流程 1、登录网站 登录中国计算机技术职业资格网&…

C++结构体指针强制转换以处理电力系统IEC103报文

前言 最近依旧是开发规约解析工具的103篇,已经完成了通用分类服务部分的解析,现在着手开始搞扰动数据传输,也就是故障录波的传输。 在103故障录波(扰动数据)的报文中,数据是一个数据集一个数据集地存放&a…

如何有效优化无线双模蓝牙模块的通讯距离?

许多客户在使用无线双模蓝牙模块时发现传输距离达不到预期要求。影响无线蓝牙模块通讯距离的因素有很多,以下是美迅物联网MesoonRF归纳总结的一些可能的原因以及如何改善: 1.优化天线设计 天线是影响无线双模蓝牙模块通讯距离的关键因素之一,…

IPC进程间通信

信号 信号是一种终端机制,程序运行到一半的时候接收到了某种通知,程序就会立刻中断运行,转而去处理通知。 登记信号 一个进程只会接收默认的几个信号 如果想要让一个进程接收特定信号的话,必须提前在该进程中登记一下想要接收…

一次了解所有功能!超详细【Stable Diffusion界面】大揭秘!

对于AI绘画的初学者而言,一看到SD的UI界面肯定是一脸懵,因为有太多陌生词汇,什么大模型、什么提示词、什么什么采样迭代,和传统的画图方式完全不在一个层面上,学习起来就无从下手~ 今天小元老师就给大家详…

运维高级内容--lvs按权重值轮询调度

创建5台主机(一些配置是基于实验一的基础): 客户端client 172.25.254.200路由器route 172.25.254.100 192.168.0.100 (需要eth0、eth1两个网关)LVS 192.168.0.50webserver1 192.168.0.10webserver2 192.168.0.20 1.LVS主机: vim…

DataGrip安装与MySQL连接

DataGrip安装 官网:DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 点击页面中的【Download】进入下载界面,如下图所示: 根据自己的电脑系统选择不同的版本【windows/macOS/linux】,点击【.exe】可选择…

MySQL(一)——初识数据库(概念、数据类型、基本表库操作)

文章目录 初识数据库数据库相关基本概念数据库的分类 MySQL数据库数据模型基本操作库操作查看数据库创建数据库删除数据库选中数据库 数据类型数值类型字符串类型日期类型 表操作查看所有表查看表结构创建表删除表 其他操作查看警告信息查看编码集 这是我们 MySQL 学习的第一程…

GD32E503实现串口中断收发功能

如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…

JVM知识总结(性能调优)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 性能调优 何时进行JVM调优&#xff1f; 遇到以下情况&#xff0c…

初识C++ · 智能指针

目录 前言&#xff1a; 1 智能指针的发展历史 2 unique_ptr和shared_ptr的基本使用 3 shared_ptr的模拟实现 4 有关定制删除器 前言&#xff1a; 智能指针的引入&#xff0c;我们得先从异常开始说起&#xff0c;异常面临的一个窘境是new了多个对象&#xff0c;抛异常了会…

centos7简介和安装步骤

目录 centos简介 1.CentOS 7 简略简介 2.使用建议 vmware搭建centos7 1.centos镜像下载 2.虚拟机创建 2.1 新建虚拟机 2.2典型 2.3操作系统 2.4客户机操作系统选择 ​编辑 2.5虚拟机命名与位置安装 2.5磁盘容量 2.6完成 2.6编辑虚拟机 2.6.1内存大小编辑 2.6.…

React+vite+antd点击路由切换时出现闪屏

问题描述:点击左侧路由切换会出现闪屏的情况 页面的效果 解决方案 完整代码 import { lazy, Suspense, ReactNode } from "react"; import { Navigate, useLocation } from "react-router-dom"; import LayOut from ../pages/LayOut/LayOut import NotFo…

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令&#xff0c;…

学习记录703@计算机组成原理之原码、补码、反码、移码

数据表示基本概念 数据表示分为有符号数和无符号数&#xff0c;其中有符号数分为整数、纯小数、带小数&#xff1b;整数和纯小数小数点位置固定&#xff0c;统称为定点数&#xff1b;带小数小数点位置可以浮动&#xff0c;称为为浮点数&#xff0c;浮点数阶码就是整数部分&…

忘记iPhone锁屏密码,多次输出密码导致iPhone停用了怎么解锁?

iphone已停用怎么解锁&#xff1f;当因忘记iPhone锁屏密码&#xff0c;多次输入错误密码而被停用时&#xff0c;怎么解锁恢复对设备的访问是非常重要的。下面小编将给大家介绍几种解锁已停用iPhone的方法&#xff0c;一起来看看吧&#xff01; 一、使用恢复模式解锁 将iPhone连…