正负样本比率失衡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. 自实现PC端jQuery版轮播图

    最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面(之前没接触公司官网项目),其中有一个用到轮播图的地方,最开始想直接用swiper.js插件实现就好了,可是发现官网项目里之前都没有引入过sw ...

  2. Windows7下设置定时启动(关闭)虚拟机

    曾记否,忆当年,开启或者关闭虚拟机,度秒如年~ ⒈石头,剪刀,布,C.D.E盘随便找一个,然后在里面找个静谧的墙角, 新建一个文件:vmstart.bat 添加:"C:\Program Fi ...

  3. JS和H5做一个音乐播放器,附带源码

    http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 ...

  4. PHP defined() 函数

    定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语法 defined(name) 参数 描述 name 必需.规定要检查的常量的名称. ...

  5. C语言第二次实验报告

    1.实验题目 题1:11-7 找鞍点(20 分) 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点    题2: ...

  6. Intellij idea 中修改java web代码 ,网页不同步

    问题可能出在  Intellij  idea 没有将源码保存在本地,浏览器访问了缓存而没有访问最新文件 用命令行查看了源码,同步了 接着禁止浏览器缓存,网页同步了 打开火狐浏览器 输入 about:c ...

  7. Codeforces 895C - Square Subsets 状压DP

    题意: 给了n个数,要求有几个子集使子集中元素的和为一个数的平方. 题解: 因为每个数都可以分解为质数的乘积,所有的数都小于70,所以在小于70的数中一共只有19个质数.可以使用状压DP,每一位上0表 ...

  8. Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/

    问题描述: apt-get update W: chmod of directory /: Operation not permitted) E: Could not open : Permissio ...

  9. Java读写Excel之POI超入门(转)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...

  10. linux mysql下忘记root密码解决办法

    1 修改MySQL的登录设置 # vi /etc/my.cnf 在[mysqld]的中加上一句:skip-grant-tables  2 重新启动mysqld # /etc/init.d/mysqld ...