一起学数据分析_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 RandomForestClassifierfrom 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_scorelr = 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里没有,可能是版本的问题。

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

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

相关文章

Linux 自动备份 mysql 脚本

这个脚本会将数据库备份为一个SQL文件,并将其保存在指定的目录中。 #!/bin/bash# MySQL配置 DB_USER"your_mysql_username" DB_PASS"your_mysql_password" DB_NAME"your_database_name" DB_HOST"localhost"# 备份目录 BAC…

一款比 K8S 更好用的编排工具——Nomod

今天给笔友们推荐一款最近发现的服务编排工具Nomad。综合感觉就是功能很强大,姿势很优雅,相比 K8S 更加轻量级,相比 Docker-Compose 能轻松支持分布式。 Nomad 能做什么? Nomad 采用统一的工作流程,既可以轻松部署和管…

python自动化之(django)(2)

1、创建应用 python manage.py startapp apitest 这里还是从上节开始也就是命令行在所谓的autotest目录下来输入 然后可以清楚的看到 多了一个文件夹 2、创建视图 在views中加入test函数(所建应用下) from django.http import HttpResponse def tes…

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

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

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

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

Ubuntu Desktop - gnome-calculator (计算器)

Ubuntu Desktop - gnome-calculator [计算器] 1. Ubuntu Software -> gnome-calculator -> Install -> Continue2. Search your computer -> Calculator -> Lock to LauncherReferences 1. Ubuntu Software -> gnome-calculator -> Install -> Continu…

STM32中MicroLIB的关闭为什么会导致卡死----解析

STM32MicroLIB 大家好我是 MHZ 。最近又开始往回捡单片机的知识了~ 之前大学的时候都没用过 STM 的 CubeMX,这会拿来用着感觉很方便啊~ 果然科技在进步! 在开发使用 Keil 对 STM32 进行开发的时候在会有一个叫做 MicroLIB 的选项。 这个的具体原因我搜…

C语言 内存函数

目录 前言 一、memcpy()函数 二、memmove()函数 三、memset函数 四、memcmp()函数 总结 前言 在C语言中内存是我们用来存储数据的地址,今天我们来讲一下C语言中常用的内存函数。 一、memcpy()函数 memcpy()函数与我们之前讲的strcpy()函数类似,只…

Android FrameWork 学习路线

目录 前言 学习路线: 1.基础知识 2、AOSP 源码学习 3. AOSP 源码编译系统 4. Hal与硬件服务 5.基础组件 6. Binder 7. 系统启动过程分析 8. 应用层框架​编辑 9. 显示系统 10. Android 输入系统 11. 系统应用 前言 Android Framework 涉及的行业相当广…

Django 解决新建表删除后无法重新创建等问题

Django 解决新建表删除后无法重新创建等问题 问题发生描述处理办法首先删除了app对应目录migrations下除 __init__.py以外的所有文件:然后,删除migrations中关于你的app的同步数据数据库记录最后,重新执行迁移插入 问题发生描述 Django创建的表&#xf…

HCIP—OSPF课后练习一

本实验模拟了一个企业网络场景,R1、R2、R3为公司总部网络的路由器,R4、R5分别为企业分支机构1和分支机构2的路由器,并且都采用双上行方式与企业总部相连。整个网络都运行OSPF协议,R1、R2、R3之间的链路位于区域0,R4与R…

uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表

列表的加载动作,在移动端开发中随处可见,笔者也是经常用到。今天正好有空,做一个总结,方便以后使用。uniapp 利用uni-list 和 uni-load-more 组件上拉加载列表操作步骤如下:1、资料准备 1)、uni-load-more…

JavaWeb--HTML

一:HTML简介 *HTML是一门语言,所有的网页都是用HTML这门语言编写出来的; *HTML:超文本标记语言; 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还能定义图片&#xff…

C#对ListBox控件中的数据进行的操作

目录 1.添加数据: 2.删除数据: 3.清空数据: 4.选择项: 5.排序: 6.获取选中的项: 7.获取ListBox中的所有项: 8.综合示例 C#中对ListBox控件中的数据进行的操作主要包括添加、删除、清空、…

zookeeper快速入门二:zookeeper基本概念

本文是zookeeper系列之快速入门中的第二篇,欢迎大家观看与指出不足。 目录 一、zookeeper的存储结构 二、什么是znode 三、znode节点的四种类型 四、权限控制ACL(Access Control List) 五、事件监听watcher 一、zookeeper的存储结构 z…

Tomcat Session 集群 ---------会话保持

一、 负载均衡、反向代理 环境搭建: nginx服务器192.168.246.7 tomcat 1服务器192.168.246.8 tomcat 2服务器192.168.246.9 7-1 nginx服务器搭建 [rootzzcentos1 ~]#systemctl stop firewalld [rootzzcentos1 ~]#setenforce 0 [rootzzcentos1 ~]#yum install …

springboot“财来财往”微信小程序

摘 要 相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低理财公司的运营人员成本,实现了“财来财往”的标准化、制度化、程序化的管理,有效地防止了“财来财往”的随意管理,提高了信息的处理速度和精确度,能…

NeRF学习——NeRF-Pytorch的源码解读

学习 github 上 NeRF 的 pytorch 实现项目(https://github.com/yenchenlin/nerf-pytorch)的一些笔记 1 参数 部分参数配置: 训练参数: 这段代码是在设置一些命令行参数,这些参数用于控制NeRF(Neural Radi…

OpenCV 图像重映射函数remap()实例详解

OpenCV 图像重映射函数remap()对图像应用通用几何变换。其原型如下: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode BORDER_CONSTANT, const Scalar & borde…

回答自己一年前的一个问题,python如何动态拼接sql

首先谈谈应用场景吧,前提是针对查询接口做接口自动化,接口校验的脚本中,一般以响应报文作为预期值,通过sql查出的数据库值作为实际值,二者对比通过则认为接口输出正确。而sql从何而来呢,对于查询接口一般是…