Это 8-я часть моего текущего проекта анализа настроений в Твиттере. Вы можете найти предыдущие сообщения по ссылкам ниже.

В предыдущем посте я объединил моделирование фраз с моделями doc2vec и увидел небольшое улучшение точности проверки, и я собирался перейти к нейронным сетям, чтобы увидеть, как ИНС может повысить производительность. Но я решил пойти в обход и попробовать уменьшить размерность функций, которые я получил от векторизатора Tfidf и векторов Doc2Vec.

Пока что с точки зрения извлечения признаков я пробовал три разных метода: векторизатор подсчета, векторизатор Tfdif, doc2vec. Лучшие результаты проверки, которые я получил по каждому из них, приведены ниже.

Классификатор: логистическая регрессия (регуляризация L2, степень регуляризации: 1.0)

  • векторизатор подсчета (80000 функций, диапазон n-грамм: 1,2,3, удаление стоп-слов: X) - 82,44%
  • tfidf векторизатор (100000 функций, диапазон n-грамм: 1,2,3, удаление стоп-слов: X) - 82,92%
  • Doc2Vec (unigram DBOW + триграмма DMM: всего 200 векторов измерений для каждого твита) - 75,76%

И в дополнение к этому у меня также есть собственный классификатор, использующий лексический подход.

  • настраиваемый классификатор лексики (порог принятия решения установлен на 0,56) - 75,96%

Помимо лексического подхода, количество функций, необходимых для моделей, кажется довольно большим, поэтому я решил посмотреть, могу ли я уменьшить размерность функций векторов Tfidf и doc2vec. Векторы из модели Doc2Vec имеют 200 измерений, что довольно мало по сравнению со 100 000 функций векторизатора Tfidf. Однако эти 200-мерные векторы представляют собой плотные матрицы со всеми действительными числами, а 100 000 объектов - это разреженные матрицы с большим количеством нулей. Таким образом, с точки зрения вычислений, векторы Doc2Vec также требуют немного времени для вычислений. Так что если удастся уменьшить габариты, то будет полезно запустить различные настройки гиперпараметрической настройки моделей.

Во-первых, давайте попробуем запустить уменьшение размерности векторов Tfidf с выбором признаков хи-квадрат.

* В дополнение к блокам коротких кодов, которые я приложу, вы можете найти ссылку на весь блокнот Jupyter в конце этого сообщения.

Выбор функции Chi2

В библиотеке Scikit-learn есть три метода, которые вы можете использовать для выбора функций с разреженными матрицами, такими как векторы Tfidf или векторы подсчета. Изучив документацию, вы можете увидеть, что chi2, relative_info_regression, duplic_info_classif обрабатывают данные, не делая их плотными. В моем случае у меня 1,5 миллиона твитов, и я хочу уменьшить размеры со 100 000 функций, поэтому преобразование этого в плотные матрицы не вариант. Он не влезет в мою оперативную память.

Статистика хи-квадрат измеряет отсутствие независимости между характеристикой (в данном случае одним термином в твите) и классом (положительные или отрицательные твиты).

Сначала вы можете подумать о взаимосвязи между термином в твите и классом, к которому этот твит принадлежит, как о таблице непредвиденных обстоятельств. Таблица непредвиденных обстоятельств - это просто причудливое слово для таблицы, которая отображает распределение частот.

Допустим, у нас есть три предложения в нашем корпусе, как показано ниже.

  1. я люблю собак
  2. Я ненавижу собак
  3. Я люблю собак и готовку

И скажем, класс тональности каждого твита - положительный, отрицательный, положительный. (Кстати, я люблю собак и кулинарию, и кошек тоже)

Давайте определим «t» как конкретный термин, на который мы смотрим, в данном случае «собаки», и «c» как класс, поскольку у класса есть только два классов, он будет либо 1 (положительный), либо 0 (отрицательный). Используя таблицу непредвиденных обстоятельств, где A - это количество раз, когда встречается 't', а 'c' положительно, B - это количество раз, когда встречается 't' и 'c' отрицательно, C - это количество раз, когда 't' не встречается, и 'c' положительно, наконец, D - это количество раз, когда 't 'не встречается, а' c 'отрицательно. Теперь мы готовы рассчитать статистику хи-квадрат.

Где N - общее количество образцов, показатель хи-квадрат для термина «собаки» равен 3! Поскольку мерой хи-квадрат является отсутствие независимости между объектом и классом, если объект имеет высокий балл хи-квадрат по сравнению с другими объектами, это означает, что функция полезна для прогнозирования класса.

Сначала я преобразую данные поезда в векторы Tfidf из 100 000 функций и посмотрю, какие функции chi2 выбрал в качестве полезных. Давайте изобразим полученные нами оценки на графике и посмотрим, какие функции слов полезны для предсказания. В приведенной ниже таблице я нанесу только 20 основных функций, но вы можете рисовать столько, сколько хотите, если позволяет экран вашего компьютера.

Самая полезная функция, выбранная chi2, - это слово «спасибо», и я предполагаю, что это произошло в основном из положительных твитов. Вторая наиболее полезная функция, которую он выбрал, - это слово «грустный», и на этот раз, я полагаю, оно появилось из негативных твитов. Если вы проанализируете, как рассчитывается chi2, он не только получит высокие баллы по критериям, предсказывающим положительный класс, но также и по условиям, предсказывающим отрицательный класс.

