对于大约20,000个文本数据集,真假样本为5,000对1,5000。使用Keras和Theano构建的双通道textCNN进行分类。F1评分是评价指标。F1评分不差,而混淆矩阵显示真实样本的准确度相对较低(~40%)。但是,准确地预测真实样品是非常重要的。因此,需要设计一个自定义的二值交叉熵损失函数来增加错误分类真样本的权重,使模型更加注重对真实样本的准确预测。
以错误分类样本为重点的成本敏感损失函数的样本代码为:
def w_categorical_crossentropy(y_true, y_pred, weights):
nb_cl = len(weights)
final_mask = K.zeros_like(y_pred[:, 0])
y_pred_max = K.max(y_pred, axis=1)
y_pred_max = K.reshape(y_pred_max, (K.shape(y_pred)[0], 1))
y_pred_max_mat = K.equal(y_pred, y_pred_max)
for c_p, c_t in product(range(nb_cl), range(nb_cl)):
final_mask += (weights[c_t, c_p] * y_pred_max_mat[:, c_p] * y_true[:, c_t])
return K.categorical_crossentropy(y_pred, y_true) * final_mask实际上,一个用Keras和Theano实现的用于二进制分类的自定义丢失函数(侧重于错误分类的样本)对于不平衡的数据集是非常重要的。请帮助解决这个问题。谢谢!
发布于 2019-04-19 07:02:16
当我不得不处理keras中的不平衡数据集时,我要做的是首先计算每个类的权重,并在训练期间将它们传递给模型实例。这个看起来会是这样的:
from sklearn.utils import compute_class_weight
w = compute_class_weight('balanced', np.unique(targets), targets)
# here I am adding only two categories with their corresponding weights
# you can spin a loop or continue by hand until you include all of your categories
weights = {
np.unique(targets)[0] : w[0], # class 0 with weight 0
np.unique(targets)[1] : w[1] # class 1 with weight 1
}
# then during training you do like this
model.fit(x=features, y=targets, {..}, class_weight=weights)我相信这会解决你的问题。
https://stackoverflow.com/questions/55729063
复制相似问题