Почему этот классификатор анализа настроений TF-IDF работает так хорошо? - PullRequest
0 голосов
/ 21 декабря 2018

Jupter Notebook

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

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

По умолчанию векторизатор Tf-idf выполняет всю базовую предварительную обработку

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

Установив это, то, что @vivek Кумар упомянул, является верным пунктом.Установка векторизатора на полные данные не является правильной практикой.

Один из ключевых подходов к перекрестной проверке метрик производительности - понять, что обучение модели является правильным / неправильным!

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

0 голосов
/ 21 декабря 2018

Вы выполняете 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 хорошо работает для него.

...