超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)

1. 模型检验

1.1 Holdout交叉验证

1.1.1 算法

在这种交叉验证技术中,整个数据集被随机划分为训练集和验证集。根据经验,整个数据集的近 70% 用作训练集,其余 30% 用作验证集。

优点:可以快速进行区分,仅仅通过一次区分即可使用。

局限性:

1. 不适用于不平衡数据,例如有80%的正类样本,20%的负类样本,恰好将80%正类样本分为训练集,剩余为测试集,对模型的拟合造成误导。

2. 不适用于小数据集,可能具有我们的模型可能会错过的重要特征,因为它没有对该数据进行训练

1.1.2 代码实现:

from sklearn.model_selection import train_test_split
X = [[2,3,4],[1,2,3],[2,5,6],[1,2,3]]
y = [1,0,1,0]
X_train,x_test,Y_train,y_test = train_test_split(X,y)

1.2 LOOCV

1.2.1 算法

LOOCV方法也包含将数据集分为训练集和测试集这一步骤。但是不同的是,我们现在只用一个数据作为测试集,其他的数据都作为训练集,并将此步骤重复N次(N为数据集的数据数量)。

1.2.2 代码实现

from sklearn.model_selection import LeavePOut,cross_val_score
from sklearn.ensemble import RandomForestClassifier
lpo = LeavePOut(p=1) #p代表验证集的个数
lpo.get_n_splits(X)
tree = RandomForestClassifier()
score = cross_val_score(tree,X,y,cv=lpo) #每一个样本集合的准确率
print(score.mean())

1.3 K-fold Cross Validation K折交叉验证

1.3.1 算法

在这种 K 折交叉验证技术中,整个数据集被划分为 K 个相等大小的部分。每个分区称为一个“折叠”。因此,因为我们有 K 个部分,所以我们称之为 K 折叠。一折用作验证集,其余 K-1 折用作训练集。

该技术重复 K 次,直到每个折叠用作验证集,其余折叠用作训练集。

模型的最终精度是通过取 k-models 验证数据的平均精度来计算的。

1.3.2 代码实现

from sklearn.model_selection import KFold,cross_val_score
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
kf = KFold(n_splits=2)
score= cross_val_score(logreg,X,y,cv=kf)
print(score.mean())

2. 模型评估

2.1 性能指标

准确率:表示预测正确的样本数占总样本数的比例:

精确率:表示预测为正的样本中,确实为正的样本数所占的比例:

召回率:所有确实为正的样本中预测也为正的占比:

F1分数:精确率和召回率的调和平均数,用于综合考虑二者的性能:

2.2 混淆矩阵

混淆矩阵是评判模型结果的指标,属于模型评估的一部分。此外,混淆矩阵多用于判断分类器(Classifier)的优劣,适用于分类型的数据模型。衡量正确预测以及错误预测的对应关系。

from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
y_predict = [1,0,1,0,0,1,1,1,0,0]
y_true = [1,0,1,1,1,1,1,1,0,1]
C1 = confusion_matrix(y_true,y_predict)
CM = ConfusionMatrixDisplay(C1)
CM.plot()

如图所示,横坐标代表预测标签,纵坐标为实际标签,每一个不同颜色的方块代表其对应关系,可以由混淆矩阵得出哪一类别分类效果好,哪一类别的分类效果不尽人意,从而针对化的去改善模型。

2.3 ROC & AUC曲线

2.3.1 概念

这是一个ROC曲线示例图,蓝色险段为ROC曲线,虚线为我们的基准线。其中 ROC 曲线距离基准线越远,则说明该模型的预测效果越好

ROC 曲线接近左上角:模型预测准确率很高

ROC 曲线略高于基准线:模型预测准确率一般

ROC 低于基准线:模型未达到最低标准,无法使用

我们深层次的去剖析这张图表,图的横坐标为FPR,代表在所有真实为负的样本中,模型错误预测为正的比例;纵坐标为TPR也就是我们的Recall(召回率)。ROC曲线不依赖于具体的阈值选择,可以全面评估模型在不同阈值下的表现。

AUC(Area Under the Curve)是ROC曲线下的面积,AUC值越接近于1,模型的性能越好,AUC若等于0.5,则表示模型没有分类能力,相当于随机猜测。AUC值为模型性能提供了一个综合指标,可以比较不同模型的优劣。

但他们的解释起来比较复杂,在某些应用中,可能不如其他指标,例如精准率等。

2.3.2 手写代码演示

