一起学数据分析_3(模型建立与评估_2)

为什么要评估?

在进行数据分析时,尤其是在使用像sklearn这样的机器学习库建立模型后,模型评估的重要性不言而喻。模型评估不仅是对模型性能的一次全面检验,更是确保模型在实际应用中能够达到预期效果的关键步骤。

首先,模型评估有助于我们了解模型的性能表现。通过评估,我们可以知道模型在训练集和测试集上的准确率、精确率、召回率等指标,从而判断模型是否达到了预期的分类或预测效果。

其次,模型评估有助于我们进行模型优化。在评估过程中,我们可能会发现模型在某些特定情况下表现不佳,如对于某些类别的分类效果较差或对于某些特征的预测能力较弱。这些信息可以指导我们进行模型调整,如修改模型参数、增加特征或改变特征处理方式等,以提升模型的性能。

此外,模型评估还有助于我们进行模型选择。在实际应用中,我们通常会尝试多种不同的模型来解决同一个问题。通过评估各种模型的性能,我们可以选择出最适合当前任务的模型。这不仅可以提高解决问题的效率,还可以确保我们使用的模型是最优的。

最后,模型评估还有助于我们确保模型的泛化能力。一个好的模型不仅应该在训练集上表现良好,还应该在未见过的数据上具有良好的性能。通过评估模型在测试集上的表现,我们可以对模型的泛化能力有一个大致的了解,从而判断模型是否能够在实际应用中稳定地发挥作用。

1.模型建立

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import Image
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split

# 一般先取出X和y后再切割,有些情况会使用到未切割的,这时候X和y就可以用,x是清洗好的数据,y是我们要预测的存活数据'Survived'
data = pd.read_csv('clear_data.csv')
train = pd.read_csv('train.csv')
X = data
y = train['Survived']

# 对数据集进行切割
# stratify参数分层抽样,保证数据划分均匀,防止全是某一类的数据
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

# 默认参数逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)

2.模型评估

  • 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。在交叉验证中,数据被多次划分,并且需要训练多个模型。
  • 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。

  • 准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
  • 召回率(recall)度量的是正类样本中有多少被预测为正类
  • f-分数是准确率与召回率的调和平均

1.交叉验证 :

 leg.将数据分为五等分,一份作测试集其他四份作训练集,交叉验证不同划分情况的预测效果。

 
from sklearn.model_selection import cross_val_score

lr = LogisticRegression(C=100)
# cv参数决定交叉数据集这么划分
scores = cross_val_score(lr, X_train, y_train, cv=10)

# k折交叉验证分数
scores

# 平均交叉验证分数
print("Average cross-validation score: {:.2f}".format(scores.mean()))

          

 2.混淆矩阵

  • 计算二分类问题的混淆矩阵
  • 计算精确率、召回率以及f-分数

混淆矩阵也叫误差矩阵,是表示精度评价的一种标准格式。

  • TN表示负的类.....
  • 负的类预测为负的类,则就是Ture负类(真的负类)..
  • 同理,正的的类预测为负的类,则就是False负类(假的负类)..
  • 与医学中的假阳性和假阴性一样划分原理

 例子:

多分类问题时多元混淆矩阵二分化,只需要将矩阵划分为正确预测和没有正确预测的。

from sklearn.metrics import confusion_matrix

# 训练模型
lr = LogisticRegression(C=100)
lr.fit(X_train, y_train)

# 模型预测结果
pred = lr.predict(X_train)

# 混淆矩阵
# 0死亡,1幸存
confusion_matrix(y_train, pred, labels=[0,1])

from sklearn.metrics import classification_report

# 分类报告
# 精确率、召回率以及f1-score
print(classification_report(y_train, pred))

 死亡人数355+57人,其中成功预测355人,错误预测为存活的57人。

3.ROC曲线

(ROC曲线)接受者操作特性曲线,是指在特定刺激条件下,以被试在不同判断标准下所得的虚报概率P(y/N)为横坐标,以击中概率P(y/SN)为纵坐标,画得的各点的连线。

 横轴:虚惊率,纵轴:击中率。因此图像右上凸越好。

  • ROC曲线在sklearn中的模块为sklearn.metrics
  • ROC曲线下面所包围的面积越大越好
绘制一条ROC曲线: 
from sklearn.metrics import roc_curve

