一、不平衡数据集
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+δ∗(x′−x)(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 1−yy≥1,即 y ≥ 0.5 y\geq 0.5 y≥0.5,则预测为正类; - 在样本不平衡时,分类器的决策规则为:
1)若 y 1 − y ≥ m + m − \frac{y}{1-y}\geq\frac{m^+}{m^-} 1−yy≥m−m+,即 y ≥ m + m − y\geq \frac{m^+}{m^-} y≥m−m+,则预测为正类;