Введение

Эпоха Интернета меняет то, как люди потребляют новости и делятся ими. Теперь мы всего в одном клике от получения нужной нам информации. Но уверены ли мы, что новости, которые мы читаем, не фальшивые?

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

Фото Джошуа Миранда

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

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

➔ Это может спасти репутацию бренда. Это влияет на покупательское поведение клиента.

➔ Своевременное обнаружение фейковых новостей может спасти бизнес от падения цен на акции. В 2017 году начали распространяться фейковые новости о том, что генеральный директор Эфириума погиб в автокатастрофе. Позже он публично подтвердил, что еще жив, но к тому времени Ethereum в целом рыночная стоимость упала на 4 миллиарда долларов.

Цели

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

Набор данных

Вот ссылка на набор данных, который мы собираемся использовать.

для подробного кода и анализа проверьте это.

Начнем с импорта необходимых библиотек и пакетов.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
nltk.download(‘punkt’)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
import re
from bs4 import BeautifulSoup
from tqdm import tqdm

давайте импортируем набор данных и посмотрим, что он содержит

path = "provide the path to the dataset where it is located"
news = pd.read_csv(path)

news.head()

Обзор набора данных

Набор данных имеет следующие шесть функций

● Без имени: — 0 Уникальный идентификатор новости

● Заголовок: содержит заголовки новостей.

● Текст: содержит новостной контент/статью (может быть неполной).

● Тема: — Тема, к которой относится новость, например

      ○ politicsNews 
      ○ worldNews
      ○ news
      ○ politics
      ○ left-news
      ○ Government News
      ○ US_News
      ○ Middle-east

● Дата : — Дата публикации новости.

● Метки: — Это целевая переменная, которую мы должны предсказать.

      1 : News is fake
      0 : News is real

Все функции являются категориальными, кроме «Безымянный :0».

давайте переименуем первый столбец и проверим, есть ли в наборе данных какие-либо значения None или нет

news.rename(columns = {'Unnamed: 0':'Id'},inplace = True) 
# renaming the first column
news.isnull().values.sum() # checking for nan values
output -- 0 # means we do not have nan values in the entire dataset.

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

Здесь я сосредоточусь только на функции Текст, если вам нужен одномерный и многомерный анализ, вы можете проверить мой Github

Просто следуйте стандартным методам предварительной обработки текста НЛП, чтобы подготовить столбец «Текст» к характеристике.

  • Следующая функция вернет предварительно обработанный «текст»

preprocessed_news['text'] = preprocessing_data(news['text'])
# it took around 5 minutes to execute this cell on google colab.

давайте изменим нашу целевую/выходную переменную на целое число

def str_to_int(Label): # changing Fake to 1 and Real to 0
  if Label == 'Fake':
    return 1
  return 0
values = preprocessed_news[‘Labels’]
preprocessed_news[‘Labels’] = values.apply(str_to_int)

теперь мы давайте проверим, сбалансирован ли набор данных или нет

Количество поддельных новостей больше, чем истинных новостей, но разница не так уж велика. Следовательно, можно с уверенностью сказать, что набор данных сбалансирован.

Особенности ТЕКСТА

Начнем с разделения данных на набор данных train, cv и test.

здесь мы будем использовать векторизатор TF-IDF для характеристики.

TF-IDF является аббревиатурой термина «частота, обратная частота документа». Он состоит из двух терминов: «частота термина» и «обратная частота документа».

**Частота термина**

Частота термина — это количество раз, которое слово появляется в документе. Его также можно рассматривать как вероятность найти слово в документе. Термин частота указывает, насколько важно слово в этом документе.

частота терминов = количество раз, когда термин появляется в документе / общее количество терминов в документе.

**Частота документов** – частота документов – это количество документов, содержащих определенный термин. Частота документа указывает, насколько распространен термин.

**Инверсная частота документа** — обратная частота документа показывает, насколько редко встречается слово в корпусе. Она обратна частоте документа, поэтому придает значение более редким словам.

обратная частота документов = log(количество документов / количество документов, содержащих термины)

теперь математически объединяя два вышеуказанных термина, мы получаем

tf idf = tf*idf

Здесь tf придает значение более частым словам и меньшее значение редким словам, однако idf придает большее значение редким словам в корпусе и меньшее значение часто встречающимся словам. Следовательно, оба уравновешивают друг друга.

