目录

简介

 1.下采样

2.过采样 


简介

        接上两篇篇博客最后,我们使用了K折交叉验证去寻找最合适的C值,提升模型召回率,对于选取C的最优值,我们就要把不同C值放到模型里面训练,然后用验证集去验证得到结果进行比较发现最后模型得到很大的提升 ,但是相对与召回率还是差了很多

机器学习第二课之逻辑回归(一)LogisticRegression

机器学习第二课之逻辑回归(一)LogisticRegression

        我们可以清楚的发现我们虽然有28万条数据集,但是相对于标签为1的数据集却只有四百多条,数据集分布及其不均匀,想要对于暂时学习的模型进行进一步提升没有太大的效果,只能对数据集进行一些处理,使得模型的效果得到提升,使用今天我来介绍两种对于数据集分布不均匀的优化处理。

 1.下采样

        我们要想用这样的数据去建模显然是存在问题的。尤其是在我们更关心少数类的问题的时候数据分类不均衡会更加的突出,例如,信用卡诈骗、病例分析等。在这样的数据分布的情况下,运用机器学习算法的预测模型可能会无法做出准确的预测,最后的模型显然是趋向于预测多数集的,少数集可能会被当做噪点或被忽视,相比多数集,少数集被错分的可能性很大。从本质上讲,机器学习算法就是从大量的数据集中通过计算得到某些经验,进而判定某些数据的正常与否。但是,不均衡数据集,显然少数类的数量太少,模型会更倾向于多数集。

针对多样本的类筛选一部分样本参与训练。 下采样的具体流程就是下图所示

 代码分析:

1.导入库、数据标准化、划分数据集。(跟前面都一样)

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import cross_val_scoredata = pd.read_csv("creditcard.csv")# 数据预处理
scaler = StandardScaler()
data["Amount"] = scaler.fit_transform(data[["Amount"]])
data = data.drop(["Time"], axis=1)  # 移除时间列# 划分特征和标签
x = data.iloc[:, :-1]  # 特征
y = data.iloc[:, -1]   # 标签# 拆分训练集和测试集
x_train_w, x_test_w, y_train_w, y_test_w = train_test_split(x, y, test_size=0.2, random_state=1000)

2. 数据准备

data_train_temp = x_train_w.copy()
data_train_temp['Class'] = y_train_w
  • 首先复制特征数据x_train_wdata_train_temp
  • 然后将标签数据y_train_w作为新列Class添加到data_train_temp
  • 这样就创建了一个包含特征和对应标签的完整数据集

3.分离正负样本

positive_eg = data_train_temp[data_train_temp['Class'] == 0]  # 正常样本
negative_eg = data_train_temp[data_train_temp['Class'] == 1]  # 欺诈样本
  • Class=0表示正常样本(positive_eg)
  • Class=1表示欺诈样本(negative_eg)

4. 下采样处理

positive_eg = positive_eg.sample(len(negative_eg))
  • 这是下采样的核心操作
  • 从正常样本中随机抽样,抽样数量等于欺诈样本的数量
  • 这样处理后,正常样本和欺诈样本的数量将保持一致

5.组合数据集

data_c = pd.concat([positive_eg, negative_eg])
  • 将下采样后的正常样本和原始欺诈样本组合起来
  • 得到一个类别平衡的新数据集

6.拆分特征和标签

x_new = data_c.drop('Class', axis=1)
y_new = data_c.Class
  • 从平衡后的数据集data_c中拆分出新的特征集x_new和标签集y_new
  • 这些新数据可以用于后续的模型训练

 7.交叉验证、训练、验证、得到结果

scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]
for i in c_param_range:lr = LogisticRegression(C=i, penalty="l2", solver='lbfgs', max_iter=10000)# 使用平衡后的数据集进行交叉验证score = cross_val_score(lr,x_new, y_new, cv=5, scoring="recall")score_mean = sum(score) / len(score)scores.append(score_mean)print(f"C等于{i}的召回率为{score_mean}")best_c = c_param_range[np.argmax(scores)]
print("最好的C是:", best_c)# 使用最佳参数构建模型并训练
estimator = LogisticRegression(C=best_c, max_iter=100)
estimator.fit(x_new,y_new )  # 使用原始训练特征(不含额外添加的Class列)# 在测试集上进行预测和评估
test_predicted = estimator.predict(x_test_w)
print("训练集准确率:", estimator.score(x_train_w, y_train_w))
print(metrics.classification_report(y_test_w, test_predicted))

