Почему этот классификатор анализа настроений TF-IDF работает так хорошо?

Jupter Notebook

Последняя матрица путаницы предназначена для тестового набора. Это случай переоснащения логистической регрессией? Потому что, даже если не обрабатывать текст заранее (включая смайлики, знаки препинания), точность все равно остается очень хорошей. Хорошо, кто-нибудь дать помощь / совет?

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 выполняет всю основную предварительную обработку.

  1. такие как удаление смайликов, пунктуация,
  2. преобразование букв в нижний регистр и т. д.

Установив это, то, что упомянул @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: для анализа настроений, это не очень хороший диапазон. Как только вы перейдете к сложной модели / улучшенной обработке текста - результаты значительно улучшатся.

Другие вопросы по тегам