# roc_curve,使用函数
#  lr.decision_function逻辑回归中的参数
# 返回的是array,一些值,需要再画出来
fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test))

# 画图
plt.plot(fpr, tpr, label="ROC Curve")
# False Positive Rate
plt.xlabel("FPR")
# Ture Positive Rate
plt.ylabel("TPR (recall)")

# 找到最接近于0的阈值(最优点)
# 判断正负类的边界值
# 对参数thresholds求绝对值,然后找到最接近0的,并保存坐标
close_zero = np.argmin(np.abs(thresholds))
plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label="threshold zero", fillstyle="none", c='k', mew=2)
# 对角线
plt.plot([0, 1], [0, 1],'r--')
plt.legend(loc=4)

在这里我加了对角线:

 绘制多条ROC曲线:
# 多个模型,多条ROC曲线
from sklearn.metrics import roc_curve, auc

# 调参后的模型
lr2 = LogisticRegression()
lr2.fit(X_train, y_train)
lr_pred2 = lr2.predict(X_train)

rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
rfc2.fit(X_train, y_train)
rfc2_pred2 = rfc2.predict(X_train)

# RandomForestClassifier 类并没有decision_function 这个属性或方法。

fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test))
fpr2, tpr2, thresholds2 = roc_curve(y_test, lr2.decision_function(X_test))
# 使用predict_proba来获取概率估计
fpr3, tpr3, thresholds3 = roc_curve(y_test, rfc2.predict_proba(X_test)[:,1])

# 计算 ROC AUC
roc_auc = auc(fpr, tpr)
roc_auc2 = auc(fpr2, tpr2)
roc_auc3 = auc(fpr3, tpr3)

# 画图
plt.plot(fpr, tpr, label='ROC curve1 (area = %0.3f)' % roc_auc)
plt.plot(fpr2, tpr2, 'm', label='ROC curve1 (area = %0.3f)' % roc_auc2)
plt.plot(fpr3, tpr3, 'y', label='ROC curve1 (area = %0.3f)' % roc_auc3)
plt.plot([0, 1], [0, 1],'r--')

# False Positive Rate
plt.xlabel("FPR")
# Ture Positive Rate
plt.ylabel("TPR (recall)")
# 添加图例,不需要传递任何参数
plt.legend()
plt.show()

 在这个过程中遇到三个问题,

1、RandomForestClassifier函数没有decision_function 这个属性或方法;

解决:使用predict_proba函数来获取概率估计

fpr3, tpr3, thresholds3 = roc_curve(y_test, rfc2.predict_proba(X_test)[:,1])

2、画图时图例无法显示

解决:添加图例,不需要传递任何参数

plt.legend()
plt.show()

3、多曲线画图时根据视频用的另一个函数plt_roc_curve,我的sklearn.metrics里没有,可能是版本的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flink1.18.0报错 an implicit exists from scala.Int => java.lang.Integer, but

完整报错 type mismatch;found : Int(100)required: Object Note: an implicit exists from scala.Int > java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to a…

外卖点餐系统 |基于springboot框架+ Mysql+Java+JSP技术+Tomcat的外卖点餐系统 设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 骑手功能模块 商家功能模块 管理员功能登录前台功能效果图 用户功能模块 系统功能设…

Redis远程连接本机——Docker

1. Docker拉取redis镜像并创建容器 1.1 拉取redis镜像 如果要指定redis版本,需要使用redis:(版本),不写默认最新版本 docker pull redis1.2 创建容器并挂载配置文件 创建一个redis目录,并在其创建一个conf目录和一个d…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Rating)

提供在给定范围内选择评分的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Rating(options?: { rating: number, indicator?: boolean }) 从API version 9开始&#…

layui table列表重载后保持进度条位置不变

使用layui的table表格组件时,当我们操作了某行的修改后,刷新了页面,进度条则跳回到最上面。 除了layui高版本应该内置有方法解决了此问题,但是低版本需要另外想办法解决。 具体解决方式如下: 1.在编辑操作成功前&am…

数据可视化-ECharts Html项目实战(2)

在之前的文章中,我们学习了如何创建简单的折线图,条形图,柱形图并实现动态触发,最大最小平均值。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下…

RabbitMQ进阶

1.消息可靠性 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: - 发送时丢失: - 生产者发送的消息未送达exchange - 消息到达exchange后未到达queue - MQ宕机,queue将消息丢失 - consumer接收到消息后未消费就宕机 …

