【问题标题】:Sentiment analysis using LSTM on imbalanced citation dataset在不平衡引文数据集上使用 LSTM 进行情感分析
【发布时间】:2019-11-24 22:44:37
【问题描述】:

我有一个非常不平衡的情绪分类数据集。 https://cl.awaisathar.com/citation-sentiment-corpus/

  • 积极类:829
  • 否定类:280
  • 中性类:7627

这是我的网络:

Sentiment_LSTM(
  (embedding): Embedding(5491, 400)
  (lstm): LSTM(400, 512, num_layers=2, batch_first=True, dropout=0.5)
  (dropout): Dropout(p=0.5, inplace=False)
  (fc): Linear(in_features=512, out_features=3, bias=True)
  (sig): Sigmoid()
)

损失函数:

lr=0.001

criterion = nn.BCELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=lr)

我在小班上的准确率很低。我该如何进一步改进它?

【问题讨论】:

  • 你能写几句关于数据集的事吗?小班是什么意思?
  • @Jindřich 积极类:829 消极类:280 中性类:7627。这是班级分布。现在,当我在测试数据集上测试我的网络时。大部分准确度由 Neutral 类控制。小类(pos 和 neg)不太准确。

标签: nlp pytorch lstm sentiment-analysis


【解决方案1】:

我会尝试使用 softmax 而不是 三个 sigmoid。使用 sigmoid,您可以对三个条件独立分布进行建模。这并不是你真正想要的,因为评论可以是正面的、中性的或负面的,但不能同时是正面和中性的——它们根本不是独立的。使用 softmax,概率分布将分布在三个类别中,模型可能会更好地理解,积极意味着同时不保持中立。

还要注意,对于 softmax,您需要使用 NLLLossCrossEntropyLoss 而不是 BCELoss

如果这还不够,你可以给损失添加权重,这样正面和负面的评论在训练中会更加突出。为此,您需要自己减少损失。设置reduction='none',这样你就不会得到一个数字,而是一个损失值向量,批次中的每个样本都有一个。然后你可以将它与一个权重向量相乘(我首先将中性权重设置为 0.5,将其他两个权重设置为 1)。然后,您只需在张量上调用 mean 方法即可平均损失。

【讨论】:

  • 我将其替换为以下网络结构。 Sentiment_LSTM( (embedding): Embedding(19612, 400) (lstm): LSTM(400, 512, num_layers=2, batch_first=True, dropout=0.5) (dropout): Dropout(p=0.5, inplace=False) (fc ): 线性(in_features=512, out_features=3, bias=True) )
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 2018-03-27
  • 2017-11-07
  • 1970-01-01
  • 2011-02-07
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多