SMOTE-variants源码解析:从基础类到高级过采样算法的实现原理
【免费下载链接】smote_variantsA collection of 85 minority oversampling techniques (SMOTE) for imbalanced learning with multi-class oversampling and model selection features项目地址: https://gitcode.com/gh_mirrors/smo/smote_variants
SMOTE-variants是一个强大的开源项目,提供了85种 minority oversampling 技术(SMOTE),专为不平衡学习设计,支持多类过采样和模型选择功能。本文将深入解析其源码结构,从基础类设计到高级过采样算法的实现原理,帮助开发者快速理解和应用这一工具。
项目架构概览
SMOTE-variants的代码组织结构清晰,主要分为以下几个核心模块:
- 基础类模块:
smote_variants/base/包含所有过采样算法的基类和核心接口 - 过采样算法模块:
smote_variants/oversampling/实现了85种不同的过采样算法 - 多类过采样模块:
smote_variants/multiclassoversampling/提供多类别不平衡数据的处理方案 - 噪声过滤模块:
smote_variants/noise_removal/实现数据预处理中的噪声过滤功能
这种模块化设计使代码具有良好的可扩展性,新的过采样算法可以很容易地通过继承基础类来实现。
核心基础类设计
OverSamplingBase类
smote_variants/base/_oversampling.py定义了所有过采样算法的基础类OverSamplingBase,它提供了以下核心功能:
- 数据统计和参数管理
- 样本生成数量计算(
det_n_to_sample方法) - 采样算法执行流程控制(
sample方法) - 结果返回和日志记录
该类通过混入(mixin)模式集成了统计功能(StatisticsMixin)、参数管理(ParametersMixin)和度量学习(MetricLearningMixin)等功能,体现了良好的代码复用设计。
OverSampling和OverSamplingSimplex类
在基础类之上,项目定义了两个直接用于继承的过采样基类:
- OverSampling:结合了随机采样功能(
RandomSamplingMixin) - OverSamplingSimplex:结合了单纯形采样功能(
SimplexSamplingMixin)
大多数过采样算法都继承自这两个类,例如基础SMOTE算法继承自OverSamplingSimplex:
class SMOTE(OverSamplingSimplex): categories = [ OverSamplingSimplex.cat_sample_ordinary, OverSamplingSimplex.cat_extensive, OverSamplingSimplex.cat_metric_learning, ]这种设计允许不同过采样算法灵活选择采样策略,同时保持接口的一致性。
基础SMOTE算法实现
SMOTE类结构
smote_variants/oversampling/_smote.py实现了经典的SMOTE算法,其核心流程包括:
- 参数初始化:设置过采样比例、近邻数量等参数
- 样本数量计算:通过
det_n_to_sample方法确定需要生成的样本数量 - 近邻查找:使用
NearestNeighborsWithMetricTensor查找 minority样本的近邻 - 样本生成:通过
sample_simplex方法在特征空间中生成新样本
核心采样逻辑
SMOTE算法的核心在于在 minority 样本与其近邻之间生成新样本:
def sampling_algorithm(self, X, y): n_to_sample = self.det_n_to_sample(self.proportion) if n_to_sample == 0: return self.return_copies(X, y, "Sampling is not needed") X_min = X[y == self.min_label] # 查找近邻 n_neighbors = min([len(X_min), self.n_neighbors + 1]) nn_mt = NearestNeighborsWithMetricTensor(n_neighbors=n_neighbors, n_jobs=self.n_jobs,** nn_params) nn_mt.fit(X_min) _, ind_min = nn_mt.kneighbors(X_min, return_distance=True) # 生成样本 samples = self.sample_simplex(X=X_min, indices=ind_min, n_to_sample=n_to_sample) return (np.vstack([X, samples]), np.hstack([y, np.hstack([self.min_label] * n_to_sample)]))SMOTE算法通过在 minority 样本与其近邻之间插值生成新样本,有效解决了数据不平衡问题
高级过采样算法:Borderline-SMOTE
Borderline-SMOTE是对基础SMOTE的改进,它只对处于分类边界的 minority 样本进行过采样,从而提高生成样本的质量。
边界样本识别
determine_danger_remove_noise函数实现了边界样本的识别逻辑:
def determine_danger_remove_noise(*, X, y, X_min, nn_params, n_neighbors, n_jobs, maj_label): # 查找每个 minority 样本的近邻 nnmt = NearestNeighborsWithMetricTensor(n_neighbors=n_neighbors, n_jobs=n_jobs, **(nn_params)) nnmt.fit(X) indices = nnmt.kneighbors(X_min, return_distance=False) # 确定噪声和边界样本 noise = [] danger = [] for idx, row in enumerate(indices): if (n_neighbors - 1) == sum(y[row[1:]] == maj_label): noise.append(idx) # 所有近邻都是 majority,判定为噪声 elif mode(y[row[1:]]) == maj_label: danger.append(idx) # 多数近邻是 majority,判定为边界样本 X_danger = X_min[danger] X_min = np.delete(X_min, np.array(noise).astype(int), axis=0) return X_min, X_dangerBorderline-SMOTE1和Borderline-SMOTE2
项目实现了Borderline-SMOTE的两个变体:
- Borderline-SMOTE1:仅使用 minority 样本生成新样本
- Borderline-SMOTE2:可以使用 majority 样本生成新样本,但会调整采样权重
Borderline-SMOTE1仅对边界 minority 样本进行过采样,生成的样本更具分类价值
Borderline-SMOTE2允许在边界 minority 样本与 majority 样本之间生成新样本
算法扩展与参数组合
SMOTE-variants提供了灵活的参数组合机制,每个算法类都实现了parameter_combinations方法,用于生成合理的参数组合:
@classmethod def parameter_combinations(cls, raw=False): parameter_combinations = { "proportion": [0.1, 0.25, 0.5, 0.75, 1.0, 1.5, 2.0], "n_neighbors": [3, 5, 7, 11, 17], } return cls.generate_parameter_combinations(parameter_combinations, raw)这种设计方便进行算法参数调优和性能比较,在模型选择模块中得到了广泛应用。
总结与扩展
SMOTE-variants通过精心设计的基础类结构和模块化实现,提供了一个强大而灵活的过采样算法框架。其核心优势包括:
- 丰富的算法库:85种过采样算法满足不同场景需求
- 一致的接口设计:所有算法遵循相同的调用模式,易于替换和比较
- 灵活的扩展机制:新算法可通过继承基础类快速实现
- 多类支持:提供专门的多类别过采样解决方案
开发者可以通过smote_variants/queries/_queries.py模块查询和比较不同算法的性能,或通过smote_variants/evaluation/_evaluation.py模块进行系统的算法评估。
要开始使用SMOTE-variants,只需克隆仓库并安装依赖:
git clone https://gitcode.com/gh_mirrors/smo/smote_variants cd smote_variants pip install -r requirements.txt项目提供了丰富的示例代码(examples/目录),帮助用户快速上手各种过采样技术的应用。无论是学术研究还是工业界应用,SMOTE-variants都是处理不平衡数据的理想选择。
【免费下载链接】smote_variantsA collection of 85 minority oversampling techniques (SMOTE) for imbalanced learning with multi-class oversampling and model selection features项目地址: https://gitcode.com/gh_mirrors/smo/smote_variants
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考