Когда я сажусь писать свой самый первый пост в блоге, меня ошеломляет количество пустого пространства внизу — но ничего не остается, кроме как сделать это, верно? Для моего третьего проекта нам было поручено выбрать два разных сабреддита для использования в модели классификации, чтобы определить, происходит ли название поста из одного сабреддита или из другого. Моей первой мыслью было выбрать субреддиты, которые были бы похожи, но в то же время достаточно различались, чтобы модели было не слишком легко предсказывать. Я выбрал сабреддиты AskScience и AskScienceFiction. Мне лично нравятся оба этих субреддита, и я подумал, что было бы забавно увидеть слова, связанные с обоими, в подходе НЛП. Поскольку API Reddit позволяет собирать только 1000 сообщений за раз, я настроил приведенный ниже код для сбора 1000 сообщений за раз:

После очистки обоих субреддитов для 1000 сообщений и заголовков я скомпилировал их в словарь, который затем легко преобразовать в DataFrame pandas для EDA. Ниже приведен пример кода, который я использовал для создания словаря с названиями и описаниями:

Поскольку это проблема бинарной классификации, я хотел сначала провести очень простое моделирование с помощью логистической регрессии и случайных лесов, чтобы получить некоторые значения функций для модели. Это должно помочь мне понять, какие слова более важны, когда дело доходит до того, как модель их классифицирует. Ниже приведены результаты моих первых двух моделей, в которых я просто использовал заголовки наших постов на Reddit в качестве нашей функции и созданной мной категории субреддита, где 1 — это AskScience, а 0 — AskScienceFiction. Также стоит упомянуть, что я использовал базовый векторизатор счета для преобразования нашего текста в числа. Позже мы будем использовать поиск по сетке и конвейеры, чтобы найти идеальный векторизатор между CountVectorizer, TD-IDF Vectorizer и HashVectorizer.

Очевидно, что мы гораздо больше смотрим на результаты наших тестовых данных, чем на данные обучения. Хотя случайные леса очень мощные и полезные, они всегда будут иметь тенденцию к массовому переобучению, но оба показателя достаточно высоки. Но я думаю, что мы можем подняться выше! Теперь, используя функцию важности признаков в модели случайного леса, мы можем посмотреть, какие слова оказывают наибольшее влияние на лес:

Как вы можете видеть выше, мы использовали важность функций для одного столбца в нашем фрейме данных и имена функций из нашей подгонки CountVectorized для столбца слов. Теперь пришло время принести VADER (Словарь с учетом валентности для рассуждений о чувствах), чтобы лучше понять сам текст. Ниже представлена ​​модель Вейдера с некоторыми примерами положительных и отрицательных классифицированных постов:

На тот момент я мало что знал, что делать с этой информацией, кроме того, что ее было очень интересно читать. (Подробнее о VADER в другом посте скоро!) А пока я хотел просто использовать функции составных, положительных, отрицательных и нейтральных оценок, чтобы попытаться увеличить оценку нашей модели. Я сделал это, создав собственный класс для каждого из них, который будет передан в конвейер объединения функций. Ниже приведен пример пользовательских классификаторов:

Прежде чем я перейду к окончательному процессу моделирования, я хотел бы выделить момент EUREKA, который у меня был во время работы над этим проектом. Я получал относительно одинаковые результаты независимо от того, какую модель я использовал, от случайных лесов до полиномиального наивного Байеса. Только когда я понял, что все названия вселенных (MCU, DC, «Звездные войны» и т. д.) заключены в скобки. Этого нет в заголовках сабреддита AskScience, так что это был способ повысить прогностическую способность нашей модели! Я создал собственный классификатор, как показано выше, но на этот раз для подсчета скобок в заголовке:

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

Я немного поработал с этим, чтобы прийти к этой конкретной модели. Было очень интересно увидеть, что добавление классификатора положительных результатов и классификатора нейтральных результатов фактически снизило мои результаты тестов. Также было очень интересно отметить, что случайный лес оказался нашей самой сильной моделью, хотя изначально он был одной из самых слабых. С помощью этой модели мы можем предсказать субреддит между AskScience и AskScienceFiction с точностью 99,26%, что неплохо! Следующими шагами будет попытка применить эту модель к другим сабреддитам, чтобы увидеть, как работает наша модель. Надеюсь, вам понравился этот бурный тур по проекту, который мне очень понравился!

Репозиторий Github с кодом и powerpoint: https://github.com/JonathanBeatty/Project_3