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

时间:2018-12-20 22:39:38

标签: scikit-learn nlp logistic-regression tf-idf

Jupter Notebook

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

2 个答案:

答案 0 :(得分:3)

您正在对TfidfVectorizer之前的整个数据执行train_test_split,这可能是由于“数据泄漏”而导致性能提高的原因。由于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可以很好地工作。

答案 1 :(得分:2)

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

  1. 例如删除表情符号,标点符号,
  2. 将字母转换为小写字母等。

设置好这一点后,@ vivek Kumar提到的就是一个正确的观点。将矢量化器适合完整的数据不是正确的做法。

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

查看输入要素的模型系数(如果是线性模型,则为SHAP)。

根据您的github存储库,当我尝试了解Model 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

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