You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为不平衡数据集确定class_weights?附标签统计数据

关于class_weights的确定依据与具体设置

嘿,这个问题我太熟悉了!处理类别不平衡的数据集时,class_weight的设置核心就是给样本量少的类别更高的权重,避免模型被占比极高的类别带偏。下面分两部分给你讲清楚:

一、确定class_weights的核心依据

  • 逆频率权重(行业标准做法):权重与类别的样本数量成反比,公式为 权重 = 总样本数 / (类别总数 × 该类样本数)。这样能让模型在训练时,对少数类的错误给予更严厉的惩罚,平衡各类别对模型的影响。
  • 业务场景自定义:如果你的业务里某些类别优先级更高(比如医疗诊断中阳性样本漏检代价远高于误判),可以在逆频率基础上手动调高这类别的权重,但一般先从逆频率开始尝试。
  • 自动计算工具:sklearn的compute_class_weight函数可以自动帮你生成逆频率权重,传入class_weight='balanced'就行,不用手动算,省心又准确。

二、针对你的数据集计算具体权重

先算总样本数:47213 + 2096 + 2021 + 737 + 176 = 52243,类别总数是5个。按照逆频率公式计算每个标签的权重:

  • label 0:52243/(5×176) ≈ 59.37
  • label 1:52243/(5×737) ≈ 14.18
  • label 2:52243/(5×47213) ≈ 0.22
  • label 3:52243/(5×2096) ≈ 4.99
  • label 4:52243/(5×2021) ≈ 5.17

三、代码里的两种设置方式

方式1:手动定义字典

直接把计算好的权重写成字典传入:

class_weight = {
    0: 59.37,
    1: 14.18,
    2: 0.22,
    3: 4.99,
    4: 5.17
}
# 传入训练函数
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32, class_weight=class_weight)

(权重可以近似取整,比如0用59、1用14,对模型效果影响很小)

方式2:用sklearn自动生成(推荐)

不用手动计算,工具自动适配数据集:

from sklearn.utils.class_weight import compute_class_weight
import numpy as np

# 提取训练集的唯一标签
unique_labels = np.unique(Y_train)
# 自动计算balanced权重
class_weights_array = compute_class_weight(
    class_weight='balanced',
    classes=unique_labels,
    y=Y_train
)
# 转成Keras需要的字典格式
class_weight = dict(zip(unique_labels, class_weights_array))

# 传入训练
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32, class_weight=class_weight)

这个方法更灵活,后续数据集调整时不用重新手动计算,直接跑代码就行。

内容的提问来源于stack exchange,提问作者Tom J Muthirenthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:48:58