Цель этого проекта состояла в том, чтобы собрать данные с двух разных форумов сабреддитов (оба имеют определенное сходство) и определить, пришло ли сообщение с этого конкретного форума. Для этого я использовал методы обработки естественного языка (NLP), а также набор инструментов NLTK. В этом посте я подробно расскажу о проекте и его проблемах.

Для начала я выбрал 2 форума сабреддита — ролики и ролики — и использовал их в качестве входных данных для своей функции парсинга веб-страниц. Я вытащил created_utc, который является отметкой времени последнего сообщения в то время, и я использовал его для извлечения каждого сообщения до этой точки. Затем эта функция использовала форум субреддита и использовала цикл for для получения 100 сообщений за раз. Затем извлеченные сообщения были преобразованы в фрейм данных и сохранены в списке.

Эти шаги также были выполнены для сабреддита, посвященного роликовым конькам.

После того, как оба набора данных были собраны, я сохранил их в формате csv для упрощения загрузки. Я преобразовал наборы данных в фреймы данных и удалил все столбцы, кроме «selftext», «title» и «subreddit». Я очистил фреймы данных и заменил значения nan пробелами. Затем я создал функцию для очистки текстовых и заголовочных столбцов фреймов данных. Я хотел удалить стоп-слова, удалить специальные символы, перевести все слова в нижний регистр и лемматизировать слова, прежде чем воссоединиться с ними.

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

Я также использовал Word2Vec, чтобы просмотреть сходство между основными словами. Я обнаружил, что, хотя слово «скейт» было главным словом для обоих фреймов данных, слова, наиболее похожие на каждый из них, сильно различались. Это было основано на характере разговоров, происходящих в каждом сабреддите. Хотя катание на роликах и катание на роликах очень похожи, обсуждения имеют разное содержание.

Моделирование данных

Я объединил оба кадра данных и сопоставил нули и единицы в столбце subreddit: 1, если x — «катание на роликах», и 0, если это «катание на роликах». Затем я объединил столбец «заголовок» с очищенным текстовым столбцом, чтобы добавить больше слов в наш набор данных.

Чтобы смоделировать наши данные, я использовал разбиение тестов поезда и начал с базовой полиномиальной наивной байесовской модели. Эта базовая модель поможет нам сравнить наши оценки по всем испробованным моделям. Я сопоставил X_train и X_test с векторизатором подсчета и преобразовал столбец clean_text.

Затем я подогнал наивный байесовский метод к своим X_train и y_train и оценил производительность моей модели с помощью метрик.

Точность модели составила 89%, но наша нулевая точность была очень низкой. Наша базовая оценка обучения была очень высокой и на 10% превышала оценку тестирования, поэтому мы можем видеть, что модель переобучена.

Базовый балл Train 0,9905437352245863
Базовый балл Test 0,8929133858267716

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

Затем я забил свою модель случайного леса.
Оценка Random Forest Train 0,9822925798086055
Оценка Random Forest Test 0,9658593424265889

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

Для моей последней модели я создал экземпляр метода логистической регрессии и провел его через конвейер.

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

Оценка поезда логистической регрессии 0,9999936080064284
Оценка теста логистической регрессии 0,9569410526733774

Выводы

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

Хотя у логистической регрессии был самый высокий показатель обучения, между результатами обучения и теста был больший запас переобучения, а показатель roc_auc был самым низким среди всех моделей — 88%.

  • Моделью с наивысшим результатом теста была наша модель Count Vectorized Logistic Regression.
  • Модель с наименьшим пределом переобучения была нашим классификатором случайного прогнозирования, векторизованным подсчетом.
  • Наш классификатор случайного леса также имел наименьшее количество ложных срабатываний — 37, однако наш ложноотрицательный результат был самым высоким — 97.
  • Нашими лучшими параметрами для случайного леса были:

CountVectorizer (ngram_range = (1, 2))

RandomForestClassifier (class_weight = {0: 1, 1: 1}

максимальная_глубина=30

min_samples_leaf=3

min_samples_split=3

n_оценщиков = 120

Нашими следующими шагами будут изменение и оптимизация параметров случайного леса, чтобы получить более высокий показатель обучения с меньшим запасом переобучения (пример — векторизатор TFIDF). И наоборот, мы также можем исследовать параметры логистической регрессии, чтобы сократить разрыв между результатами обучения и тестирования.