Это 8-я часть моего текущего проекта анализа настроений в Твиттере. Вы можете найти предыдущие сообщения по ссылкам ниже.
- Часть 1: Очистка данных
- Часть 2: EDA, Визуализация данных
- Часть 3: Закон Ципфа, визуализация данных
- Часть 4: Извлечение признаков (векторизатор счетчика), N-грамм, матрица путаницы
- Часть 5: Извлечение признаков (векторизатор Tfidf), сравнение моделей машинного обучения, лексический подход
- Часть 6: Doc2Vec
- Часть 7: Фразовое моделирование + Doc2Vec
В предыдущем посте я объединил моделирование фраз с моделями 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 функций, поэтому преобразование этого в плотные матрицы не вариант. Он не влезет в мою оперативную память.
Статистика хи-квадрат измеряет отсутствие независимости между характеристикой (в данном случае одним термином в твите) и классом (положительные или отрицательные твиты).
Сначала вы можете подумать о взаимосвязи между термином в твите и классом, к которому этот твит принадлежит, как о таблице непредвиденных обстоятельств. Таблица непредвиденных обстоятельств - это просто причудливое слово для таблицы, которая отображает распределение частот.
Допустим, у нас есть три предложения в нашем корпусе, как показано ниже.
- я люблю собак
- Я ненавижу собак
- Я люблю собак и готовку
И скажем, класс тональности каждого твита - положительный, отрицательный, положительный. (Кстати, я люблю собак и кулинарию, и кошек тоже)
Давайте определим «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, есть еще несколько сообщений в блогах, которые я нашел полезными.
- Сообщение в блоге Виктора Пауэлла:« Анализ основных компонентов » (вы можете манипулировать точками данных и экспериментировать с ними в 2- или 3-мерном формате, что в огромной степени поможет вам получить интуитивное понимание того, что делает PCA)
- Сообщение в блоге Джорджа Далласа:« Анализ главных компонентов, 4 манекена: собственные векторы, собственные значения и уменьшение размерности » (он успешно объяснил концепцию без единой математической формулы, невероятно)
Затем давайте попробуем уменьшить размеры векторов 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