Преимущества

* TF-IDF основан на модели Bag of Words и, следовательно, очень полезен для функций лексического уровня.

* TF-IDF очень прост в расчетах и ​​не требует значительных вычислительных ресурсов.

* Мы можем использовать TF-IDF для обнаружения основных терминов, связанных с документом или группой документов.

Ограничения

* TF-IDF игнорирует порядок слов. Он просто игнорирует последовательность терминов.

* Наивысшая оценка TF-IDF может не соответствовать теме документа, поскольку IDF дает высокий вес, если DF термина низкий.

* Не фиксирует семантику.

print("some feature names:--",vectorizer.get_feature_names_out()[:10])
print("tf_idf_X_train",tf_idf_X_train.shape)
print("tf_idf_X_cv   ",tf_idf_X_cv.shape)
print("tf_idf_X_test ",tf_idf_X_test.shape)
print(type(tf_idf_X_train))
OUTPUT --
some feature names:-- ['aaron' 'abadi' 'abandon' 'abandoned'
'abandoning' 'abbas' 'abbott' 'abc'  'abc news' 'abdel'] tf_idf_X_train (20149, 10000) tf_idf_X_cv    (9925, 10000) tf_idf_X_test  (14814, 10000) <class 'scipy.sparse.csr.csr_matrix'>

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

Я пробовал разные модели, используя

Мешок слов

Векторизатор Tf-idf

TF-idf взвешенное word2vec

Берт Эмбеддинг

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

Метрика производительности

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

Отзывать

Отзыв измеряет, насколько правильно наша модель определяет истинные положительные результаты (фактические положительные результаты). Он также известен как чувствительность / доля истинно положительных результатов.

Чувствительность = (истинные положительные результаты) / (фактические положительные результаты)

Чувствительность = (истинно положительные) / (истинно положительные + ложноотрицательные)

Зачем использовалась чувствительность ? Стоимость «ложноотрицательного результата» при обнаружении фейковых новостей довольно высока, поскольку мы знаем, что фальшивые новости могут привести к резкому падению цен на акции всего за пару дней. Представьте себе сценарий, в котором наша модель предсказала фейк. новости должны быть правдивыми, из-за этого компании могут понести огромные материальные и нематериальные убытки

Альтернативные показатели

Оценка F1

Эта метрика обеспечивает баланс между точностью и полнотой.

Оценка f1 = 2*(точность)*(отзыв)/(точность+отзыв)

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

Плюсы чувствительности

● Не требующая пояснений оценочная метрика

● Отзыв наказывает модель при обнаружении ложного отрицательного результата.

● Чувствительность широко используется в

○ Классификатор спама по электронной почте ○ Обнаружение мошенничества с кредитными картами ○ Прогноз диабета

Минусы чувствительности

● Эта метрика не работает, когда мы хотим наказать ложные срабатывания.

● В большинстве случаев, если нам нужна высокая чувствительность, нам приходится идти на компромисс с точностью модели.

Логистическая регрессия

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

ПЛЮСЫ

Прост в реализации и очень эффективен в обучении.

Он также обеспечивает важность признаков, если они не коллинеарны.

Это не так просто, и даже если размерность данных высока, мы всегда можем использовать регуляризацию L1 или L2.

Наиболее часто используемая модель функций линейно разделима.

МИНУСЫ

Нелинейные задачи не могут быть решены с помощью логистической регрессии, поскольку предполагается, что данные линейно разделимы.

Для важности признаков требуются только неколлинеарные признаки.

Он не может обрабатывать недостающие данные так же эффективно, как другие методы, такие как дерево решений и случайный лес.

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

Настройка гиперпараметров

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(solver = ‘liblinear’)
grid_values = {‘penalty’: [‘l1’, ‘l2’],’C’:[1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]}
search = GridSearchCV(clf, param_grid = grid_values,scoring = ‘recall’,verbose = 3,cv = 3)
result = search.fit(tf_idf_X_train, Y_train)
print(‘Best Score: %s’ % result.best_score_)
print(‘Best Hyperparameters: %s’ % result.best_params_)
--output-- 
Best Score: 0.9926325538006674 
Best Hyperparameters: {'C': 1, 'penalty': 'l1'}

давайте посмотрим на вывод

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

Ресурсы