样本处理之SMOTE算法

1. 少数类别过采样技术SMOTE简介

       Synthetic Minority Oversampling Technique,是一种用于合成少数类样本的过采样技术,通过对训练集中的正例进行插值来产生额外的正例。

基本思想:

        对少数类样本进行分析,然后在现有少数类样本之间进行插值,人工合成新样本,并将新样本添加到数据集中进行训练。

        该技术是目前处理非平衡数据的常用手段,并受到学术界和工业界的一致认同。

 2. SMOTE算法基本步骤

1. 采样最邻近算法,计算出每个少数类样本的K个近邻;

2. 从K个近邻中随机挑选N个样本进行随机线性插值;

3. 构造新的少数类样本;

4. 将新样本与原数据合并,产生新的训练集。

  3. SMOTE案例

        由于SMOTE算法是基于样本空间进行插值的,会放大数据集中的噪声和异常,因此要对训练样本进行清洗。这里使用LightGBM算法对数据进行拟合,将预测结果较差的样本权重降低不参与SMOTE算法的插值过程。

参考:不均衡学习和异常检测_正负样本不均衡异常检测-CSDN博客

4. 创建一个工具类进行SMOTE抽样

4.1 lgb

1. 样本加权,标注识别不准的样本

class imbalanceData():  # 处理不均衡数据   def __init__(self, train, test, mmin, mmax, label, lis=[]):  # lis不参与建模变量列表 self.label = label  self.train_x = train.drop([label]+lis, axis=1)  self.train_y = train[label]  self.test_x = test.drop([label]+lis, axis=1)  self.test_y = test[bad_ind]  self.columns = list(self.train_x.columns)  self.keep = self.columns + [self.label]  self.mmin = 0.1  # mmin低分段错分比例 self.mmax = 0.7  # mmax高分段错分比例# 针对头部和尾部预测不准的样本,进行加权处理def weight(self,x,y):  if x == 0 and y < self.mmin:  return 0.1  # 噪声的权重,不参与过采样elif x == 1 and y > self.mmax:  return 0.1  # 正常样本权重,参与过采样else:  return 1  

2. 样本选择

      用一个lgbm算法和weight函数进行样本选择,只取预测准确的部分进行后续的smote过采样。

def data_cleaning(self):  lgb_model, lgb_auc  = self.lgb_test()  sample = self.train_x.copy()  sample[self.label] = self.train_y  sample['pred'] = lgb_model.predict_proba(self.train_x)[:,1]  sample = sample.sort_values(by=['pred'], ascending=False).reset_index()  sample['rank'] = np.array(sample.index)/len(sample)  sample['weight'] = sample.apply(lambda x:self.weight(x.label, x['rank']),axis = 1)smote_sample = sample[sample.weight == 1][self.keep]  drop_sample = sample[sample.weight < 1][self.keep]     train_x_smote = smote_sample[self.columns]  train_y_smote = smote_sample[self.label]  return train_x_smote, train_y_smote, drop_sample  

3. smote过采样
    只对部分样本做过采样

def apply_smote(self):  train_x_smote, train_y_smote, drop_sample = self.data_cleaning()  rex, rey = self.smote(train_x_smote, train_y_smote)  print('badpctn:',rey.sum()/len(rey))  # 0.5df_rex = pd.DataFrame(rex)  df_rex.columns = self.columns  df_rex['weight'] = 1  df_rex[self.label] = rey  df_aff_smote = df_rex.append(drop_sample)  return df_aff_smote, rex, rey

4. 定义LightGBM函数

def lgb_test(self):  import lightgbm as lgb  clf =lgb.LGBMClassifier(boosting_type = 'gbdt',  objective = 'binary',  metric = 'auc',  learning_rate = 0.1,  n_estimators = 24,  max_depth = 4,  num_leaves = 25,  max_bin = 40,  min_data_in_leaf = 5,  bagging_fraction = 0.6,  bagging_freq = 0,  feature_fraction = 0.8)  clf.fit(self.train_x,self.train_y,eval_set=[(self.train_x, self.train_y),                                                         (self.test_x,self.test_y)], eval_metric = 'auc')return clf,clf.best_score_['valid_1']['auc']  

5. 调用imblearn中的smote函数

