正负样本比率失衡SMOTE

背景

这几天测试天池的优惠券预测数据在dnn上面会不会比集成树有较好的效果,但是正负样本差距太大,而处理这种情况的一般有欠抽样和过抽样,这里主要讲过抽样,过抽样有一种简单的方法叫随机过抽样,但是随机过抽样只是随机的复制,很容易过拟合,所以SMOTE比较好,SMOTE还有一些改进版本,更好用,这里讲一般的SMOTE即可

公式

\(x\) : 任意一个样本

\(\tilde{x}\) : \(x\)最临近的\(K\)个样本的随机一个,\(x\not= \tilde{x}\)

\[x_{new}=x+rand(0,1)\times(\tilde{x}-x)
\]

python实现

import random
from sklearn.neighbors import NearestNeighbors
import numpy as np
class Smote:
def __init__(self,N=1,k=5):
self.__shape=None
self.__N=N
self.__k=k def fit(self, samples):
self.__shape=samples.shape #源样本的shape
# 塑形为两位度才可以用KNN
self.__samples=samples.reshape((self.__shape[0],-1))
self.__tmp_shape=self.__samples.shape
# 返回值的维度
self.__ret_shape=(self.__shape[0]*self.__N,)+self.__shape[1:] def transform(self):
# 如果没有喂给数据,则直接返回None
if self.__shape == None:
return None
self.__index=0 # 清零新增数据的索引
self.__X = np.zeros((self.__tmp_shape[0] * self.__N, self.__tmp_shape[1])) # 构造返回的数据,具体数据待填充
neighbors=NearestNeighbors(n_neighbors=self.__k).fit(self.__samples)
for i in range(self.__shape[0]): # 根据每一个样本产生一个新样本
# nnarray当前样本最近k个的样本的索引
nnarray=neighbors.kneighbors(self.__samples[i].reshape(1,-1),return_distance=False)[0]
# 根据当前样本索引和,最近k和样本生成一个新样本
self.__new_one_sample(i,nnarray)
return self.__X.reshape(self.__ret_shape) # 重新塑形并返回 def fit_transform(self, samples):
self.fit(samples)
return self.transform() # 根据当前样本索引和,最近k和样本生成一个新样本
def __new_one_sample(self,i,nnarray):
for _ in range(self.__N):
#从K个最近的样本随机挑选不同于当前样本的一个样本
nn_idx=random.choice(nnarray)
while (nn_idx==i):
nn_idx=random.choice(nnarray)
gap=self.__samples[nn_idx]-self.__samples[i]
prob=random.random()
# 根据公式生成新样本
self.__X[self.__index]=self.__samples[i]+prob*gap
self.__index+=1 if __name__ == '__main__':
a=np.array([[1,3,4],[2,5,6],[4,1,2],[5,1,4],[3,2,4],[5,3,5]])
print("\n"*2, "测试维度为" , a.shape)
print("*"*100)
s=Smote()
s.fit(a)
print (s.transform()) # 测试多维度支持
b=np.zeros((10,)+a.shape)
print("\n"*2, "测试维度为" , b.shape)
print("*"*100)
for i in range(10):
b[i,:]=s.fit_transform(a)
print (s.fit_transform(b))

代码的使用方法

假设你已经有label很少的数据 data (不包括label列)

s=Smote()
s.fit(data)
s.transform()

上面的实例是默认参数,可根据情况选择参数N和k

数据扩增N被,从最近的k个样本选择一个样本参考(这里 参考 这个词可能不太准确,想不出其他词)来生成样本

s=Smote(N=2, k=4)
s.fit(data)
s.transform()

正负样本比率失衡SMOTE的更多相关文章

  1. DDBNet:Anchor-free新训练方法,边粒度IoU计算以及更准确的正负样本 | ECCV 2020

    论文针对当前anchor-free目标检测算法的问题提出了DDBNet,该算法对预测框进行更准确地评估,包括正负样本以及IoU的判断.DDBNet的创新点主要在于box分解和重组模块(D&R) ...

  2. gluoncv rpn 正负样本

    https://github.com/dmlc/gluon-cv/blob/master/gluoncv/model_zoo/rpn/rpn_target.py def forward(self, i ...

  3. 不平衡分类学习方法 --Imbalaced_learn

    最近在进行一个产品推荐课题时,由于产品的特性导致正负样本严重失衡,远远大于3:1的比例(个人认为3:1是建模时正负样本的一个临界点),这样的样本不适合直接用来建模,例如正负样本的比例达到了50:1,就 ...

  4. XGB算法梳理

    学习内容: 1.CART树 2.算法原理 3.损失函数 4.分裂结点算法 5.正则化 6.对缺失值处理 7.优缺点 8.应用场景 9.sklearn参数 1.CART树 CART算法是一种二分递归分割 ...

  5. Kaggle : Display Advertising Challenge( ctr 预估 )

    原文:http://blog.csdn.net/hero_fantao/article/details/42747281 Display Advertising Challenge --------- ...

  6. 论文阅读 | FoveaBox: Beyond Anchor-based Object Detector

    论文阅读——FoveaBox: Beyond Anchor-based Object Detector 概述 这是一篇ArXiv 2019的文章,作者提出了一种新的anchor-free的目标检测框架 ...

  7. 论文阅读 | Region Proposal by Guided Anchoring

    论文阅读 | Region Proposal by Guided Anchoring 相关链接 论文地址:https://arxiv.org/abs/1901.03278 概述 众所周知,anchor ...

  8. focal loss和ohem

    公式推导:https://github.com/zimenglan-sysu-512/paper-note/blob/master/focal_loss.pdf 使用的代码:https://githu ...

  9. Python:SMOTE算法——样本不均衡时候生成新样本的算法

    Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...

随机推荐

  1. grunt 插件开发注意事项

    grunt的插件机制 task.loadNpmTasks = function(name) { var root = path.resolve('node_modules'); var tasksdi ...

  2. tp5命名空间

  3. Aliase_小白学Python_Day0_前言

    听到有老师介绍,说你为什么不把你的学习过程保存下来,一是当做总结,二是作为分享.我想,也对.这算是我的第一个博客,本次想写写我为什么选择学习Python. 很多人都问过我一个问题,行业那么多,你为什么 ...

  4. oc 快排算法

    直接复制粘贴就可以用了 - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *M_arr = [[NSMutableArray allo ...

  5. SSL协议之数据加密过程详解

    前言 总括: 原文博客地址:SSL协议之数据加密过程详解 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 生活 ...

  6. mysql批量数据脚本

    mysql批量数据脚本 1 建表 create table dept( id int unsigned primary key auto_increment, deptno mediumint uns ...

  7. Jquery实现两级联动

    最后结果如下: 关键代码如下: <select name="customerCondition['credibilityBegin']" id="credibili ...

  8. Dreamweaver cs6中文版完整安装步骤:

    Dreamweaver cs6中文版完整安装步骤: http://www.cr173.com/soft/72633.html 1.首先我们需要下载Dreamweaver cs6官方中文原版安装程序,下 ...

  9. html input验证只能输入数字,不能输入其他

    html input验证只能输入数字,不能输入其他 此方法为借鉴别人的,在此只做记录. <input type="text" onkeyup="if(!/^\d+$ ...

  10. mybatis-自定义缓存-redis二级缓存

    在mybatis一级缓存二级缓存中已经介绍过了二级缓存的大致原理.下面我们用redis来实现一下二级缓存.环境是springmvc+mybatis+redis 步骤一.引入redis相关的maven依 ...