Почему этот классификатор анализа настроений TF-IDF работает так хорошо?
Последняя матрица путаницы предназначена для тестового набора. Это случай переоснащения логистической регрессией? Потому что, даже если не обрабатывать текст заранее (включая смайлики, знаки препинания), точность все равно остается очень хорошей. Хорошо, кто-нибудь дать помощь / совет?
2 ответа
Вы выполняете 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 хорошо работает для него.
По умолчанию векторизатор Tf-idf выполняет всю основную предварительную обработку.
- такие как удаление смайликов, пунктуация,
- преобразование букв в нижний регистр и т. д.
Установив это, то, что упомянул @vivek Kumar, является верным аргументом. Установка векторизатора на полные данные не является правильной практикой.
Один из ключевых подходов к перекрестной проверке показателей эффективности - понять, какая модель обучения правильная / неправильная!
Посмотрите на коэффициенты модели для входных объектов (если это линейная модель еще 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
PS: для анализа настроений, это не очень хороший диапазон. Как только вы перейдете к сложной модели / улучшенной обработке текста - результаты значительно улучшатся.