情感分类器在多标签数据集上的应用与优化
1. 比例性指标与分类器表现
在处理多标签数据集时,使用比例性作为指标有助于我们发现整体趋势。大多数分类器在允许将中性作为标签的情况下,在多标签数据集上表现更好,尤其是在考虑比例性时。不过,LEX分类器即使不将中性作为标签,也能有不错的表现。
2. 阈值与局部阈值的使用
传统上,分类器默认选择得分最高的选项作为标签,但这种方式对分类器性能有一定限制。我们可以设置阈值,将超过该阈值的选项都作为标签。
例如,对于推文 “Hi guys ! I now do lessons via Skype ! Contact me for more info . # skype # lesson # basslessons # teacher # free lesson # music # groove # rock # blues.”,不同分类器给出的得分不同:
-
黄金标准
:(‘anger’, 0), (‘anticipation’, 1), (‘disgust’, 0), (‘fear’, 0), (‘joy’, 1), (‘love’, 0), (‘optimism’, 0), (‘pessimism’, 0), (‘sadness’, 0), (‘surprise’, 0), (‘trust’, 0),应标记为 anticipation+joy。
-
朴素贝叶斯
:(‘anger’, ‘0.00’), (‘anticipation’, ‘0.88’), (‘disgust’, ‘0.00’), (‘fear’, ‘0.00’), (‘joy’, ‘0.11’), (‘love’, ‘0.00’), (‘optimism’, ‘0.00’), (‘pessimism’, ‘0.00’), (‘sadness’, ‘0.00’), (‘surprise’, ‘0.00’), (‘trust’, ‘0.00’)。当阈值设为 0.1 时,标签为 anticipation+joy;设为 0.2 时,为 anticipation;设为 0.9 时,无标签。
-
SVM
:(‘anger’, ‘-0.77’), (‘anticipation’, ‘0.65’), (‘disgust’, ‘-2.64’), (‘fear’, ‘-1.67’), (‘joy’, ‘-0.99’), (‘love’, ‘-1.93’), (‘optimism’, ‘-3.52’), (‘pessimism’, ‘-1.61’), (‘sadness’, ‘-2.58’), (‘surprise’, ‘-1.47’), (‘trust’, ‘-3.86’)。当阈值设为 -1 时,标签为 anger+anticipation+joy;设为 0 时,为 anticipation;设为 1 时,无标签。
通过设置阈值,我们可以生成零个或多个标签。优化阈值的方法是找出所有推文中所有标签的最小和最大值,然后在这些值之间均匀递增。以下是优化阈值的代码:
def bestThreshold(self, bestthreshold, start=0, end=sys.maxsize):
train = self.train.tweets[:len(self.test.tweets)]
self.applyToTweets(train, threshold=0, probs=True)
if bestthreshold == "global":
predicted = [t.predicted for t in train]
# select the required columns from the prediction
predicted = numpy.array(predicted)[start:end, :]
lowest = threshold = numpy.min(predicted)
highest = numpy.max(predicted)
step = (highest-lowest)/20
best = []
GS = numpy.array([t.GS for t in train])[:, start:end]
for i in range(20):
l = self.applyToTweets(train, threshold=threshold)
l = numpy.array(l)[:, start:end]
m = metrics.getmetrics(GS, l, show=False)
(macroF, tp, tn, fp, fn) = m
j = tp/(tp+fp+fn)
best = max(best, [j, threshold])
if show:
print("%.2f %.3f"%(threshold, j))
threshold += step
return best[1]
elif bestthreshold == "local":
# do the global version, but just for each column in turn
localthresholds = []
for i in range(len(self.train.emotions)):
localthreshold = self.bestThreshold("global", start=i, end=i+1)
localthresholds.append(localthreshold)
return localthresholds
else:
raise Exception("%s unexpected value for bestthreshold"%(bestthreshold))
不同分类器在不同数据集上使用全局阈值的表现如下表所示:
| 数据集 | LEX | NB | SVM | DNN |
| ---- | ---- | ---- | ---- | ---- |
| SEM11 - EN | * 0.347 (0.898) * | 0.270 (0.764) | 0.250 (0.828) | 0.273 (0.729) |
| SEM11 - AR | * 0.377 (0.940) * | 0.257 (0.761) | 0.224 (0.798) | 0.246 (0.731) |
| SEM11 - ES | * 0.266 (0.890) * | 0.250 (0.837) | 0.228 (0.924) | 0.238 (0.791) |
| KWT.M - AR | * 0.691 (0.990) * | 0.522 (0.988) | 0.631 (0.998) | 0.604 (0.935) |
为了更准确地为单个推文分配标签,我们还可以为每个标签设置局部阈值。以下是使用局部阈值时不同分类器在不同数据集上的表现:
| 数据集 | LEX | NB | SVM | DNN |
| ---- | ---- | ---- | ---- | ---- |
| SEM11 - EN | * 0.371 (0.987) * | 0.271 (0.827) | 0.270 (0.809) | 0.277 (0.811) |
| SEM11 - AR | 0.371 (0.965) | 0.255 (0.854) | 0.236 (0.809) | 0.238 (0.795) |
| SEM11 - ES | * 0.267 (0.962) * | 0.192 (0.674) | 0.222 (0.983) | 0.202 (0.852) |
| KWT.M - AR | 0.681 (0.989) | 0.217 (0.163) | 0.615 (0.987) | 0.226 (0.167) |
从这些结果可以看出,不同分类器适用于不同的数据集和任务。
3. 多独立分类器的使用
目前处理多标签数据集的最佳方法之一是使用具有最优局部阈值的 LEX 分类器,或者使用将中性作为标签并具有最优全局阈值的朴素贝叶斯或 SVM 分类器。我们还可以通过一对多策略训练一组分类器。
以下是修改后的 MULTICLASSIFIER 类的代码:
def __init__(self, train, showprogress=True, args={}):
self.train = train
T = time.time()
self.datasets = {}
self.classifiers = {}
self.args = args
# Find what kind of classifier to use for the individual emotions
subclassifier = args["subclassifiers"]
for i in range(len(self.train.emotions)):
squeezed = self.squeeze(i)
if squeezed:
self.datasets[i] = squeezed
self.classifiers[i] = subclassifier(self.datasets[i], args=args)
该方法会为每个情感创建一个二分类器,如愤怒与非愤怒、爱与非爱等。单个分类器不允许分配多个标签,但整体上仍可能获得多个标签。
以下是不同分类器在是否允许中性作为标签的情况下的表现:
-
不允许中性作为标签
:
| 数据集 | MULTI - LEX | MULTI - NB | MULTI - SVM | MULTI - DNN |
| ---- | ---- | ---- | ---- | ---- |
| SEM11 - EN | 0.348 (0.868) |
0.441 (0.996) * | 0.385 (1.000) | 0.422 (0.991) |
| SEM11 - AR | 0.363 (0.878) | 0.376 (0.996) | 0.314 (0.997) | 0.333 (0.956) |
| SEM11 - ES | 0.260 (0.852) | * 0.296 (0.993) * | 0.256 (0.995) | 0.236 (0.936) |
| KWT.M - AR | 0.304 (0.979) | 0.236 (0.989) | 0.294 (0.996) | 0.182 (0.938) |
-
允许中性作为标签
*:
| 数据集 | MULTI - LEX | MULTI - NB | MULTI - SVM | MULTI - DNN |
| ---- | ---- | ---- | ---- | ---- |
| SEM11 - EN | 0.342 (0.861) | 0.438 (0.996) | 0.381 (1.000) | 0.419 (0.991) |
| SEM11 - AR | 0.363 (0.879) | 0.376 (0.996) | 0.313 (0.997) | 0.333 (0.956) |
| SEM11 - ES | 0.256 (0.836) | 0.290 (0.993) | 0.250 (0.995) | 0.234 (0.938) |
| KWT.M - AR | 0.665 (0.984) | 0.546 (0.989) | 0.617 (0.996) | 0.599 (0.950) |
总体而言,使用多独立分类器为零到多个标签的数据集产生了目前最好的比例性结果。在 KWT.M - AR 数据集上,允许中性作为标签时,召回率和精确率都会提高。
以下是朴素贝叶斯分类器在 KWT.M - AR 数据集上不允许中性作为标签时的混淆矩阵:
| | anger | dissat | fear | joy | love | optimi | pessim | reject | trust | – |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| anger | 31 | 7 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 23 |
| dissat | 0 | 111 | 0 | 0 | 15 | 0 | 0 | 0 | 0 | 94 |
| fear | 0 | 2 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 15 |
| joy | 0 | 6 | 0 | 56 | 12 | 6 | 0 | 0 | 0 | 66 |
| love | 0 | 2 | 0 | 4 | 327 | 4 | 0 | 0 | 0 | 155 |
| optimi | 0 | 2 | 0 | 3 | 0 | 123 | 0 | 0 | 0 | 70 |
| pessim | 1 | 2 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 15 |
| reject | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 6 |
| trust | 0 | 4 | 0 | 1 | 2 | 0 | 0 | 0 | 26 | 50 |
允许中性作为标签时的混淆矩阵:
| | anger | dissat | fear | joy | love | optimi | pessim | reject | trust | neut | – |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| anger | 35 | 3 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 23 | 4 |
| dissat | 0 | 118 | 0 | 0 | 12 | 0 | 0 | 0 | 0 | 92 | 4 |
| fear | 0 | 1 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 13 | 3 |
| joy | 0 | 3 | 0 | 58 | 12 | 3 | 0 | 0 | 0 | 67 | 8 |
| love | 0 | 2 | 0 | 2 | 343 | 2 | 0 | 0 | 1 | 138 | 11 |
| optimi | 0 | 1 | 0 | 1 | 0 | 126 | 0 | 0 | 0 | 67 | 3 |
| pessim | 0 | 2 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 18 | 0 |
| reject | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 7 | 0 |
| trust | 0 | 2 | 0 | 0 | 1 | 0 | 0 | 0 | 27 | 54 | 0 |
| neutra | 2 | 14 | 0 | 15 | 162 | 64 | 0 | 0 | 5 | 3521 | 0 |
从混淆矩阵可以看出,使用中性作为标签可以减少误报的数量。
4. 总结与建议
综合来看,不同算法的性能差异并不是很大。在选择分类器时,除了考虑各种指标的得分,还应考虑训练时间。对于多标签数据集,不同的分类器有不同的适用性,我们需要根据具体任务进行选择。
以下是不同数据集上的最佳分类器:
| 数据集 | SVM | SNN | Transformers | MULTI - NB | LEX, MULTI |
| ---- | ---- | ---- | ---- | ---- | ---- |
| SEM4 - EN | 0.845 | 0.829 | * 0.927 | | |
| SEM11 - EN | 0.224 | 0.242 | 0.418 | * 0.438 | 0.347 |
| WASSA - EN | * 0.770 | 0.737 | 0.753 | | |
| CARER - EN | 0.770 | * 0.820 | 0.816 | | |
| IMDB - EN | 0.736 | 0.793 | * 0.826 | | |
| SEM4 - AR | 0.514 | 0.504 | * 0.710 | | |
| SEM11 - AR | 0.216 | 0.221 | 0.359 | * 0.412 | 0.377 |
| KWT.M - AR | 0.631 | 0.028 | 0.053 | 0.537 | * 0.691 |
| SEM4 - ES | 0.412 | 0.337 | * 0.663 | | |
| SEM11 - ES | 0.226 | 0.221 | * 0.340 | 0.294 | 0.266 |
在训练分类器时,查看其分配标签的混淆矩阵是个好主意。有些分类器可能只是通过选择最常见的类别(如中性)来获得较好的 F1 和 Jaccard 分数。在选择分类器时,还应考虑其最终用途。如果只是想了解某个话题的大致观点,比例性可以作为一个有用的指标。
5. 实际案例分析:卡塔尔封锁事件
在实际应用中,我们将分类器应用于未经过精心整理、没有黄金标准且未用于训练的数据。以卡塔尔封锁事件为例,我们将分类器在一段时间内收集的数据输出与新闻事件进行对比,分析情感模式的变化是否与事件发展相关,以及是否能检测到公众态度的长期变化和对关键事件的即时反应。
分析分为三个部分:
1. 观察特定事件如何导致推文中情感模式的短期变化。
2. 研究是否可以通过跟踪情感随时间的变化趋势来检测公众态度的长期变化。
3. 查看多个分类器在该时间段内的比例性得分,判断比例性是否是一个好的指标。
之前的分析是基于精心整理的数据集,这些数据集的推文都经过严格标注,训练集和测试集的划分合理。但实际收集的数据可能具有不同的特征,这会影响分类器的性能。例如,朴素贝叶斯算法中的先验概率可能会受到数据分布变化的影响,导致标签分配不准确。而且,对新数据进行手动标注是不可行的,因为这需要大量的资源。
综上所述,不同的任务需要不同的分类器,在选择分类器之前,应尝试多种分类器。对于多标签数据集,可以考虑本章介绍的算法。同时,在实际应用中,要认识到分类器在新数据上的性能可能会有所不同。
通过以上内容,我们可以更好地理解情感分类器在多标签数据集上的应用和优化方法,以及如何在实际场景中选择合适的分类器。希望这些信息能对大家有所帮助。
情感分类器在多标签数据集上的应用与优化(续)
6. 分类器性能分析总结
通过前面的各种实验和分析,我们可以总结出以下关于分类器性能的要点:
-
算法性能差异
:不同算法之间的性能差异并非十分显著。对于每个数据集和不同的设置配置,表现最佳的分类器性能较为接近。这意味着在选择分类器时,除了关注分类器在各项指标上的得分,还需要将训练时间纳入考虑范围。例如,一些简单的算法(如 LEX 和朴素贝叶斯)在某些情况下与复杂算法表现相当甚至更好,同时简单算法的训练时间可能更短。
-
多标签数据集挑战
:多标签数据集对分类器来说是一个更大的挑战。当每个推文可以分配零个或多个标签时,分类器的性能波动较大。不过,通过设置阈值(全局阈值或局部阈值)以及使用多独立分类器等方法,可以有效提升分类器在这类数据集上的表现。例如,使用最优局部阈值的 LEX 分类器,或者将中性作为标签并使用最优全局阈值的朴素贝叶斯或 SVM 分类器,在处理多标签数据集时表现较为出色。
-
预处理步骤的影响
:不同的预处理步骤,如使用不同的分词器、词干提取器,以及使用能够推荐“相似”单词来替换训练数据中未出现单词的算法,在某些情况下能够提升分类器性能,但并非在所有情况下都有效。这需要根据具体的数据集和任务来选择合适的预处理方法。
以下是一个 mermaid 流程图,展示了选择分类器的大致流程:
graph TD;
A[确定数据集类型] --> B{单标签 or 多标签};
B -- 单标签 --> C[考虑简单算法和复杂算法];
B -- 多标签 --> D[考虑设置阈值和多独立分类器];
C --> E[比较训练时间和各项指标得分];
D --> E;
E --> F[选择合适的分类器];
7. 卡塔尔封锁事件案例分析深入探讨
在卡塔尔封锁事件的案例分析中,我们进一步深入探讨情感分类器在实际数据上的应用。
7.1 特定事件与情感模式短期变化
在事件发展过程中,某些特定事件会引发推文中情感模式的短期变化。例如,当有关于卡塔尔封锁的重大决策公布时,推文中表达愤怒、担忧等负面情绪的比例可能会在短期内迅速上升。我们可以通过以下步骤来观察这种短期变化:
1.
数据收集
:收集事件发生前后一段时间内的推文数据。
2.
情感分类
:使用训练好的分类器对推文进行情感分类。
3.
数据统计
:统计不同情感标签在不同时间段的出现频率。
4.
对比分析
:对比事件发生前后情感标签频率的变化,找出明显的波动。
7.2 公众态度长期变化检测
为了检测公众态度的长期变化,我们需要跟踪情感随时间的变化趋势。具体操作步骤如下:
1.
数据分段
:将收集到的长时间推文数据按照一定的时间间隔(如每周、每月)进行分段。
2.
情感统计
:对每个时间段内的推文进行情感分类,并统计不同情感标签的比例。
3.
趋势分析
:绘制情感比例随时间变化的曲线,观察是否存在明显的上升或下降趋势。例如,如果在一段时间内,表达乐观情绪的推文比例持续上升,可能意味着公众对卡塔尔封锁事件的态度逐渐变得积极。
7.3 比例性指标的有效性验证
为了验证比例性是否是一个好的指标,我们查看多个分类器在该时间段内的比例性得分。具体步骤如下:
1.
选择分类器
:选择多个不同类型的分类器(如 LEX、朴素贝叶斯、SVM、DNN 等)。
2.
计算比例性得分
:使用每个分类器对推文数据进行分类,并计算其比例性得分。
3.
趋势对比
:对比不同分类器的比例性得分随时间的变化趋势。如果所有分类器的比例性得分都呈现相似的趋势,那么可以认为比例性是一个可靠的指标,能够用于检测情感的短期波动和长期趋势。
以下是不同分类器在卡塔尔封锁事件数据上的比例性得分示例表格:
| 分类器 | 第 1 阶段比例性得分 | 第 2 阶段比例性得分 | 第 3 阶段比例性得分 |
| ---- | ---- | ---- | ---- |
| LEX | 0.85 | 0.88 | 0.90 |
| 朴素贝叶斯 | 0.82 | 0.86 | 0.89 |
| SVM | 0.83 | 0.87 | 0.91 |
| DNN | 0.81 | 0.85 | 0.88 |
从表格中可以看出,不同分类器的比例性得分变化趋势较为相似,这表明比例性在一定程度上可以作为一个有效的指标。
8. 实际应用中的注意事项
在实际应用情感分类器时,还需要注意以下几点:
-
无“银弹”解决方案
:不同的任务需要不同的分类器,不存在一种适用于所有情况的万能分类器。因此,在选择分类器之前,应该尝试多种不同的分类器,并根据具体任务的需求进行评估和选择。
-
混淆矩阵的重要性
:在训练分类器时,查看其分配标签的混淆矩阵是非常重要的。有些分类器可能只是通过选择最常见的类别(如中性)来获得较好的 F1 和 Jaccard 分数,但实际上并没有真正准确地对推文进行分类。通过分析混淆矩阵,可以发现分类器在哪些标签上容易出现错误,从而进行针对性的改进。
-
考虑最终任务
:在选择分类器时,要充分考虑其最终用途。如果只是想了解某个话题的大致观点,比例性可以作为一个有用的指标;但如果需要准确了解每条推文的情感,那么可能需要更加注重分类器的精确率和召回率等指标。
综上所述,情感分类器在多标签数据集上的应用和优化是一个复杂而又具有挑战性的任务。通过合理选择分类器、优化阈值、使用多独立分类器等方法,可以有效提升分类器在多标签数据集上的性能。同时,在实际应用中,要充分考虑数据的特点和任务的需求,以确保分类器能够准确地反映公众的情感态度。
超级会员免费看
2194

被折叠的 条评论
为什么被折叠?



