Keras多分类模型类别权重设置及独热编码标签适配问题
嘿,这个问题其实比你想的要简单——Keras在处理categorical_crossentropy和类别权重的时候,根本不需要你把字典的键改成独热编码格式!我来给你捋清楚怎么操作:
首先,你用class_weight.compute_class_weight得到的是一个数组,比如针对你的三类(Neutral、Negative、Positive,对应索引0、1、2),返回的会是类似[w_neutral, w_negative, w_positive]的权重数组。这时候你只需要把这个数组转换成以原始类别索引为键的字典就行,Keras内部会自动把独热编码标签和这些索引对应起来。
具体代码修改很简单:
from sklearn.utils import class_weight import numpy as np # 计算类别权重数组 class_weights_array = class_weight.compute_class_weight( class_weight='balanced', classes=np.unique(y_train), y=y_train ) # 转成以类别索引为键的字典 class_weights_tobalance = dict(enumerate(class_weights_array))
为什么这样可行?因为当你的标签是独热编码格式时,Keras会自动识别每个样本独热向量中1所在的位置,对应到类别索引(比如[1,0,0]对应索引0,[0,1,0]对应索引1),然后用字典里对应索引的权重来计算损失。完全不需要你去修改键的格式,Keras已经帮你做好了适配!
举个实际的例子:如果你的y_train里原始标签是0(Neutral)、1(Negative)、2(Positive),计算出来的权重数组是[0.5, 2.0, 1.5],那转成字典后就是{0:0.5, 1:2.0, 2:1.5}。当模型处理一个独热标签为[0,1,0]的样本时,就会用权重2.0来计算这个样本的损失,完美解决类别不平衡的问题。
最后你可以打印一下class_weights_tobalance确认结构,确保键是0、1、2这三个整数,值是对应的权重数值,然后直接传入fit函数的class_weight参数就可以了。
备注:内容来源于stack exchange,提问作者Rodrigo Lemos

