正负样本比率失衡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. php通过ini_set调用output_compression压缩网页

    网页压缩是一种网页优化技术,可以让网页体积缩小后再传输到客户端,从而减少数据传送量,提高速度.这种技术现在使用已经相当普遍,绝大多数网页都使用了这种技术. 网页压缩可以在服务器或空间里通过参数设置启用 ...

  2. 调用QQ聊天功能

    [HTML]: <a href="javascript:void(0);" onclick="chatQQ()">咨询客服</a> fu ...

  3. JAR包介绍大全用途作用详解JAVA

    jta.jar 标准JTA API必要commons-collections.jar 集合类 必要antlr.jar  ANother Tool for Language Recognition 必要 ...

  4. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. 注入理解之APC注入

    近期学习做了一个各种注入的MFC程序,把一些心得和体会每天分享一些 APC(Asynchronous procedure call)异步程序调用,在NT中,有两种类型的APCs:用户模式和内核模式.用 ...

  6. form表单action=""的作用

    看项目时发现action="",可仍旧提交到后台相关页面了.查了一下,action=""相当于当前页面刷新,不过页面按照form表单提交参数到后台@参考文章

  7. Ubuntu 11.10 Server下搭建Maven私服

      安装Nexus服务的文档可以参考官方站点:http://www.sonatype.com/books/nexus-book/reference/install-sect-install.html ...

  8. junit4X系列--Statement

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/11/377954.html.感谢作者的无私分享. 初次用文字的方式记录读源码的过程,不知道怎么 ...

  9. 一个滑动选中RecyclerView中Item的布局SlidingCheckLayout,手指滑过Item时多项选中。

    SlidingCheckLayout是一个滑动选中RecyclerView中Item的布局,手指滑过Item时多项选中. 作者:竹尘居士 github:https://github.com/homgw ...

  10. jdk源码->集合->HashSet

    类的属性 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, ...