《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 No.6

news2024/12/27 1:03:26

一、混淆矩阵

1、什么是混淆矩阵?

        混淆矩阵是用于评估分类模型在不同类别上的预测准确性的工具。它提供了模型预测结果与真实结果之间的对应关系,帮助我们分析和理解模型的分类性能。

假设,要对15个人预测是否患病,使用1表示患病,0表示正常,预测结果如下:

        此时,预测患病并且预测对了的人数为5个,可以表示为TP,预测错了的为4个,可以表示为FP,而预测正常且预测对了的人数有2个,可以表示为TN,预测错了的为4个,可以表示为FN

        T 表示 True,表示预测结果为正确的,

        F 表示 False,表示预测结果为正确的

        P 表示 Positive,表示预测的为患病的

        N 表示 Negative,表示预测的为正常的   

由此我们可以将这四个数据转化成如下图的形式:

有了这些数据,我们可以得到以下参数计算结果:

1)Accuracy 准确率

        Accuracy = (TP+TN)/(TP+TN+FP+FN)

        表示预测成功的概率

 

2) Precision 精确率

        Precision = TP / ( TP + FP )

        表示预测患病情况下的预测成功率

 

3)Recall 召回率

        Recall = TP / ( TP + FP )

        表示患病情况下预测正确的概率

 

4)F1-score F1值

        用于衡量模型在预测1类样本时的准确性和覆盖率,其取值范围是0到1,值越接近1表示模型的性能越好,值越接近0表示模型的性能越差

可以使用上节课代码输出结果来看:

metrix.classfication_report(train_y,train_predict)

二、银行贷款案例

        有如下文件,共284808条数据,有31个特征值,第一个Time为贷款时间,倒数第二个Amount为用户年工资,Class为分类,银行可以贷款为0,不可以贷款为1

已进行过脱敏处理

Amount 对应值与前面28列特征值相差太大,需要对其进行 Z标准化

        现在的目的是,有人去银行贷款,输入特征值后得到预测的值,表示银行可以贷款给用户的资金额度。

接下来直接看部分代码(这里只写到创建随机种子):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

# 可视化混淆矩阵,网上都是包装好的,可以直接复制使用
def cm_plot(y, yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt

    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

data = pd.read_csv(r'./creditcard.csv')
data.head()  # 默认输出前5行,这里用来提示防止忘记代码了

# 设置字体,用来显示中文
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False

# 同级class列中每个类型的数据个数,(这里的样本极度不均衡)
labels_count = pd.value_counts(data['Class'])
# 可视化上述分类数据的个数
plt.title("正负例样本数")
plt.xlabel('类别')
plt.ylabel('频数')
labels_count.plot(kind='bar')
plt.show()

# 将Amount列的数据进行Z标准化,因为其余列的值有负值,所以不能使用0-1归一化
# 导入库的用法
from sklearn.preprocessing import StandardScaler
# z标准化
scaler = StandardScaler()  # 这是一个类,专门用来处理z标准化,适合处理大量数据的类,还有一种叫scale,适合对小部分数据进行z标准化
a = data[['Amount']]  # 取出Amount整列数据
data['Amount'] = scaler.fit_transform(data[['Amount']])  # 对Amount整列数据进行z标准化后将其传入原data内,覆盖原来的列

# 删除无用的列,Time列,axis=1表示列,axis=0表示行,然后再传入data文件
data = data.drop(['Time'],axis=1)

# 对数据集取出一部分数据用来当做训练集,一部分当做测试集
# 因为银行贷款可能随时间变化而变化,所以不能直接取前一半后一半的这种,需要对整体数据随机取出一部分当做训练和测试数据
from sklearn.model_selection import train_test_split
# 删除列Class后的数据赋值给 x,然后再将Class单独取出赋值给y
x = data.drop('Class',axis=1)
y = data.Class

# 使用train_test_split函数,放入参数 训练集和训练标签,以及需要取出的测试数据的百分比,以及定义一个随机种子,以保证下一次运行代码的结果不变
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)
# 顺序返回四个参数,分别表示训练集特征值,测试集特征值,训练集标签,测试集标签
# test_size表示需要取出的测试集所占数据集百分比
# random_state表示随机种子,如果不设置随机种子,再次运行代码又会重新随机取一部分数据,最后的正确率可能会发生变化
# 设置随机种子后则会定死这些已经取出过的数据,保证最后结果的正确率保持不变

三、train_test_split 随机取数据

使用train_test_split类来取出训练集和测试集,调用方法和使用方法如下:

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=0)

        其中x表示数据集的特征值,y表示数据集的标签,接下来要从x和y中随机取出测试集和训练集的数据

        test_size :表示需要随机取出的测试集所占数据集的百分比,

        random_state: 表示定义了一个随机种子,因为通过test_size取出的数据是随机的,而每次运行代码都会重新再随机取出数据,使得每次的训练集数据和测试集数据不同,导致最终结果的准确率发生改变,这个准确率可能高可能低,所以这里使用了一个随机种子来固定随机取出的数据,使得下一次运行代码时随机取出的数据不会再发生改变,从而使正确率不会再发生改变。

