likes
comments
collection
share

机器学习基础-监督学习-标签平衡处理之 ROSE

作者站长头像
站长
· 阅读数 3

ROSE (Random Over-Sampling Examples) 是一种基于样本生成的过采样方法,它通过对少数类样本进行样本生成,以增加数据集中的少数类样本数量。具体来说,ROSE 通过从少数类样本中随机选择一个样本,然后通过一定的方式生成新的样本来进行过采样。ROSE 方法可以根据不同的生成方式分为以下两类:

  1. Informed Over-Sampling:这种方式需要指定少数类样本的生成方式。例如,可以通过特定的模型对少数类样本进行拟合,然后生成新的少数类样本。Informed Over-Sampling 可以更好地保留少数类样本的信息。

  2. Uniform Over-Sampling:这种方式是最常用的 ROSE 方式。它通过对少数类样本进行简单的随机过采样,然后对过采样后的样本进行随机变换来生成新的样本。Uniform Over-Sampling 可以更快地生成新样本。

下面给出一个简单的 ROSE 算法的伪代码:

Input: 少数类样本集合 D_min, 过采样倍数 k
Output: 过采样后的数据集合 D_over

D_over = D_min
for i in 1 to k-1:
    randomly choose a sample d from D_min
    randomly generate a new sample d_new based on d
    add d_new to D_over
end for
return D_over

其中,随机生成新样本的方式可以使用简单的线性插值,即对于样本 dddd′d'd,生成 k−1k-1k1 个新样本,第 jjj 个新样本为:

dnewj=k−jk−1×d+j−1k−1×d′d_{new_j} = \frac{k-j}{k-1} \times d + \frac{j-1}{k-1} \times d^\primednewj=k1kj×d+k1j1×d

下面给出 Python 代码示例,使用 scikit-learn 的 ROSE 实现进行过采样:

from imblearn.over_sampling import RandomOverSampler

ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

其中,X 和 y 分别为输入特征和标签。RandomOverSampler 类可以设置采样倍数,生成样本方式等参数,以满足不同的需求。

Informed Over-Sampling

Informed Over-Sampling 是一种基于样本生成的过采样方法,需要指定少数类样本的生成方式。它通过对少数类样本进行拟合,然后生成新的样本来进行过采样。具体来说,Informed Over-Sampling 可以使用以下方式生成新样本:

在少数类样本中随机选择一个样本 xix_ixi; 使用 K 近邻算法或其他分类器对 xix_ixi 进行分类,并找到最近的 kkk 个样本,这些样本属于少数类或多数类都可以; 根据这 kkk 个样本的特征和标签信息,生成新的样本。 生成新样本的方式有很多种,常见的方式包括插值法和 SMOTE 算法。插值法的基本思想是将少数类样本看作曲线上的点,然后在曲线上进行插值得到新的点。SMOTE 算法则是使用合成样本来增加少数类样本数量。

下面给出一个简单的 Informed Over-Sampling 算法的伪代码:

Input: 少数类样本集合 D_min, 过采样倍数 k
Output: 过采样后的数据集合 D_over

D_over = D_min
for i in 1 to k-1:
    randomly choose a sample d from D_min
    find k nearest neighbors of d
    generate a new sample d_new based on d and its k neighbors
    add d_new to D_over
end for
return D_over

下面给出 Python 代码示例,使用 scikit-learn 的 KNeighborsClassifier 和 SMOTE 实现 Informed Over-Sampling 过采样:

from imblearn.over_sampling import SMOTE
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=k)
smote = SMOTE(sampling_strategy='auto', k_neighbors=k, random_state=0)
X_resampled, y_resampled = smote.fit_resample(X, y)

其中,knn 用于查找最近的 kkk 个样本,SMOTE 用于根据最近的 kkk 个样本生成新样本。SMOTE 的 sampling_strategy 参数用于指定过采样后的样本类别分布,k_neighbors 参数用于指定最近邻的数量。

Uniform Over-Sampling

Uniform Over-Sampling 是 ROSE 中常用的一种过采样方法,它通过对少数类样本进行随机过采样,并对过采样后的样本进行随机变换来生成新的样本。Uniform Over-Sampling 的生成方式相对简单,但也需要注意一些问题,例如过采样倍数、采样时的数据分布等。

下面给出 Uniform Over-Sampling 的伪代码:

Input: 少数类样本集合 D_min, 过采样倍数 k
Output: 过采样后的数据集合 D_over

D_over = D_min
while len(D_over) < k * len(D_min):
    randomly choose a sample d from D_min
    randomly generate a new sample d_new based on d
    add d_new to D_over
end while
return D_over

下面给出 Python 代码示例,使用 scikit-learn 的 RandomOverSampler 类进行 Uniform Over-Sampling:

from imblearn.over_sampling import RandomOverSampler

ros = RandomOverSampler(sampling_strategy='minority', random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)

其中,sampling_strategy 参数设置为 'minority' 表示只对少数类样本进行过采样。RandomOverSampler 类的其他参数可以根据具体情况进行调整。