def smote(self, train_x_smote, train_y_smote, K=15, random_state=0):  from imblearn.over_sampling import SMOTE  smote = SMOTE(k_neighbors=K, n_jobs=1, random_state=random_state)  rex, rey = smote.fit_resample(train_x_smote,train_y_smote)  return rex, rey

4.2 lr

x_smote = rex[feature_lst]
y_smote =  rey
lr_model = LogisticRegression(C=0.1)
lr_model.fit(x_smote, y_smote)
x = train[feature_lst]
y = train['label']
val_x =  val[feature_lst]
val_y = val['bad_ind']
y_pred = lr_model.predict_proba(x)[:,1] 
fpr_lr_train, tpr_lr_train, _ = roc_curve(y, y_pred)  # 计算TPR和FPR
train_ks = abs(fpr_lr_train-tpr_lr_train).max()  # 计算训练集KS
print('train_ks : ', train_ks)
y_pred = lr_model.predict_proba(val_x)[:,1]  # 计算验证集预测值
fpr_lr, tpr_lr, _ = roc_curve(val_y, y_pred)   # 计算验证集预测值
val_ks = abs(fpr_lr - tpr_lr).max()         # 计算验证集KS值
print('val_ks : ', val_ks)

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

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

相关文章

AI对比:ChatGPT与文心一言的异同与未来

文章目录 &#x1f4d1;前言一、ChatGPT和文心一言概述1.1 ChatGPT1.2 文心一言 二、ChatGPT和文心一言比较2.1 训练数据与知识储备2.2 语义理解与生成能力2.2 应用场景与商业化探索 三、未来展望3.1 模型规模与参数数量不断增加3.2 多模态交互成为主流3.3 知识图谱与大模型的结…

大数据平台的硬件规划、网络调优、架构设计、节点规划

1.大数据平台硬件选型 要对Hadoop大数据平台进行硬件选型,首先需要了解Hadoop的运行架构以及每个角色的功能。在一个典型的Hadoop架构中,通常有5个角色,分别是NameNode、Standby NameNode、ResourceManager、NodeManager、DataNode以及外围机。 其中 NameNode 负责协调集群…

每周AI新闻(2024年第3周)Meta研发Llama 3 | 苹果Vision Pro预售 | 智谱AI发布GLM-4

我是陌小北&#xff0c;一个正在研究硅基生命的、有趣儿的碳基生命。每周日20:00&#xff0c;准时解读每周AI大事件。 大厂动向 【1】Meta研发Llama 3&#xff0c;构建开源AGI Meta公司CEO马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;宣布公司将对两个关键AI研究部…

客户需求,就是项目管理中最难管的事情

对于需求控制和管理 个人的观点是&#xff1a;首先要向客户传递开发流程&#xff0c;第二必须制作原型&#xff0c;需求确认时确认的是原型&#xff0c;而不是需求文档&#xff0c;第三&#xff0c;开发阶段要快速迭代&#xff0c;与客户互动。管人方面我想对于项目经理来讲&am…

【51单片机】

0、前言 参考&#xff1a;普中 51 单片机开发攻略 第14章 1、硬件 ULN2003 芯片 2、软件 mian.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned char u8; typedef unsigned int u16;sbit DC_MotorP1^0;void DC_Mo…

Ubuntu 使用 git 能够 clone 但不能 push 的参考解决方法

写在前面 自己的测试环境&#xff1a;Ubuntu20.04 下面的操作都是和 git 有关&#xff0c;所以针对不同的操作系统&#xff08;比如 Windows&#xff09;也是一样的。 一、问题描述 在此之前使用git执行 git push origin master 的命令时&#xff0c;能够正常执行&#xff0…

【计算机网络】【Python】【练习题】【新加坡南洋理工大学】【Computer Control Network】

一、题目描述 该题目描述一个网络中数据包交换&#xff08;Packet Switching&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;使用Python&#xff09; Q1&#xff1a;如何求出0.0004这个值&#xff1f; &#xff08;1&#xff09;、公式推导过程&#xf…

数据库防水坝是什么?有什么作用?有哪些优势?

