代码之家  ›  专栏  ›  技术社区  ›  Raven Cheuk

sklearn.datasets.make\u分类无法生成平衡类

  •  0
  • Raven Cheuk  · 技术社区  · 7 年前

    make_classification 从sklearn库为分类任务生成数据,我希望每个类正好有4个样本。

    如果类数小于19,则行为正常。

    from sklearn.datasets import make_blobs, make_classification
    import numpy as np
    data = make_classification(n_samples=76, n_features=5, n_informative=5, n_redundant=0, n_repeated=0, 
                               n_classes=19, n_clusters_per_class=1, weights=None, flip_y=0, class_sep=1.0, 
                               shuffle=False, random_state=101)
    print(data[1])
    [ 0  0  0  0  1  1  1  1  2  2  2  2  3  3  3  3  4  4  4  4  5  5  5  5
      6  6  6  6  7  7  7  7  8  8  8  8  9  9  9  9 10 10 10 10 11 11 11 11
     12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17
     18 18 18 18]
    

    data = make_classification(n_samples=80, n_features=5, n_informative=5, n_redundant=0, n_repeated=0, 
                               n_classes=20, n_clusters_per_class=1, weights=None, flip_y=0, class_sep=1.0, 
                               shuffle=False, random_state=101)
    print(data[1])
    [ 0  0  0  0  0  1  1  1  1  2  2  2  2  3  3  3  3  4  4  4  4  5  5  5
      5  6  6  6  6  7  7  7  7  8  8  8  8  9  9  9  9 10 10 10 10 11 11 11
     11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17
     17 18 18 18 18 19 19 19]
    

    weight 论点是控制 classes

    weights :浮动列表或无(默认值=无)

    分配给每个类别的样本比例。如果没有,那么 班级是平衡的。注意,如果len(weights)==n\u classes-1,那么 将自动推断最后一个类的权重。超过n个样本 如果重量之和超过1,则可退回样品。

    因此,我尝试使用以下代码显式输入比例。

    data = make_classification(n_samples=80, n_features=5, n_informative=5, n_redundant=0, n_repeated=0, 
                               n_classes=20, n_clusters_per_class=1, weights=list(np.ones(20)), flip_y=0, class_sep=1.0, 
                               shuffle=False, random_state=101)
    print(data[1])
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0]
    

    我不知道为什么这个函数会这样。如何保证班级均衡时 n_classes

    1 回复  |  直到 7 年前
        1
  •  2
  •   Vivek Kumar    7 年前

    weights 要求样品的“比例”。它不会自动将数字转换为比例。

    因此,如果总样本数=80,并且要将40个样本分配给类1,则比例变为 0.5

    但是,您提供的比例如下:

    [1.0, 1.0, 1.0, 1.0,.................., 1.0, 1.0, 1.0, 1.0]
    

    这样做:

    n_classes = 20
    weights=list(np.ones(20)/n_classes)  <== Making proportions correct
    
    data = make_classification(n_samples=80, n_features=5, n_informative=5, n_redundant=0, n_repeated=0, 
                               n_classes=n_classes, n_clusters_per_class=1, weights=weights, flip_y=0, class_sep=1.0, 
                               shuffle=False, random_state=101)
    

    正确返回:

    array([ 0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,  4,
            4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,
            8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12,
           12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16,
           17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19])
    

    最后一行:

    如果权重之和超过1,则可以返回n个以上的样本。

    似乎增加了混乱。

    当你经过的时候 1.0 作为所有类的比例,那么它应该返回80*20=1600个样本,每个类返回80个。

    n_samples 参数)。这就是为什么在生成的数据中只得到一个类(0)。您应该将此作为一个问题发布在github的页面上: https://github.com/scikit-learn/scikit-learn/issues