Поскольку теперь у нас есть представление о том, как работает выбор функций chi2, давайте уменьшим размеры до разного количества функций, а также проверим точность набора для проверки.

Еще кое-что. Векторизатор tfidf может ограничить количество функций в первую очередь, когда вы подгоняете и трансформируете корпус. Я хочу сравнить точность проверки при том же количестве функций: 1) когда количество функций было ограничено на этапе векторизации Tfidf, 2) когда количество функций было уменьшено с 100 000 функций с использованием статистики chi2.

* В приведенном ниже блоке кода я рисую результат, который я получил от запуска векторизатора Tfidf на различных максимальных функциях, опять же, вы можете найти полный код в блокноте Jupyter в конце этого сообщения.

На приведенном выше графике красная пунктирная линия соответствует точности проверочного набора из-за уменьшения размерности, а синяя линия - результат ограничения количества функций в первую очередь при установке векторизатора Tfidf. Мы видим, что ограничение количества функций в первую очередь с помощью векторизатора Tfidf дает лучший результат, чем уменьшение размеров из более крупных функций. Это не общее утверждение, а то, что я обнаружил в этой конкретной обстановке. Если у вас другой результат с другими корпусами, я хотел бы знать, чем он отличается.

Анализ главных компонентов (PCA)

PCA - это инструмент уменьшения размерности, который можно использовать для сокращения большого набора переменных до небольшого набора, который по-прежнему содержит большую часть информации в исходном наборе. Звучит круто, вы можете уменьшить количество функций своих данных, но не сохраните большую часть необходимой информации. Но если вы пробовали поискать в Google «PCA», вы можете знать, что он вернет вам результат со всеми трудно звучащими терминами, такими как «собственное значение», «собственный вектор», «проекция матрицы» и т. Д.

В этом посте я не буду вдаваться в подробности того, как на самом деле рассчитывается PCA, но постараюсь сохранить его на интуитивно понятном уровне, чтобы любой, кто прочитает это, мог понять лежащие в основе его основы и реализовать с помощью Python.

Что делает PCA, так это то, что он преобразует систему координат так, что оси становятся наиболее краткими и информативными дескрипторами наших данных в целом.

Вышеупомянутое изображение было заимствовано из сообщения в блоге Мэн Сюй на PCA. Я обнаружил, что объяснение Мэн Сюй действительно очень помогает интуитивно понять концепцию. Форма, которую вы видите на рисунке (A), имеет 3 измерения, но если мы сосредоточимся на форме данных, а не на оси, сама форма будет плоской двухмерной поверхностью. Запуская PCA, мы находим новые координаты данных, которые лучше всего описывают их форму. Первый главный компонент - это тот, который объясняет наибольшую вариативность данных. На рисунке (B) мы видим, что, нарисовав линию Компонент 1, он может сохранить информацию о наиболее разрозненных точках данных. И добавляя строку Компонент 2, эта строка Компонент 2 объясняет вторую по величине дисперсию в наших данных. Следующим шагом является преобразование исходных данных в нашу новую найденную ось, которая имеет только два измерения вместо исходных трех измерений. Окончательный результат на рисунке (C) дает нам довольно хорошее представление о том, как данные формируются только с двумя измерениями, хотя мы отбросили третье измерение.

И собственные векторы и собственные значения используются при реализации этого преобразования данных. Собственный вектор определяет направление в исходном координатном пространстве, а собственные значения указывают величину отклонения в направлении его соответствующего собственного вектора.

Если вы хотите глубже погрузиться в концепцию PCA, есть еще несколько сообщений в блогах, которые я нашел полезными.

Затем давайте попробуем уменьшить размеры векторов doc2vec с помощью PCA. Мы также можем отобразить результат на графике и посмотреть, возможно ли уменьшить количество функций до меньшего набора основных компонентов, и какую долю отклонения от данного количества основных компонентов можно объяснить в отношении исходных функций.

На приведенном выше графике красная линия представляет совокупную объясненную дисперсию, а синяя линия представляет объясненную дисперсию каждого главного компонента. Глядя на график выше, видно, что красная линия не является идеально линейной, но очень близка к прямой. Это хорошо? Нет. Это означает, что каждый из основных компонентов почти в равной степени способствует объяснению дисперсии, и нет особого смысла в уменьшении размеров на основе PCA. Это также можно увидеть по синей линии, которая очень близка к прямой внизу.

Немного разочаровывает то, что в моем конкретном случае с текстовыми данными твитов уменьшение размерности не очень помогает. Векторы Tfidf показали лучший результат, когда функции были ограничены векторизатором Tfidf в первую очередь, чем для последующего уменьшения размерности, а векторы doc2vec, похоже, несут примерно такой же объем информации через свое 200-мерное пространство функций.

Опять же, это не общее утверждение, это просто то, что я обнаружил с моими конкретными данными. И особенно с PCA, когда он применяется к числовым характеристикам, я видел, что он успешно уменьшил размерность данных со 100 или более функций до примерно 10 функций, при этом имея возможность объяснить 90% дисперсии данных.

Если вы ожидали моделирования нейронной сети для этого поста, извините, что мне пришлось пойти в обход, но в следующем посте я обязательно рассмотрю моделирование нейронной сети. Как всегда, спасибо за чтение.

Вы можете найти Jupyter Notebook по ссылке ниже:

Https://github.com/tthustla/twitter_sentiment_analysis_part8/blob/master/Capstone_part4-Copy6.ipynb