数据库是公司重要IT资产&#xff0c;是公司数据存储、数据整合、数据备份等重要载体。所以保障数据库安全至关重要。目前保障数据库安全产品较多&#xff0c;例如堡垒机、防火墙、数据库防水坝等等。今天我们就先来简单了解一下数据库防水坝是什么&#xff1f;有什么作用&#…

CMU15-445-Spring-2023-分布式DBMS初探(lec21-24)

Lecture #21_ Introduction to Distributed Databases Distributed DBMSs 分布式 DBMS 将单个逻辑数据库划分为多个物理资源。应用程序&#xff08;通常&#xff09;并不知道数据被分割在不同的硬件上。系统依靠单节点 DBMS 的技术和算法来支持分布式环境中的事务处理和查询执…

Scikit-Learn 中级教程——特征缩放

Python Scikit-Learn 中级教程&#xff1a;特征缩放 在机器学习中&#xff0c;特征缩放是一个重要的预处理步骤。它用于调整数据中特征的范围&#xff0c;以便模型能够更好地收敛和表现。在本篇博客中&#xff0c;我们将深入介绍 Scikit-Learn 中的特征缩放方法&#xff0c;并…

DAG最小路径点覆盖,最小路径可重复覆盖,详解

文章目录 前言有向无环图的最小路径点覆盖概念拆点二分图定理**证明** 最小路径可重复覆盖解决策略代码实现 OJ练习 前言 关于二分图&#xff1a;二分图及染色法判定 关于二分图最大匹配&#xff1a;二分图最大匹配——匈牙利算法详解 关于二分图带权最大完备匹配&#xff1…

k8s节点RouteCreated为false

出现该情况后&#xff0c;一般是初始化节点失败。因此&#xff0c;需要把节点从集群中移除&#xff0c;再加入到集群中&#xff0c;即可解决。 通常出现这个状况后&#xff0c;该节点上是没有被分配pod ip的&#xff0c;可以通过命令查看&#xff1a; # 发现没有PodCIDR、PodC…

【flutter】完全自定义样式模态对话框

示例完成结果展示&#xff1a; 示例组件代码&#xff1a; context&#xff1a;上下文 title&#xff1a;提示标题&#xff0c;null时不显示 content&#xff1a;提示内容&#xff0c;null时不显示 cancelText&#xff1a;取消按钮文字&#xff0c;null时不显示取消按钮 confirm…

GPT应用_PrivateGPT

项目地址&#xff1a;https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT 相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大…

2024年【金属非金属矿山(地下矿山)安全管理人员】证考试及金属非金属矿山(地下矿山)安全管理人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员】证考试及金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员模拟考试题库&#xff0c;包含金属非金属矿山&#xff08;地下矿山&…

常用的正则表达式1

1.Email地址&#xff1a;^\w([-.]\w)\w([-.]\w).\w([-.]\w)*$ 2.域名&#xff1a;[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})/.? 3.电话号码 /^1(3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/ 以1开头&#xff0c;3可跟任一数字&#…

基于 IDEA 创建 Maven 工程

1. 概念梳理Maven工程的GAVP Maven工程相对之前的项目&#xff0c;多出一组gavp属性&#xff0c;gav&#xff08;表示当前工程的坐标&#xff09;需要我们在创建项目的时候指定&#xff0c;p&#xff08;表示打包方式&#xff09;有默认值&#xff08;默认为 jar 包&#xff0…

Java 8 特性

Java 8 特性 1&#xff1a;Lambda 表达式2&#xff1a;方法引用构造器引用&#xff1a;静态方法引用&#xff1a;特定类的任意对象的方法引用&#xff1a;特定对象的方法引用&#xff1a; 3&#xff1a;默认方法静态默认方法默认方法实例 4&#xff1a;新工具jjsjjs 交互式编程…

sm2和aes加解密

引用maven包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version></dependency>2.对报文进行加密后生成签名 {// oristr报文 SECRET_KEY加密密钥String encrypt…

STM32标准库开发—SPI通信介绍

SPI通信 硬件电路 注意&#xff1a;为避免输入信号&#xff08;MISO&#xff09;造成冲突&#xff0c;只有被SS选中的设备才能使用MISO进行通信&#xff0c;空闲状态下该引脚呈现高阻态模式 SPI信号移位示意图 主机与从机通过交换时序实现数据传输&#xff0c;无论要与不要都需…