为啥这个 TF-IDF 情感分析分类器表现这么好?

Posted

技术标签:

【中文标题】为啥这个 TF-IDF 情感分析分类器表现这么好?【英文标题】:Why is this TF-IDF sentiment analysis classifier performing so well?为什么这个 TF-IDF 情感分析分类器表现这么好? 【发布时间】:2019-05-21 11:13:15 【问题描述】:

Jupter Notebook

最后一个混淆矩阵用于测试集。这是逻辑回归过度拟合的情况吗?因为即使没有对文本进行太多预处理(包括表情符号、标点符号),准确性仍然非常好。好的有人提供一些帮助/建议吗?

【问题讨论】:

外部资源的链接可以澄清或背景,但您在 Stack Overflow 上的问题应该是独立的。请至少总结您链接到的资源中的内容。即使我们想打开它,我们中的一些人也无法打开它。 【参考方案1】:

您在train_test_split 之前对整个数据执行TfidfVectorizer,这可能是由于“数据泄漏”而提高性能的原因。由于TfidfVectorizer 正在学习整个数据的词汇,它是:

包括词汇表中不存在于训练中而只存在于测试中的单词 (out-of-bag words) 还根据来自测试词的数据调整 tf-idf 分数

尝试以下方法:

tweets_train, tweets_test, y_train, y_test = train_test_split(reviews['text'].tolist(), 
                                                  reviews['airline_sentiment'], 
                                                  test_size=0.3, 
                                                  random_state=42)

X_train = v.fit_transform(tweets_train)
X_test = v.transform(tweets_test)

然后检查性能。

注意:这可能不是性能的唯一原因。或者数据集可能适合简单的 tf-idf。

【讨论】:

感谢您澄清这一点。分类精度变化很小。我假设您提到的这些数据很容易分类。【参考方案2】:

默认情况下,Tf-idf 矢量化器会进行所有基本的预处理

    如去除表情符号、标点符号、 将字母字符转换为小写等。

设置后,@vivek Kumar 提到的是一个有效点。在完整数据上拟合矢量化器不是正确的做法。

交叉检查性能指标的一个关键方法是了解模型学习的正确/错误!

查看输入特征的模型系数(如果它是线性模型,否则 SHAP)。

根据您的 github 存储库,当我尝试了解模型 co-eff 时,这就是我得到的。它看起来有点过拟合,因为像luggagesystems 这样的词也被赋予了负权重。

top_n,bottom_n = 15,15
df = pd.DataFrame('feature_names':v.get_feature_names(),
                                'co_eff':clf.coef_[0]) 
df=df.sort_values('co_eff',ascending=False).iloc[np.r_[0:top_n,-bottom_n:0]]
print(df)

输出:

    feature_names   importn
606         thank  6.918280
607        thanks  6.269803
281         great  4.497794
74        awesome  4.366976
391          love  4.296043
84           best  3.864701
40        amazing  3.710287
213     excellent  2.749308
623           thx  2.695160
358         kudos  2.663612
279          good  2.618669
149          cool  2.582528
53     appreciate  2.399666
528          rock  2.222901
502         quick  2.020487
595        system -1.829668
643        trying -1.839126
80           bags -1.899045
394       luggage -1.957718
78            bag -1.968421
192          dont -2.060734
104          call -2.075544
532          rude -2.255443
308          hold -2.588171
316          hour -2.640191
110     cancelled -2.719347
445       nothing -2.743778
171       delayed -2.869854
704         worst -3.262978
317         hours -3.348654

附: :对于情绪分析,这不是一个表现如此出色的范围。一旦你选择复杂的模型/更好的文本处理——结果会改善很多。

【讨论】:

感谢您的洞察力。如果将行李标记为负面术语,如果航空公司推文数据集固有地用于负面陈述,那么行李是否有任何问题? 这样的文字行李不带任何负面情绪吧!可能很多时候,当人们谈到行李时,他们会提到糟糕的体验。

以上是关于为啥这个 TF-IDF 情感分析分类器表现这么好?的主要内容,如果未能解决你的问题,请参考以下文章

怎样用python实现SVM分类器,用于情感分析的二分类

文本情感分析:基于word2vec和glove词向量的文本表示

基于朴素贝叶斯分类器的情感分析

使用机器学习的情感分析分类器

第二天学习进度--文本情感分类

为啥训练我的朴素贝叶斯分类器会占用这么多内存?