def roc(y_true,y_score,pos_label):#统计正样本和负样本的个数num_positive_examples = (y_true == pos_label).sum()num_negative_examples = len(y_true) - num_positive_examplestp,fp = 0,0tpr,fpr,thresholds=[],[],[]score = max(y_score)+1for i in np.flip(np.argsort(y_score)):if y_score[i] != score:fpr.append(fp/num_negative_examples) #对于上一轮的结果进行汇总tpr.append(tp/num_positive_examples)thresholds.append(score) #记录阈值score = y_score[i] #进入新一轮的计算if y_true[i] == pos_label: #新一轮意味都会增加一个预测为pos_label的样本,只需要关注他的真实标签即可tp += 1else:fp += 1fpr.append(fp / num_negative_examples)tpr.append(tp / num_positive_examples)thresholds.append(score)return fpr,tpr,thresholds
y_true = np.array([1,1,0,1,1,1])
y_score = np.array([.9,.8,.7,.6,.55,.54])fpr,tpr,threshold = roc(y_true,y_score,pos_label=1)import matplotlib.pyplot as plt
plt.plot(fpr,tpr)
plt.axis("square")
plt.xlabel("False")
plt.ylabel("True")
plt.show()

2.3.3 调包代码演示

#库绘制ROC,AUC
from sklearn.metrics import roc_curve,auc
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X,y = make_classification(n_samples=1000,n_classes=2,random_state=42)
X_train,X_test,y_train,y_test = train_test_split(X,y)
model = LogisticRegression()
model.fit(X_train,y_train)
y_scores = model.predict_proba(X_test)[:,1]
fpr,tpr,thresholds = roc_curve(y_test,y_scores)
roc_auc = auc(fpr,tpr)plt.figure()
plt.xlim([0,1])
plt.ylim([0,1])
plt.plot(fpr,tpr,color='darkorange',lw=2)
plt.plot([0,1],[0,1],color='navy',linestyle='-')
plt
print(roc_auc)

3. 应用前景

这些指标通过定量评估分类模型性能,帮助我们在实际应用中做出更明智的决策。

1. 制造业:

质量控制:评估自动化质量检测系统的性能,减少产品缺陷率,提高生产效率。

故障预测:精确预测设备故障,减少停机时间和维护成本。

2. 网络安全:

入侵检测:评估入侵检测系统的性能,确保能够准确识别网络攻击和减少误报。

恶意软件检测:评估恶意软件检测模型的精确率和召回率,以确保能够有效识别和阻止恶意软件。

3. 金融领域:

信用评分:高精准率和召回率可以帮助银行降低坏账率。

欺诈检测:高召回率对于捕捉尽可能多的欺诈行为非常重要,同时需要保持精确率以避免过多的误报。

etc.

4. 参考资料

详解机器学习中的7种交叉验证方法!

【机器学习】Cross-Validation(交叉验证)详解 - 知乎

混淆矩阵(Confusion Matrix)-CSDN博客

小白也能看懂的 ROC 曲线详解!

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

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

相关文章

从零开始:CANDelaStudio之CDD S3 Server时间异常

0 前言 关于CDD制作有疑问的小伙伴可以参考以下文章: 从零开始:CANDelaStudio之CDD制作(一) 从零开始:CANDelaStudio之CDD制作(二) 本文主要对日常在CDD中碰到的一些问题做一个补充。 1 …

如何获知表中数据被删除

目录 1. 使用触发器 (Triggers)示例 2. 使用审计工具 (Audit Tools)示例 3. 使用Binlog (Binary Log)示例 4. 使用应用层记录日志示例 总结 要查询 MySQL 数据库表中的数据何时被删除,可以采取以下几种方法: 1. 使用触发器 (Triggers) 可以在表上创建一…

生成树协议STP(Spanning Tree Protocol)

为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等问题,进而会影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol&#xff0…

Spring Cloud Alibaba-09-Seata分布式事务

Lison <dreamlison163.com>, v1.0.0, 2024.5.03 Spring Cloud Alibaba-09-Seata分布式事务 文章目录 Spring Cloud Alibaba-09-Seata分布式事务分布式事务基础事务本地事务分布式事务分布式事务的场景 分布式事务的解决方案全局事务可靠消息服务最大努力通知TCC事务 Se…

PDF高效编辑器革新:一键智能转换PDF至HTML,轻松开启文件处理全新时代!

信息爆炸的时代&#xff0c;PDF文件因其跨平台、不易修改的特性&#xff0c;成为了商务、教育、出版等领域不可或缺的文件格式。然而&#xff0c;PDF文件的固定性也带来了诸多不便&#xff0c;特别是在需要对其内容进行编辑或格式转换时。这时&#xff0c;一款高效、易用的PDF编…

【CSDN不太方便,以后学习在有道】

【有道云笔记】程序员学习规划

基于Springboot + vue实现的文化民俗网站

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

