为什么这个 TF-IDF 情感分析分类器表现如此出色?

Why is this TF-IDF sentiment analysis classifier performing so well?

Jupter Notebook

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

您正在 train_test_split 之前对整个数据执行 TfidfVectorizer,这可能是由于 "data leakage" 而提高性能的一个原因。由于 TfidfVectorizer 正在学习整个数据的词汇,因此是:

  • 包括词汇表中不存在于训练中且仅存在于测试中的单词(out-of-bag 个单词)
  • 同时根据测试词的数据调整 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 就可以很好地工作。

默认情况下,Tf-idf 向量化器执行所有基本预处理

  1. 比如去除表情符号、标点符号、
  2. 将字母字符转换为小写等

设置了这个,@vivek Kumar 提到的是一个有效的观点。在完整数据上安装矢量化器并不是正确的做法。

交叉检查性能指标的一个关键方法是了解什么是模型学习 right/wrong!

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

根据您的 github 存储库,当我试图了解模型系数时,这就是我得到的。它看起来有点过拟合,因为像 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

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