用于大型数据集的 sklearn utils compute_class_weight 函数

Posted

技术标签:

【中文标题】用于大型数据集的 sklearn utils compute_class_weight 函数【英文标题】:sklearn utils compute_class_weight function for large dataset 【发布时间】:2020-06-10 00:43:23 【问题描述】:

我正在对大约 20+ GB postgres db 中基于文本的分类数据 训练一个 tensorflow keras 序列模型,我需要为模型赋予类权重。 这就是我正在做的事情。

class_weights = sklearn.utils.class_weight.compute_class_weight('balanced', classes, y)

model.fit(x, y, epochs=100, batch_size=32, class_weight=class_weights, validation_split=0.2, callbacks=[early_stopping])

由于我无法将整个内容加载到内存中,我想我可以在 keras 模型中使用 fit_generator 方法。

但是我如何计算这些数据的类权重sklearn 没有为此提供任何特殊功能,是否适合此工具

我曾想过对多个随机样本进行此操作,但有没有更好的方法可以使用整个数据

【问题讨论】:

【参考方案1】:

您可以使用生成器,也可以计算类权重。

假设你有这样的生成器

train_generator = train_datagen.flow_from_directory(
        'train_directory',
        target_size=(224, 224),
        batch_size=32,
        class_mode = "categorical"
        )

训练集的类权重可以这样计算

class_weights = class_weight.compute_class_weight(
           'balanced',
            np.unique(train_generator.classes), 
            train_generator.classes)

[编辑 1] 由于您在 cmets 中提到了 postgres sql,因此我在此处添加了原型答案。

首先使用来自 postgres sql 的单独查询获取每个类的计数,并使用它来计算类权重。你可以手动计算。基本逻辑是权重最小的类的计数取值为 1,其余类根据与权重最小的类的相对计数得到

例如,您有 3 个类别 A、B、C 和 100,200,150,那么类别权重变为 A:1,B:0.5,C:0.66

在从 postgres sql 获取值后手动计算它。

[查询]

cur.execute("SELECT class, count(*) FROM table group by classes order by 1")
rows = cur.fetchall()

上述查询将返回具有从最低到最高排序的元组(类名,每个类的计数)的行。

然后下面的代码将创建类权重字典

class_weights = 
for row in rows:
    class_weights[row[0]]=rows[0][1]/row[1] 
    #dividing the least value the current value to get the weight, 
    # so that the least value becomes 1, 
    # and other values becomes < 1

【讨论】:

这个方法似乎是从目录名中获取类名。我正在处理文本数据。如果我编写自己的生成器来生成从 postgres 数据库连接读取的值,我需要遍历它们,但是 compute_class_weight 需要整个训练标签列表。有什么办法可以解决吗? 您应该在问题中提到过 postgres。如何向 postrges db 编写查询以获取每个类的计数? (select count(*) from table group by classes) 并获取结果并使用它来计算类权重?

以上是关于用于大型数据集的 sklearn utils compute_class_weight 函数的主要内容,如果未能解决你的问题,请参考以下文章

用于大型数据集的 Python defaultdict

用于存储大型数据集的数据结构 [关闭]

寻找用于清理/注释大型数据集的 python 数据结构

R中用于大型复杂调查数据集的方法?

pandas.concat 和 numpy.append 的大型数据集的内存错误

pandas.concat 和 numpy.append 的大型数据集的内存错误