解决数据不平衡的smote算法简述,以及改进

首先说明:改进方案是本人原创,请尊重。其次,改进方案风险很大,请谨慎使用。


首先说smote算法,样本本身就是在特征空间的一些点,所以该算法用于增加样本的方法就是在特征空间中两个同类点之间随机选取一个点,这个点就是一个新样本了,和另外两个点具有相同的类别。


然后说一下smote算法的问题,首先样本不平衡会带来样本点的空间分布并不能符合真实分布,因此使用smote扩充样本集合时,并不能改变原有样本的分布的外围轮廓特征,这就意味着对分类问题中分类边界的影响比较小。


下面是本人对smote算法的改进:

不再只选用两个样本之间的点,而且以一定概率也选用样本点周围的点,距离越近,选用概率越大,越远越小,成指数下降趋势。


输入:样本点集合A,参数m, n , p,q ( 此处p=1,q=3)

1,对于随机选取的样本a属于A,针对点a的n个维度,重复选取m(m<n)次,选出K个待修改的维度

2,针对该K个维度的值val,更新为  val = val +  val*[(-1)**random(100)]*   [ 1 / exp(random(1,3)) ]

3,将新生成的样本加入A,直至新生成的样本数目满足要求,否则,执行1


对于该算法需要把握几个方面:

1,生成新样本的数目,建议不要多于原有的数目太多

2,每次选取修改的维度 数量, 这个建议根据情况选取,原则而言,不要高于10%

3,波动范围,即更改的幅度,建议也不要太大,尽量控制到30%以下


以上情况,全凭借个人使用经验来做的建议。具体情况,可以再做分析。


最后,需要注意,smote算法也好,本算法也罢,本质都是无中生有,添加训练样本。添加样本信息帮助分类,同时也是添加了噪声,影响了分类边界的确定

建议在使用过程中谨慎把握使用的幅度。





  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
SMOTE (Synthetic Minority Over-sampling Technique) 是一种数据抽样算法,用于解决数据平衡的问题。它通过合成新少数类样本来增加少数类样本的数量,从而解决数据平衡的问题。 下面是 SMOTE 算法的 Python 代码实现: ``` python import numpy as np from sklearn.neighbors import NearestNeighbors def smote(X, y, k=5, sampling_ratio=1.0): """ X: 二维数组,表示原始数据集 y: 一维数组,表示原始数据集的标签 k: 选取的最近邻数 sampling_ratio: 抽样比例 """ # 将原始数据集按类别分组 groups = {} for i, label in enumerate(y): if label not in groups: groups[label] = [] groups[label].append(i) # 计算每个少数类样本需要合成的样本数 N = len(X) n_samples = int(sampling_ratio * N) n_majority = max([len(groups[label]) for label in groups]) n_synthetic = int((n_samples - N) / n_majority) # 对每个少数类样本合成样本 new_X = [] new_y = [] for label, indices in groups.items(): if len(indices) >= n_synthetic: # 找到 k 个最近邻 nn = NearestNeighbors(n_neighbors=k).fit(X[indices]) for i in indices: # 找到 i 的 k 个最近邻 nn_indices = nn.kneighbors(X[i].reshape(1, -1), return_distance=False)[0] # 随机选择一个最近邻 j j = np.random.choice(nn_indices) # 在 i 和 j 之间进行插值 diff = X[j] - X[i] gap = np.random.rand() new_X.append(X[i] + gap * diff) new_y.append(label) else: # 少数类样本数量不足,无法进行 SMOTE pass # 将合成的样本添加到原始数据集中 new_X = np.array(new_X) new_y = np.array(new_y) X = np.vstack([X, new_X]) y = np.hstack([y, new_y]) return X, y ``` 其中,`X` 是原始数据集,`y` 是原始数据集的标签。`k` 表示选取的最近邻数,`sampling_ratio` 表示抽样比例。 这段代码的实现思路是先按类别分组,然后计算每个少数类样本需要合成的样本数。对于每个少数类样本,找到它的 k 个最近邻中的一个随机样本,在它和最近邻之间进行插值,生成新的合成样本。最后将合成的样本添加到原始数据集中返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值