8.结果

        可以发现我们的召回率到达92%,效果得到很大的提升 ,对于准确率有些稍微下降,但是对于银行来说是可以接受的,之前也说过最主要的是看召回率的高低。

2.过采样 

针对少样本类生成新的数据样本参与训练。

那我们依据什么拟合增加那么多数据呢 ?这就使用到了SMOTE 算法

        SMOTE 算法是一种用于解决分类问题中数据类别不平衡问题的技术。在很多实际的分类场景中,比如欺诈检测、疾病诊断等,少数类样本(如欺诈交易、患病样本)的数量往往远少于多数类样本(如正常交易、健康样本)。这种不平衡的数据分布会导致模型在训练时偏向于多数类,而对少数类的预测效果不佳。

        SMOTE 算法的核心思想是通过对少数类样本进行分析,然后人工合成新的少数类样本并添加到数据集中,从而增加少数类样本的数量,使数据分布更加平衡。具体来说,SMOTE 算法会为每个少数类样本找到其在特征空间中的 k 个最近邻,然后在这些最近邻之间随机插值,生成新的合成样本。这些合成样本具有与原始少数类样本相似的特征分布,从而可以帮助模型更好地学习少数类的特征,提高对少数类样本的分类准确率。

SMOTE 算法:

  1. 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集S_{min}中所有样本的距离,得到其k近邻。
  2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。
  3. 对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本

 X_{new}=x+rand(0,1)*\left | x-xn \right |

 新生成的这些数据点都是在这些线上

 代码分析:

1.导入 SMOTE 类

from imblearn.over_sampling import SMOTE

imblearn库的过采样模块中导入SMOTE类,该类实现了合成少数类过采样技术。

2.初始化 SMOTE 对象 

oversampler = SMOTE(random_state=0)

 创建一个 SMOTE 过采样器实例,random_state=0设置随机种子,确保结果的可重复性。

3.执行过采样 

os_x_train, os_y_train = oversampler.fit_resample(x_train_w, y_train_w)
  • fit_resample方法是 SMOTE 的核心操作,它会对少数类样本进行分析并合成新样本
  • x_train_w是原始训练特征数据,y_train_w是对应的标签
  • 处理后返回os_x_train(过采样后的特征数据)和os_y_train(过采样后的标签)
  • 此时的数据集已经通过合成少数类样本达到了类别平衡

4.划分训练集和测试集 

经过过采样后得到的数据比较多,我们可以再一次进行数据集划分。

os_x_train_w, os_x_test_w, os_y_train_w, os_y_test_w = train_test_split(os_x_train, os_y_train, test_size=0.2, random_state=0
)
  • 使用train_test_split将过采样后的数据集划分为新的训练集和测试集
  • test_size=0.2表示将 20% 的数据作为测试集,80% 作为训练集
  • random_state=0保证划分结果的可重复性
  • 返回四个变量分别为:过采样后的训练特征、过采样后的测试特征、过采样后的训练标签、过采样后的测试标签

完整代码:

只有中间部分跟下采样有所不同,其他步骤都是相同的