四、梯度下降

目标函数:也叫损失函数

        这里的 yi 表示真实值,βT Xi表示预测值,他们两个相减则表示误差,因为他们的值可能是负数,所以对其平方再求和,最后的目标是使这个求和的值越小则表示这个线越拟合数据点。

实例:

        有下列一幅图,表示一副可视化的三维图形,其类似于山峦的结构,当你处于山峰上想要下来到最低点的时候,此时看不见山的结构,只能看见周围给定距离(步长/学习率)的画面,只能以给定的步长行走,此时对自己当前位置的山峰以θ0和θ1方向的切开,得到两个曲面,而自己所在位置的点,对应在两个曲面的切线,将曲面切线合并的方向就是梯度方向(类似于向量相加),这个梯度方向则是自己要走下山的方向。如下图所示:

        因为受步长(学习率)的限制,只能以固定的步长向山下走去,但是当走到最下面的时候最接近谷底的时候,最接近谷底的距离少于自己的步长,导致自己又走到了对面的山上,然后再网谷底的方向走,就这样反复来回的在谷底两端徘徊,所以此时则可以去设置参数来调整参数步长的大小,步长太大则导致误差太大,步长太小则导致运行的时间太长。

五、正则化惩罚

        正则化惩罚通过在模型的损失函数中引入一个正则化项,对模型的复杂度进行约束,以防止模型过拟合。这个正则化项一般是模型参数的范数,如L1范数或L2范数。正则化惩罚会对模型的参数进行约束,使得模型更加简单或稀疏,从而减少模型的复杂度。

1、欠拟合

        模型没有训练好,即拟合的程度太差,就拿过来使用,具体展示如下所示,蓝色的线则表示训练好的模型

2、过拟合

        对训练数据训练的特别好,但是也只对训练数据训练的好,但是放入测试数据的准确率就会很差,就相当于学生对一道不会的题目,让他背答案的结果,针对这一题可以直接完美的写完,但是如果稍微更改一点点就不会写了

3、正常状态

4、再看损失函数

        对于上图,如果你的位置在不同的山上,所对应的山脚的位置就不同,这就导致不同的数据所对应的最小值就可能不同,也就说明上述公式的β值就可能有好几种

此时则需要增加一个正则化项来约束模型的复杂度

损失函数:

正则化惩罚:

5、正则化惩罚的两种形式

1)L1正则化

        L1 = 1/2 * λ |θ|   λ叫正则化系数,为上述惩罚中的1/2 θ**2 的倍数

2)L2正则化

        L2 = 1/2 * λ (θ)**2  (用的最多)

在使用参数时选择penalty='l1'或penalty='l2'来选择正则化方式

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

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

相关文章

生产环境中MapReduce的最佳实践

目录 MapReduce跑的慢的原因 MapReduce常用调优参数 1. MapTask相关参数 2. ReduceTask相关参数 3. 总体调优参数 4. 其他重要参数 调优策略 MapReduce数据倾斜问题 1. 数据预处理 2. 自定义Partitioner 3. 调整Reduce任务数 4. 小文件问题处理 5. 二次排序 6. 使用…

【python与java的区别-03(集合、字典)】

一、Set python: 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数…

【解释器模式】设计模式系列:构建动态语言解释器与复杂表达式处理(深入理解并实现)

文章目录 深入理解并实现解释器模式1. 引言1.1 解释器模式的定义1.2 模式的主要优点和缺点1.3 适用场景1.4 实际应用案例简介 2. 解释器模式的基本概念2.1 模式的核心思想2.2 模式的角色2.3 模式的动态行为分析 3. 解释器模式的工作原理3.1 如何构建表达式树3.2 如何通过递归遍…

可达鸭举牌网页版本在线生成源码html5

源码介绍 可达鸭举牌网页版本,在线生成源码,点击分享即可制作DIY自己的举牌文字网页,需要GIF动图的自行用GIF图片录制工具录制下来。 PS:上传到服务器运行或者本地nginx运行,不要双击index.html,如果本地双击HTML&…

【3】AT32F437 OpenHarmony轻量系统第一个程序:点灯

在搭建好AT32F437 OpenHarmony 轻量系统之后,当然要尝试点一下灯了。 编写点灯程序 笔者在适配OpenHarmony轻量系统的时候,只对源码的device和vendor目录进行了修改,AT32的app目录笔者放置在了vendor/tree/master/artery/AT-START-F437/app…

什么是网络安全?网络安全防范技术包括哪些?

