首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Keras和Theano处理文本分类中的不平衡数据集

用Keras和Theano处理文本分类中的不平衡数据集
EN

Stack Overflow用户
提问于 2019-04-17 13:48:54
回答 1查看 600关注 0票数 0

对于大约20,000个文本数据集,真假样本为5,000对1,5000。使用Keras和Theano构建的双通道textCNN进行分类。F1评分是评价指标。F1评分不差,而混淆矩阵显示真实样本的准确度相对较低(~40%)。但是,准确地预测真实样品是非常重要的。因此,需要设计一个自定义的二值交叉熵损失函数来增加错误分类真样本的权重,使模型更加注重对真实样本的准确预测。

  • 尝试了class_weight与model.fit方法的学习,但由于权重适用于所有样本,而不是错误分类的样本,所以效果不太好。
  • 尝试并修正了本文提出的方法:https://github.com/keras-team/keras/issues/2115,但损失函数是绝对交叉熵,对二值分类问题不适用。尝试将损失函数修改为二进制函数,但在输入维数方面遇到了一些问题。

以错误分类样本为重点的成本敏感损失函数的样本代码为:

代码语言:javascript
复制
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实现的用于二进制分类的自定义丢失函数(侧重于错误分类的样本)对于不平衡的数据集是非常重要的。请帮助解决这个问题。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-04-19 07:02:16

当我不得不处理keras中的不平衡数据集时,我要做的是首先计算每个类的权重,并在训练期间将它们传递给模型实例。这个看起来会是这样的:

代码语言:javascript
复制
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)

我相信这会解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55729063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档