如何定义多类文本数据集(fastai)的日志计数比?

Posted

技术标签:

【中文标题】如何定义多类文本数据集(fastai)的日志计数比?【英文标题】:How to define log-count ratio for multiclass text dataset (fastai)? 【发布时间】:2020-04-21 04:41:27 【问题描述】:

我正在尝试使用朴素贝叶斯遵循 Rachel Thomas 的情感分类路径。在视频中,她使用了一个二进制数据集(正反电影评论)。在应用朴素贝叶斯时,this is what she does:

定义:log-count ratio r for each word f:

r = log (ratio of feature f in positive documents) / (ratio of feature f in negative documents)

其中特征 $f$ 在正例文档中的比率是正例文档具有特征的次数除以正例文档的数量。

p1 = np.squeeze(np.asarray(x[y.items==positive].sum(0)))
p0 = np.squeeze(np.asarray(x[y.items==negative].sum(0)))

pr1 = (p1+1) / ((y.items==positive).sum() + 1)
pr0 = (p0+1) / ((y.items==negative).sum() + 1)

r = np.log(pr1/pr0)

--> 将 log-count-ratio 应用于具有 2 个标签的数据集非常简单!

问题: 我的数据集不是二进制的!假设我有 5 个标签:label_1,...,label_5

如何获得多标签数据集的日志计数比率 r?

我的方法:

p4 = np.squeeze(np.asarray(x[y.items==label_5].sum(0)))
p3 = np.squeeze(np.asarray(x[y.items==label_4].sum(0)))
p2 = np.squeeze(np.asarray(x[y.items==label_3].sum(0)))
p1 = np.squeeze(np.asarray(x[y.items==label_2].sum(0)))
p0 = np.squeeze(np.asarray(x[y.items==label_1].sum(0)))

log-count-ratio:
pr1 = (p1+1) / ((y.items==label_2).sum() + 1)
pr1_not = (p1+1) / ((y.items!=label_2).sum() + 1)
r_1 = np.log(pr1/pr1_not)

log-count-ratio:
pr2 = (p2+1) / ((y.items==label_3).sum() + 1)
pr2_not = (p2+1) / ((y.items!=label_3).sum() + 1)
r_2 = np.log(pr2/pr2_not)
...

这是正确的吗?这是否意味着我得到了多个比率?

【问题讨论】:

【参考方案1】:

是的,这是正确的。 “负类”基本上是除您正在考虑的一类之外的所有类。所以是的,您将获得多个比率(与您拥有的课程数量一样多)。

【讨论】:

【参考方案2】:

来自https://marvinlsj.github.io/2018/11/23/NBSVM%20for%20sentiment%20and%20topic%20classification/ , log-count-ratio 是从 Posterior prob ratio 派生的,这有利于比较 2 个类以深入了解哪个是最可能的。我猜你正在尝试为多类问题做一对一的方法。这将最终得到 5x4/2=10 对比率进行分类。如果您只想进行分类,我们通常会为每个类计算后验概率并选择最好的。因此,在您的情况下,您只需从 sum(log(p1))、sum(log(p2))、...、sum(log(p5)) 中选择最佳值。

【讨论】:

以上是关于如何定义多类文本数据集(fastai)的日志计数比?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理多类文本分类中不在训练集中的测试集标签?

SVM 多类文本分类

如何对多类数据集进行二分类?

如何对不平衡的多类数据集进行欠采样? (Python)

如何在多类文本分类问题中平衡数据?

基于图像和文本特征的 TensorFlow 训练模型,具有多类输出