宝塔 nginx 配置负载均衡 upstream

nginx 主配置文件加入 upstream myapp1 {server 192.168.124.101:5051;server 192.168.124.102:5052;server 192.168.124.111:5050;}站点配置文件中加入 location / {proxy_pass http://myapp1;}80端口映射到外网域名配置方法 加入红框中的代码 upstream myapp3 {server 192.16…

protobufjs 配置踩坑记录

本文主要是小程序使用PB协议&#xff0c;以下时博主遇到的问题以及解决办法。 1、安装protobufjs npm install --save protobufjs 注意&#xff1a;我之前也使用过 npm install -g protobufjs去安装&#xff0c;但是出现以下的问题&#xff0c;关键是我使用sudo 清除相关文件…

WebSocket --学习笔记

一、概述 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 想象一下平时我们使用的聊天软件&#xff0c;当你发送一条信息后…

STL:vector

文章目录 标准库中的vectorvector的构造vector的迭代器vector的容量vector的元素访问data vector的修改 vector和string的迭代器失效问题resize、reserve、insert、push_back、assigneraseg 和 vs 的区别string解决迭代器失效的方法 标准库中的vector vector是表示可变大小数组…

elasticsearch运维_分享两个自己整理的比较好用的elasticsearch脚本

今天分享两个自己编写整理的比较好用的脚本,我平时也经常在elasticsearch生产环境使用。 后面将会不定期给大家分享自己在生产运维中整理的好的脚本和命令给大家分享。 #!/bin/bash# 定义 Elasticsearch 地址、端口、用户名和密码 ES_HOST="192.168.xxx.xxx" ES_P…

深度学习设计模式之装饰器模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 装饰器模式属于结构型模式&#xff0c;又叫包装设计模式&#xff0c;动态的将责任添加到对象上。 一、介绍 装饰器模式又叫包装设计模式&#xff0c;为现有的类的一个…

STL中list的模拟实现

目录 list模拟实现 list节点 list的push_back()函数 list的迭代器操作&#xff08;非const&#xff09; list的迭代器操作&#xff08;const&#xff09; list迭代器const 非const优化 list的insert()函数 list的erase()函数 list的pop_back() push_front() pop_front(…

M3/M4 Ultra Mac Pro:你需要知道的一切

本文翻译自&#xff1a;M3/M4 Ultra Mac Pro: Everything you need to know (By Roman Loyola2024年5月15日 ) https://www.macworld.com/article/2320613/m3-m4-ultra-mac-pro-everything-you-need-to-know.html 文章目录 Mac Pro M3/M4&#xff1a;发布日期Mac Pro M3/M4&…

代码随想录|Day34|贪心算法 part03|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

1005.K次取反后最大化的数组和 class Solution: def largestSumAfterKNegations(self, nums: List[int], k: int) -> int: nums.sort() for i in range(len(nums)): if nums[i] < 0 and k > 0: nums[i] -nums[i] k - 1 if k % 2 1: nums.sort() nums[0] *…

C语言网页编程:深度探索与实践挑战

C语言网页编程&#xff1a;深度探索与实践挑战 在编程的广阔领域中&#xff0c;C语言以其高效、稳定和接近底层的特性著称。然而&#xff0c;当提及C语言与网页编程的结合时&#xff0c;许多人可能会感到困惑。毕竟&#xff0c;C语言通常被视为系统级编程的利器&#xff0c;而…

Expression #1 of SELECT list is not in GROUP BY clause and

mybatis-plus mysql8.0 group 1055 - Expression #1 报错信息 "mybatis-plus mysql8.0 group 1055 - Expression #1" 指的是在使用MyBatis-Plus操作MySQL数据库时遇到了错误。这个错误通常是由于MySQL 8.0版本的SQL模式中引入了ONLY_FULL_GROUP_BY&#xff0c;这个规…

JAVA:使用ServerSocket实现多线程的服务器功能

目录 一、服务端 二、Task任务类。 三、客户端请求 一、服务端 创建数据源&#xff0c;并实现ServerSocket&#xff0c;当有连接进来时&#xff0c;创建Task任务类&#xff0c;交由线程池处理&#xff0c;主程序在s.accept();继续等待新的连接&#xff08;这个等待是阻塞制的…

手写一个vue2的diff案例

一、Vue为什么需要采用虚拟DOM&#xff1f; 虚拟 DOM 在 Vue 中起到了优化性能、提供跨平台兼容性 以及简化开发流程的作⽤。 虚拟 DOM 可以减少直接操作实际 DOM 的次数。虚拟 DOM 是⼀个抽象层&#xff0c;将实际 DOM 抽象为⼀个跨平台 的表示形式。使得vue 可以在不同的平…