不均衡数据集采样2——BorderlineSMOTE算法(过采样)

论文:Borderline-SMOTE: A New Over-Sampling Method in Imbalanced Data Sets Learning
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.308.9315&rep=rep1&type=pdf

Borderline Smote 算法只过采样小样本数据的边界

算法思路:

  1. 从小样本出发,计算小样本点 p p p的k近邻的全部样本,如果:
  • 全是其他类别的样本点,则这个点是噪声(noise),不管了
  • 一半以上,但非全部是其他类别的样本点,则为DANGER(危险)点,论文中认为这部分是容易被错误分类的点,在这些点周围生成数据
  • 一半以下是其他类别的样本点,意味着这个点是安全的,不管了
  1. 对于DANGER(危险)点,按照SMOTE的思路(可以参考:https://blog.csdn.net/weixin_35757704/article/details/121927100)在线段上随机生成数据

示例代码

import pandas as pd
from imblearn.over_sampling import BorderlineSMOTE


def get_dataset():
    from sklearn.datasets import make_classification
    data_x, data_y = make_classification(n_samples=1000, n_classes=2, n_features=6, n_informative=4,
                                         random_state=0)  # 2个特征
    data_x = pd.DataFrame(data_x)
    data_x.columns = ['x1', 'x2', 'x3', 'x4', 'x5', 'x6']
    data_y = pd.Series(data_y)
    # 删除部分数据:删除100个label为0的数据
    drop_index = data_y[data_y == 0].sample(100).index
    data_y = data_y.drop(drop_index)
    data_x = data_x.drop(drop_index)
    return data_x, data_y


if __name__ == '__main__':
    x_data, y_data = get_dataset()  # 获取数据源
    # 生成数据
    smote_data = BorderlineSMOTE().fit_resample(x_data, y_data.values)
    new_x_data = smote_data[0]  # 新的x
    new_y_data = smote_data[1]  # 新的y

你可能感兴趣的:(特征工程,python,机器学习,算法,机器学习)