当前位置: 首页 > news >正文

《机器学习》—— 通过下采样方法实现逻辑回归分类问题

文章目录

  • 一、什么是下采样方法?
  • 二、通过下采样方法实现逻辑回归分类问题
  • 三、下采样的优缺点

一、什么是下采样方法?

机器学习中的下采样(Undersampling)方法是一种处理不平衡数据集的有效手段,特别是在数据集中某些类别的样本数量明显多于其他类别时。下采样的主要目的是通过减少多数类样本的数量来平衡数据分布,从而提高模型的泛化能力和准确性。

二、通过下采样方法实现逻辑回归分类问题

  • 具体步骤
    • 1、读取并查看数据
    • 2、数据标准化
    • 3、下采样解决样本不均衡问题
    • 4、划分数据集
    • 5、训练模型并建立最优模型
    • 6、传入测试数据集进行测试
  • 1、读取并查看数据
    • 这里有一份含有28万+数据的csv文件

    • 通过pandas方法读取此文件

      # 通过pandas方法读取creditcard.csv文件,并用data变量接收
      data = pd.read_csv("creditcard.csv")
      data.head()  # 查看data的前几行,默认是5行
      
    • 如下图所示:
      在这里插入图片描述

    • 这个数据的最后一列“Class”标签用来标注是否正常,0表示正常,1表示异常

    • 我们可以通过画出条形图来观察两类标签的样本个数

      import matplotlib.pyplot as plt
      """绘制条形图,查看正负样本个数"""
      labels_count = pd.Series.value_counts(data['Class'])
      plt.title("正负例样本数")
      plt.xlabel("类别")
      plt.ylabel("帧数")
      labels_count.plot(kind='bar')
      plt.show()
      
    • 结果如下:在这里插入图片描述

    • 可以看出0和1标签的样本数据个数相差的非常多,0标签有28万+,而1标签只有几百多,这便是不平衡数据集

  • 2、数据标准化
    • 我们数据的倒数第二(Amount)列可以看出,这一列的特征数值,比其他列特征数值要大很多,如果不做调整就传入模型训练,将会占有很大的权重,导致最后的结果很大的程度上都只受这一个特征的影响
    • 通过观察,可以发现,前面的特征数据都是在-1~1之间,所以我们可以用Z标准化的方法,改变其数值范围
      from sklearn.preprocessing import StandardScaler
      """数据标准化:Z标准化"""
      scaler = StandardScaler()
      # a = data[['Amount']]  # 返回dataframe数据,而不是series
      # 用StandardScaler中的fit_transform实现Z标准化
      data['Amount'] = scaler.fit_transform(data[['Amount']])
      
    • 结果如下:
      在这里插入图片描述
  • 3、下采样解决样本不均衡问题
    • 通过随机抽取0特征标签中的数据并与1特征标签数量相同,并将两个特征拼接为一个新的数据集

      # 数据的第一列(Time)没有作用,删除
      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=3)    # 随机种子,保证每次执行这个代码,随机抽选的结果都是一样
      positive_eg = positive_eg.sample(len(negative_eg))   # sample 表示随机从参数里面选择数据,并和1标签的数据数量相同
      # 拼接数据
      data_c = pd.concat([positive_eg, negative_eg])   # 把两个pandas数据组合为一个
      
    • 可以再次通过绘制条形图观察数据

      labels_count = pd.value_counts(data_c['Class'])
      plt.title("正负例样本数")
      plt.xlabel("类别")
      plt.ylabel("帧数")
      labels_count.plot(kind='bar')
      plt.show()
      
    • 结果如下:
      在这里插入图片描述

  • 4、划分数据集
    • 这里我们划分成两类数据集,一类是经过下采样处理后,形成的小部分数据集,另一类是划分原始数据集
    • 划分下采样后的数据集用于模型训练,划分原数据集最后传入模型预测出结果,观察模型的性能是否有所提高
      from sklearn.model_selection import train_test_split
      # 对下采样数据划分
      x_s = data_c.drop('Class', axis=1)  # 去除标签列作为训练数据
      y_s = data_c.Class  # 得到标签列
      # 划分出30%的测试集,并抛出随机种子,为了后面每次的运行,随机划分的都是相同的数据
      x_s_train, x_s_test, y_s_train, y_s_test = train_test_split(x_s, y_s, test_size=0.3, random_state=0)# 对原数据划分
      x = data.drop('Class', axis=1)
      y = data.Class
      x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
      
  • 5、训练模型并建立最优模型
    • 交叉验证选择较优惩罚因子

    • 建立最优模型

      # 交叉验证选择较优惩罚因子
      scores = []
      c_param_range = [0.01, 0.1, 1, 10, 100]  # 参数
      for i in c_param_range:  # 第1次循环的时候C=0.01,5个逻辑回归模型lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000)score = cross_val_score(lr, x_s_train, y_s_train, cv=8, 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参数
      print("........最优惩罚因子为:{}........".format(best_c))"""建立最优模型"""
      lr = LogisticRegression(C=best_c, penalty='l2', max_iter=1000)
      lr.fit(x_s_train, y_s_train)
      
    • 运行结果为:

  • 6、传入测试数据集进行测试
    • predict 方法接受一个数组(或类似数组的结构,如列表的列表、Pandas DataFrame等),其中包含了要预测的目标变量的新数据点。然后,它使用训练好的模型对这些数据点进行预测,并返回一个包含预测结果的数组

    • metrics.classification_report 是 scikit-learn(一个流行的 Python 机器学习库)中的一个函数,用于展示主要分类指标的文本报告。这个函数特别适用于评估分类模型的性能,尤其是在处理多类分类问题时。它提供了每个类别的精确度(precision)、召回率(recall)、F1 分数(F1-score)和支持度(support,即每个类别的真实样本数量)的详细报告。

      from sklearn import metrics# 传入下采样后的测试数据
      test_s_predicted = lr.predict(x_s_test)
      print(metrics.classification_report(y_s_test, test_s_predicted))# 传入原数据的测试数据
      test_predicted = lr.predict(x_test)
      print(metrics.classification_report(y_test, test_predicted))
    • 结果如下:
      在这里插入图片描述

    • 下面是未使用下采样方法,使用原数据进行模型训练后的结果
      在这里插入图片描述

    • 对比两次不同数据训练出的结果可以看出,通过下采样的方法处理数据后可以大大提高模型的性能