import numpy as np
import pandas as pd
from  sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metricsfrom sklearn.model_selection import cross_val_scoredata=pd.read_csv("creditcard.csv")scaler=StandardScaler()
data["Amount"]=scaler.fit_transform(data[["Amount"]])
data=data.drop(["Time"],axis=1)x=data.iloc[:, :-1]
y=data.iloc[:, -1]x_train_w,x_test_w,y_train_w,y_test_w=train_test_split(x,y,test_size=0.2,random_state=0)from imblearn.over_sampling import SMOTE
oversampler=SMOTE(random_state=0)
os_x_train,os_y_train=oversampler.fit_resample(x_train_w,y_train_w)
os_x_train_w,os_x_test_w,os_y_train_w,os_y_test_w=train_test_split(os_x_train,os_y_train,test_size=0.2,random_state=0)scores = []
c_param_range = [0.01, 0.1, 1, 10, 100]
for i in c_param_range:lr = LogisticRegression(C=i, penalty="l2", solver='lbfgs', max_iter=10000)# 使用平衡后的数据集进行交叉验证score = cross_val_score(lr,os_x_train_w, os_y_train_w, cv=8, scoring="recall")score_mean = sum(score) / len(score)scores.append(score_mean)print(f"C等于{i}的召回率为{score_mean}")best_c=c_param_range[np.argmax(scores)]
print("最好的c是:",best_c)estimator=LogisticRegression(C=best_c)
estimator.fit(os_x_train_w,os_y_train_w)
test_predicted=estimator.predict(x_test_w)print(metrics.classification_report(y_test_w,test_predicted))

 结果:

 可以发现我们的召回率到达94%,效果又得到很大的提升 ,

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

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

相关文章

1.Java语言有什么特点

1.Java语言有什么特点 1.面向对象编程,拥有封装,继承和多态的特性,所有可以很好的设计出低耦合的项目工程。 2.很好的可移植性,在Java中有java虚拟机(JVM)的支持,每写一个类都是.Class文件。J…

部署 Kibana 8.2.2 可视化管理 Elasticsearch 8.2.2 集群

✅ 适用版本:Elasticsearch 8.2.2 Kibana 8.2.2 一、环境准备 组件版本示例地址Elasticsearch8.2.2192.168.130.61:9200, 192.168.130.62:9200, 192.168.130.65:9200Kibana8.2.2部署在 192.168.130.651操作系统CentOS 7⚠️ 严格版本匹配:Kibana 8.2.2…

7.2 I/O接口 (答案见原书 P305)

第7章 输入/输出系统 7.1 I/O系统基本概念 (答案见原书 P301) & 7.2 I/O接口 (答案见原书 P305) 01. 在统一编址的方式下,区分存储单元和I/O设备是靠( A )。 题目原文 在统一编址的方式下,区分存储单元和I/O设备是靠( )。 A. 不同的地址码 B. 不同的地址线 C. 不同…

并发编程常用工具类(上):CountDownLatch 与 Semaphore 的协作应用

在 Java 并发编程领域,JDK 提供的工具类是简化多线程协作的重要武器。这些工具类基于 AQS(AbstractQueuedSynchronizer)框架实现,封装了复杂的同步逻辑,让开发者无需深入底层即可实现高效的线程协作。本文作为并发工具…

Go 工程化全景:从目录结构到生命周期的完整服务框架

今天天气很好, 正好手头有个小项目, 整理了一下中小项目标准化的痛点问题, 如下, 希望可以帮到大家. 一个成熟的 Go 项目不仅需要清晰的代码组织,还需要完善的生命周期管理。本文将详细讲解生产级 Go 服务的目录设计(包含 model 等核心目录)、…

【C++】2. 类和对象(上)

文章目录一、类的定义1、类定义格式2、访问限定符3、类域二、实例化1、实例化概念2、对象⼤⼩三、this指针四、C和C语⾔实现Stack对⽐一、类的定义 1、类定义格式 class为定义类的关键字,Stack为类的名字,{ }中为类的主体,注意类定义结束时…

UnityURP 扭曲屏幕效果实现

UnityURP 扭曲屏幕效果实现前言项目下载URPGrabPass空间扭曲着色器实现添加可视化控制创建材质球并设置补充粒子使用步骤CustomData映射移动设备优化鸣谢前言 在Unity的Universal Render Pipeline (URP) 中,传统的GrabPass功能被移除,借助URPGrabPass工…

(三)软件架构设计

2024年博主考软考高级系统架构师没通过,于是决定集中精力认真学习系统架构的每一个环节,并在2025年软考中取得了不错的成绩,虽然做信息安全的考架构师很难,但找对方法,问题就不大! 本文主要是博主在学习过程…

切记使用mt19937构造随机数

在做 Kazaee CodeForces - 1746F 这个问题的时候,最初的时候使用了ran(),然后一直WA,遂改成mt19937,顺利通过本道题。 mt19937 Rand(time(0)); 调用随机数时候,使用: Rand() & 1 注意看&#xff0…

