KMeans-SMOTE 不平衡学习过采样方法详解
KMeans-SMOTE 是一种基于 K-Means 聚类和 SMOTE 过采样的类不平衡数据过采样方法。它通过在输入空间的安全和关键区域生成少数类样本来辅助分类,避免噪声生成,并有效克服类间和类内的不平衡问题。
项目结构与核心文件
项目采用简洁的Python包结构,主要包含以下核心文件:
kmeans_smote/
├── LICENSE
├── README.rst
├── setup.py
├── kmeans_smote.py
└── test/
└── test_kmeans_smote.py
- kmeans_smote.py: 核心算法实现文件,包含KMeansSMOTE类
- test/test_kmeans_smote.py: 完整的测试套件,验证算法正确性
- setup.py: 项目安装配置脚本
- README.rst: 详细的项目说明文档
核心算法原理
KMeans-SMOTE 算法工作流程分为三个关键步骤:
- K-Means聚类: 使用K-Means算法对整个输入空间进行聚类
- 样本分布策略: 根据聚类特征分配要生成的样本数量
- 筛选具有大量多数类样本的聚类
- 在少数类样本稀疏分布的聚类中分配更多合成样本
- SMOTE过采样: 对每个筛选出的聚类使用SMOTE方法进行过采样
安装与依赖
环境要求
- Python 3.6+
- imbalanced-learn (>=0.4.0, <0.5)
- numpy (>=1.13, <1.16)
- scikit-learn (>=0.19.0, <0.21)
安装方式
从Pypi安装:
pip install kmeans-smote
从源码安装:
git clone https://gitcode.com/gh_mirrors/km/kmeans_smote.git
cd kmeans-smote
pip install .
核心类与方法详解
KMeansSMOTE 类
KMeansSMOTE 类继承自 imbalanced-learn 的 BaseOverSampler,提供完整的过采样功能。
初始化参数
def __init__(self,
sampling_strategy='auto',
random_state=None,
kmeans_args=None,
smote_args=None,
imbalance_ratio_threshold=1.0,
density_power=None,
use_minibatch_kmeans=True,
n_jobs=1,
**kwargs)
参数说明:
sampling_strategy: 重采样策略,可以是字符串、字典或可调用对象random_state: 随机种子,确保实验可重复性kmeans_args: 传递给KMeans聚类的参数smote_args: 传递给SMOTE过采样的参数imbalance_ratio_threshold: 聚类不平衡比率阈值density_power: 用于计算聚类内少数类样本密度的参数use_minibatch_kmeans: 是否使用MiniBatchKMeansn_jobs: 并行作业数
核心方法
_cluster(self, X): 使用K-Means算法对数据集进行聚类
**_filter_clusters(self, X, y, cluster_assignment, minority_class_label): 确定每个聚类的采样权重
_fit_resample(self, X, y): 执行重采样操作,返回重采样后的数据
使用示例
基础使用
import numpy as np
from imblearn.datasets import fetch_datasets
from kmeans_smote import KMeansSMOTE
# 加载不平衡数据集
datasets = fetch_datasets(filter_data=['oil'])
X, y = datasets['oil']['data'], datasets['oil']['target']
# 查看原始数据分布
[print('Class {} has {} instances'.format(label, count))
for label, count in zip(*np.unique(y, return_counts=True))]
# 创建KMeansSMOTE实例并执行过采样
kmeans_smote = KMeansSMOTE(
kmeans_args={
'n_clusters': 100
},
smote_args={
'k_neighbors': 10
}
)
X_resampled, y_resampled = kmeans_smote.fit_sample(X, y)
# 查看过采样后的数据分布
[print('Class {} has {} instances after oversampling'.format(label, count))
for label, count in zip(*np.unique(y_resampled, return_counts=True))]
参数配置示例
# 使用常规KMeans(非MiniBatch)
kmeans_smote = KMeansSMOTE(
random_state=42,
use_minibatch_kmeans=False,
kmeans_args={'n_clusters': 50},
smote_args={'k_neighbors': 5}
)
算法特性与优势
极限情况处理
KMeans-SMOTE 实现了SMOTE和随机过采样作为极限情况,可通过以下配置实现:
- SMOTE行为:
imbalance_ratio_threshold=float('Inf'), kmeans_args={'n_clusters':1} - 随机过采样行为:
imbalance_ratio_threshold=float('Inf'), kmeans_args={'n_clusters':1}, smote_args={'k_neighbors':0}
多类别支持
算法完全支持多类别不平衡数据集的过采样处理,可以为不同的少数类设置不同的不平衡比率阈值。
测试与验证
项目提供了完整的测试套件,涵盖以下测试场景:
- 基础功能测试: 验证默认参数下的算法正确性
- 多类别测试: 验证多类别数据集的处理能力
- 极限情况验证: 确保与SMOTE和随机过采样的兼容性
- 向后兼容性测试: 确保旧版本参数的正常使用
应用场景
KMeans-SMOTE 特别适用于以下场景:
- 金融风控: 欺诈检测中的少数类样本增强
- 医疗诊断: 罕见疾病病例的数据平衡
- 工业制造: 缺陷产品预测中的样本优化
性能优化建议
- 聚类数量设置: 根据数据集规模合理设置聚类数量
- 邻居参数调整: 根据数据特征优化k_neighbors值
- 密度功率参数: 利用density_power参数控制样本生成密度
通过使用KMeans-SMOTE,您可以有效解决机器学习中的类别不平衡问题,提升模型在少数类上的识别性能。算法的智能聚类机制确保生成的合成样本具有高质量和代表性,避免引入噪声数据。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



