《机器学习》——逻辑回归(下采样)

news2025/1/6 19:13:36

文章目录

    • 什么是下采样?
    • 为什么在逻辑回归中要使用下采样?
    • 使用下采样和不使用下采样的区别
    • 实例
      • 1、实例内容
      • 2、实例步骤

什么是下采样?

  • 下采样(Down - Sampling)是一种数据处理技术,主要用于处理数据集中不同类别样本数量不均衡的情况。它通过减少数据集中数量较多类别的样本数量,使不同类别样本的数量达到相对平衡。

为什么在逻辑回归中要使用下采样?

  • 在逻辑回归应用于分类任务时,如果数据集中存在类别不平衡的情况,例如正类样本只占总样本数的 1%,而负类样本占 99%。逻辑回归模型在训练过程中会倾向于将更多的样本预测为负类,因为这样可以获得较高的准确率(把所有样本都预测为负类,准确率也能达到 99%)。下采样可以平衡不同类别样本的数量,使得逻辑回归模型能够更加关注少数类的特征,从而提高模型对少数类的分类性能。

使用下采样和不使用下采样的区别

  • 不使用下采样,是对原始数据直接进行训练集和测试集的划分,进行模型的性能测试。
  • 使用下采样是,对原始数据进行划分后再对训练集进行划分,划分成y值相同数量相同的训练集,原始数据划分的测试集,当测试集。

实例

我们从实例中观察下采样。

1、实例内容

本次实例是对银行的数据进行分类的问题,数据部分内容为在这里插入图片描述
共有28万多条数据。其中Time为无关特征,class为分类特征有两个分类分别为0、1,其余全部为特征变量。如图看看出Amount里的数据与其他特征的数据有区别,故此数据处理中要对Amount进行z标准化处理。

2、实例步骤

  • 导入数据
  • 处理数据
  • 下采样处理数据
  • 画图查看样本个数
  • 抽取数据进行划分
  • 选择较优惩罚因子
  • 建立最优模型并训练数据
  • 测试数据并评估模型性能
  • 导入数据
    需要数据测试的自取通过网盘分享的文件:creditcard.csv
    链接: https://pan.baidu.com/s/1BIjUp16GBRlkbmN86XjCuw 提取码: rqhx
data = pd.read_csv('creditcard.csv')
  • 处理数据
"""数据标准化:z标准化"""
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
a = data[['Amount']] # 返回dataframe数据,而不是series
data['Amount']=scaler.fit_transform(data[['Amount']])

data = data.drop(['Time'],axis=1) # 删除无用列
  • 下采样处理数据
"""下采样解决样本不均衡问题"""
positive_eg = data[data["Class"]==0] # 获取到了所有标签(Class=0)的数据
negative_eg = data[data["Class"]==1] # 获取到了所有标签(Class=1)的数据
np.random.seed(seed=0) # 随机种子
positive_eg = positive_eg.sample(len(negative_eg)) # sample表示随机从参数里面选择参数

data_c = pd.concat([positive_eg,negative_eg]) # 是把两个pandas数据组合为一个
print(data_c)

在这里插入图片描述

  • 画图查看样本个数
"""绘制图形,查看正负样本个数"""
mpl.rcParams['font.sans-serif']=['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus']=False
labels_count = pd.value_counts(data_c["Class"]) # 统计表格data_c中class这一列中,为0的数量和为1的数量
plt.title('正负例样本数') # matplotlib直接显示中文?
plt.xlabel('类别')
plt.ylabel('频数')
labels_count.plot(kind='bar')
plt.show()

在这里插入图片描述
可以看到训练集中class为0和1的样本数量。

  • 抽取数据进行划分
    其中test_size=0.3代表从被切分数据的百分之三十。
"""训练集使用下采样数据,测试集使用原始数据进行预测"""
from sklearn.model_selection import train_test_split

