【问题标题】:How can I generate binary classification dataset and control the overlapping between 2 classes?如何生成二进制分类数据集并控制 2 个类之间的重叠?
【发布时间】:2021-05-26 06:01:13
【问题描述】:

是否可以在使用 sklearn.datasets.make_classification 生成数据集时控制重叠?

我想在 2 个类之间传递重叠百分比,它会根据给定的百分比重叠类。

具体要求是: 生成一个 n 类分类数据集(高斯方式),我们可以通过添加协方差、重叠百分比以及对角线、直线、水平线等绘图形状来控制它

【问题讨论】:

    标签: python machine-learning classification


    【解决方案1】:

    make_classification 从 n 维超立方体中抽取样本。在特定情况下,您可以通过调整class_sep 参数来实现“根据给定百分比重叠类”之类的东西,但我认为它一般不会起作用。

    一种解决方案可能是通过从具有已知均值和方差的高斯分布中采样来创建二进制分类数据集。这是一个简短的演示:

    import numpy as np
    from numpy.random import default_rng
    import matplotlib.pyplot as plt
    
    rng = default_rng()
    
    N_POINTS = 10000
    SCALE = 1.3
    
    train_data = np.c_[
        np.r_[rng.normal(5, SCALE, (N_POINTS, 2)), rng.normal(10, SCALE, (N_POINTS, 2))],
        np.r_[np.zeros((N_POINTS, 1)), np.ones((N_POINTS, 1))],
    ]
    
    # Plotting
    fig1, ax = plt.subplots()
    ax.scatter(train_data[:, 0], train_data[:, 1], c=train_data[:, 2])
    ax.set_box_aspect(1)
    plt.show()
    

    这是一个例子,SCALE = 0.5:

    ...这是一个例子,SCALE = 1.3:

    rng.normal 生成的样本通常应与我们在(5, 5)(10, 10) 找到的平均值相差两个标准差。

    更改SCALE 参数,知道您的平均值之间的距离约为 7.071,并且知道您的数据应该落在哪里的预期半径——应该让您估计您期望在您的类之间有多少重叠。

    完成此操作后,您可以将您的发现转换回sklearn.datasets.make_blobs 的参数

    【讨论】:

    • 非常感谢您对我的帮助。很抱歉,我没有包含生成不平衡数据所需的更多细节。我在您的代码中尝试了一些技巧,但它不起作用。你能建议点什么吗?我想根据给定的权重改变一个类中的多个实例。
    • 您可以从不平衡学习包 (imbalanced-learn.org/stable/references/generated/…) 中查看make_imbalance
    • 谢谢@Alexander。很有帮助。
    猜你喜欢
    • 2021-03-01
    • 2021-06-30
    • 2012-07-05
    • 2018-09-13
    • 2019-05-21
    • 2021-11-10
    • 2016-07-31
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多