一、引言 在当今数字化的时代,网络已经成为人们生活和工作中不可或缺的一部分。然而,随着网络的普及和应用的广泛,网络安全问题也日益凸显。从个人隐私泄露到企业关键信息被盗,从网络欺诈到大规模的网络攻击,网络安全…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.5】yolov8使用C++部署在RK3588更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 背景…

ubuntu 安装两个nginx实例时的坑,非默认nginx实例配置修改总也不生效的问题

一、问题 由于工作需求xx云服务器上安装了两个nginx实例,突然有一天需要在非默认nginx上增加一个子站点,根据网上教程和原来的记录修改vi nginx.conf 后保存载总也不生效? 怎么破? 二、过程记录 假如:非默认nginx安装在…

HanLP分词的使用与注意事项

1 概述 HanLP是一个自然语言处理工具包&#xff0c;它提供的主要功能如下&#xff1a; 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…

使用SSH协议远程连接Ubuntu

1.切换到root用户 sudo -i 2.安装openssh-server apt update apt install openssh-server 3.启动ssh服务 service ssh start 4.查看ssh状态 &#xff08;q键: 退出&#xff09; service ssh status 5.检查ssh服务是否启动成功 ps -e | grep ssh 6.开机自启动 systemctl enable …

基于STM32F103的FreeRTOS系列(九)·任务创建函数的使用·静态方法和动态方法

目录 1. 前期准备 1.1 中断文件修改 1.2 SysTick文件修改 1.3 任务创建函数API 2. 任务创建&#xff08;静态方法&#xff09; 2.1 创建两个任务函数 2.2 静态创建开始任务函数 2.3 创建开始任务的任务函数 2.4 补充 2.5 代码 3. 任务创建&#xff08;动…

【python基础】—利用pandas读取或写入mysql表数据

文章目录 一、read_sql()二、to_sql()三、连接数据库方式—MySQL1、用sqlalchemy包构建数据库链接2、用DBAPI构建数据库链接 四、容易遇到的问题 一、read_sql() 功能 将 SQL 查询/数据库表读入 DataFrame。 语法 读取数据库&#xff08;通过SQL语句或表名&#xff09; pand…

【书生大模型实战营(暑假场)闯关材料】基础岛:第4关 InternLM + LlamaIndex RAG 实践

基础任务 (完成此任务即完成闯关) 任务要求&#xff1a; 基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B模型具备回答 A 的能力&#xff0c;截图…

SQL-约束篇

在数据库设计中&#xff0c;约束是确保数据完整性和准确性的关键元素。约束可以限制表中数据的类型、范围和关系&#xff0c;从而维护数据的一致性和可靠性。 1. 主键约束 (Primary Key) 主键约束用于唯一标识表中的每一行数据。一个表只能有一个主键&#xff0c;主键字段的值…

计算机毕业设计SpringBoot-VUE-python-nodeJS铁路列车安全管理-评估报告-铁路局-客运-货运-行车-站段-天气情况

1 引言 1.1 项目开发的背景 我国的普铁历史悠久&#xff0c;从19世纪至今已有百来年的历史。新中国以来&#xff0c;铁路的发展速度令人惊叹。但随着发展速度的增快&#xff0c;与之不对应的则是运营安全管理系统的落后。但这些来&#xff0c;我国铁路对于安全的重视程度已经…

代码随想录算法训练营第十六天(二叉树 四)

力扣题部分: 513.找树左下角的值 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路(层序遍历): 应该是这道题最简单的方法了&#xff0…

超文本文档HTML

简单的个人网站 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>欢迎来到我的主页</title> &…

【HarmonyOS】鸿蒙应用蓝牙功能实现 (二)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;二&#xff09; 前言 蓝牙一般分为传统蓝牙(BR/EDR)&#xff0c;低功耗蓝牙(BLE)两种。 鸿蒙将蓝牙的功能模块分的非常细。 基本上我们会用到access进行蓝牙状态的开启和关闭&#xff0c;以及状态查询。 在使用connection进…

BUUCTF PWN wp--warmup_csaw_2016

第一步 先checksec一下&#xff08;没有启用NX保护、PIE、完整的RELRO和栈保护&#xff0c;还有具有RWX权限的内存段。&#xff09; 分析一下这个文件的保护机制&#xff1a; Arch: amd64-64-little 这表示该可执行文件是为64位的AMD64架构编译的&#xff0c;并且使用的是小…

科大讯飞飞凡计划面经(2024年秋招新出炉)

7月笔完一个多月约的面试 —————————————- 一面8.16 不问项目&#xff0c;上来就是八股轰炸 c11新特性 shared_ptr是线程安全的吗&#xff0c;不安全的话怎么实现线程安全的 stl容器中频繁查找用什么&#xff0c;频繁增删用什么 vector中间插入元素会发生什么&…