В рамках своего иммерсивного курса по науке о данных в General Assembly я разработал модель классификации на Python, используя обработку естественного языка и базовые методы машинного обучения. Эта модель определяла бы происхождение сообщения Reddit, если бы оно было из субреддита /r/futurology или /r/worldnews, хотя модель можно обобщить для сравнения других субреддитов. Модель сработала, обычно определяя, какой пост принадлежит примерно в 83–91% случаев. Что меня заинтересовало после запуска и повторного запуска моей модели, так это диапазон различий в ее успехе, в частности то, как выбор различных алгоритмов сортировки на Reddit значительно повлиял на мою производительность.

Мой процесс

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

Я воспользовался существующим скриптом PRAW, или оболочкой Python Reddit API, а также моими ключами API Reddit, чтобы эффективно очистить свои данные. Чтобы очистить любые данные субреддита, вы должны указать, по какому алгоритму сортировки вы хотите упорядочить свои сообщения — для согласованности важно, чтобы мы сравнивали данные, собранные с помощью одного и того же алгоритма сортировки (подробнее об этом позже). После того, как я сохранил интересующие меня данные — происхождение субреддита и заголовки постов — в Pandas Dataframe, я присвоил заголовки постов X в качестве своей независимой переменной, которую я хочу присвоить и определить связь с тем, с какими субреддитами они связаны. скорее всего, моя Y или зависимая переменная. Я использовал sci-kit Learn, чтобы случайным образом присвоить заголовки моих сообщений разделению тестов на поезд, и это будет обучать мою модель машинного обучения с частью данных, с сообщениями, прикрепленными к их фактическому субреддиту происхождения, создавая модель для протестируйте оставшиеся заголовки субреддитов, которые не привязаны к их исходному субреддиту. До запуска модели слова заголовков моих сообщений были CountVectorized и преобразованы в машиночитаемые токены, то есть отдельные переменные, которые игнорировали пунктуацию для группировки похожих слов. Две модели, мультиномиальная наивная байесовская модель и более простая модель логистической регрессии, использовались для классификации моих тестовых данных, к какому субреддиту они принадлежали, на основе информации, предоставленной моей модели из обучающих данных. Основным гиперпараметром, который я настроил для оптимизации своей модели, было количество переменных в CountVectorizer: я обычно ограничивал количество слов наиболее предсказуемыми 1500–2000, чтобы обучающие данные не были слишком конкретными и не обобщали новые данные тестирования ( переоснащение).

Что я нашел

Как я уже сказал, эта модель успешно классифицировала данные тестирования по правильному субреддиту в 83–91% случаев — это казалось разумным диапазоном, учитывая совпадение типов сообщений между этими двумя субреддитами. Но почему возникла эта разница? Это отклонение не возникало при рандомизации и разделении одних и тех же данных на разделение поезд/тест — оно возникало, когда мы очищали одни и те же реддиты с разными алгоритмами сортировки.

Давайте рассмотрим некоторые последствия этого!

В настоящее время существует шесть алгоритмов сортировки, по которым можно организовать субреддит: лучший, горячий, новый, лучший, спорный и восходящий. Я нашел еще одну статью на Medium, написанную в 2015 году, в которой излагался горячий алгоритм, когда код Reddit был с открытым исходным кодом — с 2016 года это уже не так, эти когда-то публично прозрачные алгоритмы сортировки являются проприетарными компонентами бизнес-модели Reddits (соответственно, эти коды скрыты, чтобы недобросовестные плакаты не могли искусственно продвигать плохой или нерелевантный контент в верхнюю часть сабреддитов или накачивать карму, по каким-то патологическим причинам кому-то нужны поддельные интернет-баллы). Автор переписал код из Pyrex — используемый для написания расширений Python для C — в Python, для удобочитаемости, который можно посмотреть здесь:

# Rewritten code from /r2/r2/lib/db/_sorts.pyx
from datetime import datetime, timedelta
from math import log
epoch = datetime(1970, 1, 1)
def epoch_seconds(date):
    td = date - epoch
    return td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
def score(ups, downs):
    return ups - downs
def hot(ups, downs, date):
    s = score(ups, downs)
    order = log(max(abs(s), 1), 10)
    sign = 1 if s > 0 else -1 if s < 0 else 0
    seconds = epoch_seconds(date) - 1134028003
    return round(sign * order + seconds / 45000, 7

Что можно интерпретировать из этого, так это то, что горячий алгоритм был определен как функция, которая возвращает сообщения с большим количеством голосов за, чем против, отдавая приоритет сообщениям с большим количеством голосов, которые были опубликованы относительно недавно по сравнению с другими сообщениями в сабреддите. Что мы обычно знаем в наши дни, так это то, что спорные посты имеют более высокую долю отрицательных голосов, лучшие посты исторически популярны, лучшие посты имеют более высокий коэффициент голосов после определенного периода времени, новые посты просто организованы по времени публикации и набирают популярность. новые посты получают много внимания и голосов. В этом случае разница в возвращаемых сообщениях из моих скрейпов с использованием алгоритмов hot и top одновременно демонстрирует, что характер сообщений в сабреддите будет меняться со временем, а это означает, что наши модели машинного обучения бесполезны, если они не проходят новое обучение. данные. Конечно, это универсально относится к приложениям машинного обучения с онлайн-данными и, в более широком смысле, к человеческому обучению: Интернет — это постоянно развивающийся цифровой организм, статичный цифровой архив никогда не уловит всей сути. Таким образом, мы всегда должны быть готовы адаптироваться, учиться и быть восприимчивыми к новой информации, чтобы иметь возможность понять то, что мы наблюдаем.