机器学习之不平衡数据处理

一、不平衡数据集

1.1 不平衡数据集定义

  • 不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下把样本比例接近100:1这种情况下的数据称为不平衡数据。

1.2 处理方法

1.2.1 欠采样

  • 欠采样:EasyEnsemble为欠采样的代表性算法,利用继承学习机制,将反例划分为若干个集合,供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。
  • 若正负样本类别比例为1:4,可以将负样本划分为4份,每一份正样本和负样本组成不同的训练集(此时就是4份1:1的平衡数据集,即正样本重复了4份,分别和每一份负样本进行合并),每一份训练集由不同的学习器进行学习,这样每个训练集的数据都是平衡的,全局来看又不会舍掉任何正样本。
    在这里插入图片描述

1.2.2 过采样

  • 过采样:增加一些正样本,使得正负样本数量接近。

过采样方式:
1)朴素随机过采样
从少数类的样本中进行随机采样来增加新的样本, RandomOverSampler 函数就能实现上述的功能。

from sklearn.datasets import make_classification
from collections import Counter
X, y = make_classification(n_samples=5000, n_features=10, n_informative=2,
                           n_classes=3,
                           n_clusters_per_class=1,
                           weights=[0.01, 0.05, 0.94], random_state=0) #生成样本
print(Counter(y)) #查看样本类别中样本数
#结果
Counter({2: 4665, 1: 263, 0: 72}) #发现数据集是不平衡的

#进行随机采样
from imblearn.over_sampling import RandomOverSampler
X_resampled, y_resampled = RandomOverSampler(random_state=0).fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))
X_resampled.shape
#结果
[(0, 4665), (1, 4665), (2, 4665)] #采样后类别中样本数
(13995, 10) #采样后数据集size

import pandas as pd
pd.DataFrame(X_resampled).drop_duplicates().shape
#结果
(5000, 10) #数据去重后,样本数还是5000,说明确实是使用采样的方式进行数据平衡。

sklearn.datasets.make_classification函数参数参考:https://blog.csdn.net/mqq9931/article/details/83829849?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base

2)SMOTE:过采样的代表性算法,通过对训练集的正例进行插值,来产生额外的正例。
SMOTE算法流程:
a)对于少数类中每一个样本 x x x,计算该点与少数类中其他样本点的距离,得到最近的 k k k个近邻(即对少数类点进行KNN算法)。
b)根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本 x x x,从其 k k k近邻中随机选择若干个样本,假设选择的近邻为 x ′ x' x
c)对于每一个随机选出的近邻 x ′ x' x,分别与原样本按照如下的公式构建新的样本:
x n e w = x + δ ∗ ( x ′ − x ) (1) x_{new}=x+\delta*(x'-x)\tag{1} xnew=x+δ(xx)(1)
δ ∈ [ 0 , 1 ] \delta\in[0, 1] δ[0,1]是一个随机数。
在这里插入图片描述
SMOTE缺点:
1)一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题);
2)样本是认为生成的,没有提供有益信息。

from imblearn.over_sampling import SMOTE
X_resampled,y_resampled = SMOTE().fit_resample(X, y)
print(sorted(Counter(y_resampled).items()))
#结果
[(0, 4665), (1, 4665), (2, 4665)]

1.2.3 阈值移动

y y y是样本 x x x被判别为正类的概率, m + m^+ m+ m − m^- m分别代表正类和负类样本的数量。

  • 在样本平衡时,分类器的决策规则为:
    1)若 y 1 − y ≥ 1 \frac{y}{1-y}\geq 1 1yy1,即 y ≥ 0.5 y\geq 0.5 y0.5,则预测为正类;
  • 在样本不平衡时,分类器的决策规则为:
    1)若 y 1 − y ≥ m + m − \frac{y}{1-y}\geq\frac{m^+}{m^-} 1yymm+,即 y ≥ m + m − y\geq \frac{m^+}{m^-} ymm+,则预测为正类;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值