如何为不平衡数据集确定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
相关产品推荐
相关产品推荐