Rocky Linux 基本工具的安装

1.系统安装后先查看ip地址 ip addr 2.安装net工具 :ifconfig yum install net-tools 3.安装gcc ;选择都选 y yum install gcc yum install gcc-c 4.安装tcl yum install -y tcl 5.安装lsof (端口查看工具) yum install l…

JMeter 面试题及答案整理,最新面试题

JMeter中如何进行性能测试的规划和设计? 进行JMeter性能测试的规划和设计主要遵循以下几个步骤: 1、确定测试目标: 明确性能测试的目的和目标,比如确定要测试的系统性能指标(如响应时间、吞吐量、并发用户数等&#…

前端跨平台开发框架:简化多端开发的利器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

#QT(MainWindow初尝---文本编辑器)

1.IDE:QTCreator 2.实验:使用MainWindow做一个文本编辑器 3.记录 (1)创建几个功能 (2)为几个功能写实现,这里不能使用转到槽,需要自己用connect函数关联。这里的功能是QAction类&am…

FAN3224TMX门极驱动器中文资料PDF数据手册引脚图参数价格图片功能特性

产品概述: FAN3223-25 系列双 4A 门极驱动器以较短的开关间隔提供高峰值电流脉冲,用于在低侧开关应用中驱动 N 沟道增强模式 MOSFET。该驱动器提供 TTL 或 CMOS 输入阈值。内部电路将输出保持在低电平,直到电源电压处于运行范围内&#xff0…

洛谷 P1958 上学路线

题目描述 你所在城市的街道好像一个棋盘,有 a 条南北方向的街道和 b 条东西方向的街道。南北方向的 a 条街道从西到东依次编号为 1 到 a,而东西方向的 b 条街道从南到北依次编号为 1 到 b,南北方向的街道 i 和东西方向的街道 j 的交点记为 (…

Swift 面试题及答案整理,最新面试题

Swift 中如何实现单例模式? 在Swift中,单例模式的实现通常采用静态属性和私有初始化方法来确保一个类仅有一个实例。具体做法是:定义一个静态属性来存储这个单例实例,然后将类的初始化方法设为私有,以阻止外部通过构造…

基于CNN多阶段图像超分+去噪(超级简单版)

这是之前的一项工作,非常简单,简单的复现了两个算法,然后把它们串起来了。 可执行的程序链接:CSDN; Github 我们分成两部分进行讲解: 1. 图像去噪 1.1 基本思路 图像的去噪工作基于很普通的CNN去噪,效…

Linux操作系统-汇编LED驱动程序基础

一、汇编LED原理分析 IMX6ULL-LED灯硬件原理分析: 1、使能时钟,CCGR0-CCGR6这7个寄存器控制着IMX6ULL所有外设时钟的使能。为了简单,设置CCGR0-CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能全部外设时钟。(在IMX6ULL芯…

java算法第25天 | ● 216.组合总和III ● 17.电话号码的字母组合

这两道题都是基于回溯的基本问题。 216.组合总和III 这道题是77.组合问题的变体&#xff0c;只不过终止条件多了一个和等于n。 class Solution {List<List<Integer>> resnew ArrayList<>();List<Integer> pathnew ArrayList<>();public List&l…

matlab采用PSO优化算法进行机器人线路规划

1、内容简介 略 63-可以交流、咨询、答疑 matlab采用PSO优化算法进行机器人线路规划 2、内容说明 避障&#xff0c;PSO算法&#xff0c;固定点优化&#xff0c;支持障碍物、优化点设置 matlab采用PSO优化算法进行机器人线路规划 3、仿真分析 4、参考论文 略

FFmpeg查看所有支持的编码/解码器/封装/解封装/媒体格式/滤镜

查看所有支持的编码器与解码器 ffmpeg -codecs 只查看所有编码器: ffmpeg -encoders 只查看所有解码器: ffmpeg -decoders 只查看H264编码器: ffmpeg -h encoderh264 只查看H264解码器: ffmpeg -h decoderh264 查看所有支持的封装: ffmpeg -muxers 查看所有支持的解封装…

【MySQL】5. 数据类型

数据类型 1. 数据类型分类 2. 数值类型 2.1 tinyint类型 数值越界测试&#xff1a; mysql> use tt; Database changed mysql> create table t1(-> num tinyint-> ); Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(-128); Query OK, 1 r…