基于N32G45x+RTT驱动框架的定时器外部计数

时钟选择 高级控制定时器的内部时钟:CK_INT: 两种外部时钟模式: 外部输入引脚 外部触发输入 ETR 内部触发输入(ITRx):一个定时器用作另一个定时器的预分频器 外部时钟原理 通过配置 TIMx_SMCTRL.SMSEL=111 选择该模式。 计数器可以配置为在所选输入的时钟上升沿或下降沿 …

[特殊字符] Ubuntu 下 MySQL 离线部署教学(含手动步骤与一键脚本)

适用于 Ubuntu 20.04 / 22.04 无网络环境部署 MySQL。 建议初学者先按手动方式部署一遍理解原理,再使用自动化脚本完成批量部署。📁 一、准备工作 ✅ 1. 虚拟机环境 系统:Ubuntu 22.04(或兼容版本)环境:无网…

系统一个小时多次Full GC,导致系统线程停止运行,影响系统的性能,可靠性

背景: 某一天系统出现了请求超时,然后通过日志查看,程序执行到某一个位置,直接停下来来了,或者说所有的线程的执行都停下来了。而且是该时间段,请求处理变慢。排查相关的服务,并没有出现死锁&am…

使用OMV+NextCloud搭建私有云

原文地址:使用OMVNextCloud搭建私有云 – 无敌牛 欢迎参观我的网站:无敌牛 – 技术/著作/典籍/分享等 OpenMediaVault(简称OMV)是一款基于Debian的开源网络存储(NAS)操作系统,提供Web管理界面&…

Codeforces Round 1008 (Div. 2)

A. Final Verdict 题目大意 给你一个数组a,每次把他拆分为等长的k个子序列,然后用子序列的平均数替换掉这个子序列,问最后能不能让数组只剩下一个数字x 解题思路 无论怎么划分,最后的总值是不变的,所以只需要看总和…

python转移安装目录到D盘

迁移python安装路径第一步:移动目录第二步:修改环境变量之前没有设置之前设置过第一步:移动目录 源路径: C:\Users\Emma.ZRF\AppData\Local\Programs\Python\Python38 原环境变量 C:\Users\Emma.ZRF\AppData\Local\Programs\Pyth…

C#垃圾回收机制:原理与实践

C#垃圾回收机制:原理与实践 一、垃圾回收:C#内存管理的“幕后功臣”​ 二、GC的核心引擎:基于代的优化策略 三、Demo展示 1. 简单对象的垃圾回收示例 2. 基于代的回收示例 四、常用方法 五、推荐使用的场景 六、注意事项 管住手:避免滥用 GC.Collect() 析构函数:保持轻量 …

基于SpringBoot+MyBatis+MySQL+VUE实现的名城小区物业管理系统(附源码+数据库+毕业论文+开题报告+部署教程+配套软件)

摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本人…

3DXML 转换为 UG 的技术指南及迪威模型网在线转换推荐

一、3DXML 转换为 UG 的必要性 (一)软件功能利用需求 3DXML 格式由达索系统开发,主要用于在其相关产品(如 CATIA、SOLIDWORKS 和 3DEXPERIENCE 等)中进行 3D 数据交换与轻量化可视化。它虽然能够很好地在达索生态内实…

无人机光伏巡检缺陷检出率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,引用来源标注 “陌讯技术白皮书”,禁止未经授权的转载与改编。摘要在无人机光伏巡检场景中,边缘计算优化与复杂场景鲁棒性是提升检测效率的核心挑战。本文解析陌讯多模态融合算法在光伏板热斑、隐裂等缺陷检测中的…

仓库管理系统-15-前端之管理员管理和用户管理

文章目录 1 后台查询用户列表 1.1 null和空字符串的检查 1.2 UserController.java 2 管理员管理 2.1 传递参数roleId=1 2.2 admin/AdminManage.vue 3 用户管理 3.1 传递参数roleId=2 3.2 user/UserManage.vue 管理员管理和用户管理,与之前的Main.vue的内容基本一致,无非是管理…