# 抽选数据后,对下采样数据划分
x = data_c.drop("Class",axis=1) # 对data_c数据进行划分,以y轴
y = data_c.Class
x_train,x_test,y_train,y_test= \
    train_test_split(x,y,test_size=0.3,random_state=0)

# 对原始数据集进行切分,用于后期的测试
x_whole =data.drop("Class",axis=1)
y_whole = data.Class
x_train_w,x_test_w,y_train_w,y_test_w= \
    train_test_split(x_whole,y_whole,test_size=0.2,random_state=0)

  • 选择较优惩罚因子

在这里插入图片描述

"""执行交叉验证操作
scoring:可选"accuracy(精度)"、recall(召回率)、roc_auc(roc值)
    neg_mean_squared_error(均方误差)
"""
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import  cross_val_score # 交叉验证的函数

# 交叉验证选择较优惩罚因子
scores = []
c_param_range = [0.01,0.1,1,10,100]
for i in c_param_range:# 第一个词循环的时候C=0.01,5个逻辑回归模型
    lr = LogisticRegression(C=i,penalty='l2',solver='lbfgs',max_iter=1000)
    score = cross_val_score(lr,x_train,y_train,cv=10,scoring='recall') # 交叉验证
    score_mean = sum(score)/len(score) # 交叉验证后的值召回率
    scores.append(score_mean) # 里面保存了所有的交叉验证召回率
    print(score_mean) # 将不同的c参数分别传入模型,分别看看哪个模型效果更好

best_c = c_param_range[np.argmax(scores)] # 寻找到scores中最大值的对应的c参数

在这里插入图片描述

  • 建立最优模型并训练数据
  • 自测:
lr = LogisticRegression(C=best_c,penalty='l2',max_iter=1000)
lr.fit(x_train,y_train)
  • 测试数据并评估模型性能
  • 分别对原始数据划分的测试集和原始数据的训练集划分的测试集进行训练:
from sklearn import metrics

# 传入下采样后的测试数据
test_s_predicted = lr.predict(x_test_w)
print(metrics.classification_report(y_test_w, test_s_predicted))

# 传入原数据的测试数据
test_predicted = lr.predict(x_test)
print(metrics.classification_report(y_test, test_predicted))

在这里插入图片描述
因为银行主要观察特征为1的人,宁愿原本为0的预测为1,也不愿判断错一个1的样本。故主要看召回率,从测试结果可以看出准确率还是挺高的,也没有产生过拟合和欠拟合。

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

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

相关文章

ACM算法模板

ACM算法模板 起手式基础算法前缀和与差分二分查找三分查找求极值分治法:归并排序 动态规划基本线性 d p dp dp最长上升子序列I O ( n 2 ) O(n ^ 2) O(n2)最长上升子序列II O ( n l o g n ) O(nlogn) O(nlogn) 贪心二分最长公共子序列 背包背包求组合种类背包求排列…

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时,分解对象&#xff…

CSS 学习之正确看待 CSS 世界里的 margin 合并

一、什么是 margin 合并 块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距,这样的现象称为“margin 合并”。从此定义上,我们可以捕获两点重要的信息。 块级元素,但不包括浮动和绝对定位元素,尽…

Golang的代码质量分析工具

Golang的代码质量分析工具 一、介绍 作为一种高效、简洁、可靠的编程语言,被越来越多的开发者所喜爱和采用。而随着项目规模的增长和团队人员的扩大,代码质量的管理变得尤为重要。为了保障代码的可维护性、健壮性和可扩展性,我们需要借助代码…

鸿蒙元服务 口袋管家(从0到1) ——准备工作

达到的效果图 如何创建元服务? 如下: 鸿蒙如何创建元服务-元服务是什么?和App的关系?(保姆级步骤)_鸿蒙元服务-CSDN博客 开始创建包 Bill 里面创建两个page页面 分别是 BillAddPage 和 BillIndexPag…

轻量型web组态软件

