我正在处理一个带有不平衡类的顺序标记问题,并且希望使用sample_weight
来解决不平衡问题。基本上,如果我训练模型大约10个时期,就会获得很好的结果。如果我训练更多时期,val_loss
一直在下降,但是结果变得更差。我猜测模型只是检测到更多优势类别,对较小的类别产生了负面影响。
该模型有两个输入,用于词嵌入和字符嵌入,输入是从0到6的7种可能的类之一。
使用填充后,用于单词嵌入的输入层的形状为(3000, 150)
,用于单词嵌入的输入层的形状为(3000, 150, 15)
。我将测试数据和训练数据分割成0.3比例,这意味着用于单词嵌入的X_train
的形状是(2000, 150)
,用于字符嵌入的形状是(2000, 150, 15)
,y
包含每个单词的正确类别,编码为7维的one-hot向量,因此其形状为(3000, 150, 7)
。同样,y
也被分成训练和测试集。然后,每个输入都被送入双向LSTM中。
输出是一个矩阵,其中对2000个训练样本的每个单词分配了7个类别之一,因此大小为(2000, 150, 7)
。
起初,我尝试将sample_weight
定义为长度为7的np.array
,其中包含每个类别的权重:
count = [list(array).index(1) for arrays in y for array in arrays]
count = dict(Counter(count))
count[0] = 0
total = sum([count[key] for key in count])
count = {k: count[key] / total for key in count}
category_weights = np.zeros(7)
for f in count:
category_weights[f] = count[f]
但是我遇到了以下错误 ValueError: 发现了一个形状为(7,)的样本权重数组,而输入的形状为(2000, 150, 7)。无法广播样本权重。
查看文档,看起来我应该传递一个形状为样本数、序列长度的二维数组(a 2D array with shape (samples, sequence_length))
。因此,我创建了一个(3000, 150)
的数组,其中包含每个序列中每个单词的权重拼接:
weights = []
for sample in y:
current_weight = []
for line in sample:
current_weight.append(frequency[list(line).index(1)])
weights.append(current_weight)
weights = np.array(weights)
在compile()
中添加sample_weight_mode="temporal"
选项后,将其通过sample_weight
参数传递给fit()
函数。
起初我收到了一个维度错误的错误信息,然而在仅为训练样本生成权重之后,我得到了一个(2000, 150)
的数组,我可以用它来拟合我的模型。
- 这是定义sample_weights的正确方式吗,还是我完全错了?我不能说我注意到加入权重会有任何改进,所以我一定是错过了些什么。
sample_weight
有什么办法可以解决吗?你的问题是否与那里的原始帖子完全相同?你是否在这里发布过(因此我可以查看您的帖子并在那里回答/帮助)? - DarkCygnusfit_generator
(用于大数组)+sample_weight
(高度不平衡的目标)进行预测时存在一个不太奇怪的情况。 唯一的解决方法是使用平衡类别(抽样)来提供网络。 - Pablo Casassample_weight
,每个样本的权重都是1,不取决于频率。 - DarkCygnus_standardize_user_data
方法的第470行上。具体来说,是第625行...现在我正在阅读它,它会建议样本权重不再覆盖类别权重(第629行)。 - DarkCygnus