三、下采样的优缺点

  • 优点:
    • 提升分类器准确率:通过减少多数类样本的数量,使得数据集中不同类别的样本数量更加均衡,从而有助于提升分类器对少数类样本的识别能力,进而提升整体分类准确率。
    • 降低训练时间:由于数据集的大小减少,模型的训练时间也会相应缩短。
    • 降低过拟合风险:减少多数类样本的数量可以降低模型对多数类样本的过度拟合,提高模型的泛化能力。
  • 缺点:
    • 降低数据集代表性:随机欠采样可能会剔除一些重要的多数类样本,导致数据集的代表性降低。这可能会影响模型的性能,特别是当被剔除的样本包含对分类任务至关重要的信息时。
    • 信息损失:由于剔除了部分多数类样本,数据集中的信息量也会相应减少。这可能会导致模型在训练过程中无法充分学习到多数类的特征分布,从而影响模型的性能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic
  • Lambda 表达式的使用案例
  • openGauss之系统隐藏列
  • Vue路由—进阶篇
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
  • 鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
  • MAML算法详解
  • Oracle RAC 集群启动顺序
  • C语言——位运算
  • linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件
  • 【第一章概述—计算机中的数制】非十进制数到十进制数的转换,八进制转十进制,16进制转十进制。十进制转8进制,十进制转16进制
  • SSRF漏洞实现
  • Flask返回Json格式字符,中文导致unicode乱码问题
  • Unity URP Shader 修改深度让人物不再被地面遮挡
  • 数论之组合数
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【前端学习】-粗谈选择器
  • Android框架之Volley
  • C++11: atomic 头文件
  • Django 博客开发教程 8 - 博客文章详情页
  • Node项目之评分系统(二)- 数据库设计
  • React as a UI Runtime(五、列表)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • yii2中session跨域名的问题
  • 回顾 Swift 多平台移植进度 #2
  • 前端存储 - localStorage
  • 如何编写一个可升级的智能合约
  • 如何使用 JavaScript 解析 URL
  • 三栏布局总结
  • 学习使用ExpressJS 4.0中的新Router
  • 一道闭包题引发的思考
  • 一文看透浏览器架构
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Spring Batch JSON 支持
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #Z2294. 打印树的直径
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $L^p$ 调和函数恒为零
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)bark-ml
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第一天)包装对象、作用域、创建对象
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (过滤器)Filter和(监听器)listener
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (力扣)1314.矩阵区域和
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (转)nsfocus-绿盟科技笔试题目
  • (转)用.Net的File控件上传文件的解决方案
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • *p++,*(p++),*++p,(*p)++区别?
  • .jks文件(JAVA KeyStore)
  • .libPaths()设置包加载目录