Сегодня становится все проще читать новостные статьи в Интернете, но определить, какие из них надежны, а какие являются политически заряженными или предвзятыми, не всегда является легкой задачей. Поэтому на третьем году обучения в Калифорнийском университете в Лос-Анджелесе я решил работать с командой над проектом под названием Affinity - классификатором предвзятости новостей, который предсказывает, насколько политизирована статья в зависимости от ее содержания. В рамках проекта я работал в основном над разработкой конвейера машинного обучения, поэтому в этой статье будет обсуждаться сделанный мной выбор конструкции конвейера сквозной модели, от выбора обучающих данных до определения того, как модель интегрируется с передней частью. -конец.

Набор данных

Набор данных, на котором обучалась модель, был взят из Harvard Dataverse. Мы использовали базу данных помеченных новостей, которая использовалась в статье: NELA-GT-2018: Большой набор данных новостей с несколькими пометками для изучения дезинформации в новостных статьях Норрегаарда, Хорна и Адали. Данные и статью можно найти здесь. Этот набор данных содержал более 700 000 статей вместе с их ярлыками, и после очистки данных мы использовали около 470 000 из этих строк.

Данные включали источник новостей, содержание статьи и присвоенную метку, которую мы сопоставили с целочисленным значением от -1 до 1 для смещения влево к смещению вправо.

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

Предварительная обработка данных

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

Во-первых, мы убедились, что текст, с которым мы работаем, чистый, и это достигается за счет уменьшения всего текста и удаления цифр и знаков препинания. После этого, используя пакет Python nltk, мы загрузили список стоп-слов (общие слова, не добавляющие значения, такие как предлоги, местоимения, союзы и т. Д.) И удалили их из содержания каждой статьи. Удаление стоп-слов из содержания статьи помогает уменьшить шум в обучающих данных, так как из-за того, насколько распространены эти слова, они вряд ли добавят предсказуемости в отношении предвзятости статьи. Затем мы лемматизировали каждое слово в статье, что означает сокращение каждого слова до его корневой формы, например преобразование слова «ел» или «ест» в корневое слово «есть». Мы выполняем лемматизацию, поскольку это помогает уменьшить количество слов, которые используются в качестве функций для модели, поскольку эти слова в любом случае имеют одно и то же основное значение.

Наконец, мы взяли обработанный текстовый контент из статьи и создали модель мешка слов (BOW). Модель набора слов - это форма представления текстовых данных, в которой мы подсчитываем, сколько раз каждое слово встречается в статье. Набор слов, который мы считаем, получается из объединенных текстовых данных во всех статьях, отсортированных по частоте. При создании этого BOW мы решили использовать Term Frequency - Inverse Document Frequency (TF-IDF) для определения наших функций, что означает, что мы решаем подсчитывать количество слов, которые меньше всего встречаются в наших документах. Это основано на идее, что слова, которые встречаются реже, могут иметь большее значение, чем те, которые часто встречаются в каждой статье. Кроме того, мы также решили использовать 3-граммы для наших функций, что означает, что вместо того, чтобы брать каждое уникальное слово, мы берем до 3 последовательных слов в качестве функции.

Модель

Для этой задачи прогнозирования смещения мы решили использовать набор из 3 классификаторов, включая логистическую регрессию, машину опорных векторов (SVM) и наивный байесовский метод. Это означает, что мы обучили все 3 модели индивидуально, но при прогнозировании объединили результаты всех 3-х моделей, чтобы принять единственное классификационное решение.

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

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

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

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

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

Например, если модель предсказывала статью как 0,8 смещения вправо (1), 0,1 нейтрального (0) и 0,1 смещения влево (-1), наша прогнозируемая оценка смещения будет 0,8 * 1 + 0,1 * 0 + 0,1 * -1 = 0,7 (смещение вправо).

Оценка

Мы оценили нашу модель, используя рабочую характеристику области под приемником (AUROC), и получили оценку 0,80 (один против одного) для модели классификации 3 классов.

Кривая ROC отображает частоту истинных положительных результатов и частоту ложных срабатываний и измеряет, насколько хорошо модель может различать один класс и другой. AUROC измеряет общую площадь под кривой ROC. Оценка 1.0 AUROC означает, что модель может отлично различать классы, в то время как оценка 0,5 означает, что модель не может различать классы (предсказание с помощью случайного предположения и т. Д.).

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

Весь код можно найти здесь: github.com/ieching/affinity

Свяжитесь со мной в LinkedIn: linkedin.com/in/chingyi-ie