体验地址:http://www.hcy-soft.com 随着互联网、物联网技术的快速发展,BY组态基于多年研发积累和私有部署实践打磨、以及对业务场景的深入理解,推出了适用于物联网应用场景的轻量型web组态软件。 该产品采用 B/S 架构,提供 web …

Linux C/C++编程-获得套接字地址、主机名称和主机信息

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…

SweetAlert2 - 漂亮可定制的 JavaScript 弹窗

https://sweetalert2.github.io/ https://github.com/sweetalert2/sweetalert2 安装: npm install sweetalert2封装: import Swal from sweetalert2/dist/sweetalert2.js import sweetalert2/src/sweetalert2.scss/*** * param {string} icon - ico…

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin

Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin 通常,如果要把一个相对布局,FrameLayout,或者线性布局等这样的布局变成具有圆角或者圆形的布局,需要增加一个style,给它设置圆角,…

PHP如何删除数组中的特定值?

php 中删除数组特定值的方法有三种:unset():直接删除指定索引的值,但会保留数组索引结构和未删除元素,适合小数组。array_filter():根据自定义回调函数筛选数组元素,返回一个新数组,原数组不变&…

啤酒风味塑造的关键因素——麦汁煮沸

在探索啤酒酿造的工艺过程中,我们发现每一个细微的步骤都对最终的口感和风味产生着不可忽视的影响。今天,让我们深入探讨一个关键环节——麦汁煮沸,以及其中至关重要的概念“煮沸强度”。 何谓煮沸强度?它又如何左右麦汁的品质&a…

unity开发之shader 管道介质流动特效

效果 shader graph 如果出现下面的效果,那是因为你模型的问题,建模做贴图的时候没有设置好UV映射,只需重新设置下映射即可

JAVA学习笔记_JVM

文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…

供需平台信息发布付费查看小程序系统开发方案

供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户:寻找兼职工作、二手物品交换、本地服务(如家政、维修)等。 小微企业:推广产品和服务,寻找合…

牛客网刷题 ——C语言初阶——OR76 两个整数二进制位不同个数

1. 牛客网题目:OR76 两个整数二进制位不同个数 牛客网OJ链接 描述: 输入两个整数,求两个整数二进制格式有多少个位不同 输入描述:两个整数 输出描述:二进制不同位的个数 示例1 输入:22 33 输出&#xff1a…

直播美颜SDK深度优化技术探索:低延迟与高画质的平衡之道

本篇文章,小编将从技术角度出发,探讨直播美颜SDK的优化方法,探索实现低延迟与高画质并存的解决方案。 一、低延迟的技术挑战与应对策略 直播的核心在于实时互动,任何超过100ms的延迟都会显著影响用户体验。而美颜处理由于涉及复…

链表算法篇——链接彼岸,流离节点的相遇之诗(下)

文章目录 前言第一章:重排链表1.1 题目链接:https://leetcode.cn/problems/reorder-list/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 第二章:合并K个升序链表2.1 题目链接:https://l…

WebRTC的线程事件处理

1. 不同平台下处理事件的API: Linux系统下,处理事件的API是epoll或者select;Windows系统下,处理事件的API是WSAEventSelect,完全端口;Mac系统下,kqueue 2. WebRTC下的事件处理类: …

【Cocos TypeScript 零基础 4.1】

目录 背景滚动 背景滚动 创建一个 空节点 背景丟进去 ( 复制一个,再丢一次都行) 新建TS脚本 并绑定到 空节点 上 再对TS脚本进行编辑 export class TS2bg extends Component {property (Node) // 通过属性面板去赋值bg1:Node nullproperty (Node) bg2:Node nullprope…

利用 AI 高效生成思维导图的简单实用方法

#工作记录 适用于不支持直接生成思维导图的AI工具;适用于AI生成后不能再次编辑的思维导图。 在日常的学习、工作以及知识整理过程中,思维导图是一种非常实用的工具,能够帮助我们清晰地梳理思路、归纳要点。而借助 AI 的强大能力&#xff0c…