为什么这个 TF-IDF 情感分析分类器表现如此出色?
Why is this TF-IDF sentiment analysis classifier performing so well?
最后一个混淆矩阵用于测试集。这是逻辑回归过度拟合的情况吗?因为即使不对文本进行太多预处理(包括表情符号、标点符号),准确度仍然非常好。好人给点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 向量化器执行所有基本预处理
- 比如去除表情符号、标点符号、
- 将字母字符转换为小写等
设置了这个,@vivek Kumar 提到的是一个有效的观点。在完整数据上安装矢量化器并不是正确的做法。
交叉检查性能指标的一个关键方法是了解什么是模型学习 right/wrong!
查看输入特征的模型系数(如果它是线性模型,否则 SHAP)。
根据您的 github 存储库,当我试图了解模型系数时,这就是我得到的。它看起来有点过拟合,因为像 luggage
、systems
这样的词也被赋予了负权重。
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。 :对于情绪分析,这不是一个表现很好的范围。一旦你选择复杂的模型/更好的文本处理——结果会改善很多。
最后一个混淆矩阵用于测试集。这是逻辑回归过度拟合的情况吗?因为即使不对文本进行太多预处理(包括表情符号、标点符号),准确度仍然非常好。好人给点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 向量化器执行所有基本预处理
- 比如去除表情符号、标点符号、
- 将字母字符转换为小写等
设置了这个,@vivek Kumar 提到的是一个有效的观点。在完整数据上安装矢量化器并不是正确的做法。
交叉检查性能指标的一个关键方法是了解什么是模型学习 right/wrong!
查看输入特征的模型系数(如果它是线性模型,否则 SHAP)。
根据您的 github 存储库,当我试图了解模型系数时,这就是我得到的。它看起来有点过拟合,因为像 luggage
、systems
这样的词也被赋予了负权重。
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。 :对于情绪分析,这不是一个表现很好的范围。一旦你选择复杂的模型/更好的文本处理——结果会改善很多。