Анализ набора данных о фейковых новостях

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

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

Описание набора данных

Этот набор данных датируется 2016 годом; в то время был поток фейковых новостей на всех медиа-платформах, особенно в социальных сетях, где активно публиковалось много фейковых новостей, связанных с американскими выборами. Распространение фейковых новостей в основном вращалось вокруг скандала с электронной почтой Хиллари Клинтон.

Форма

Набор данных имеет форму (12 999, 20), что означает 12 999 строк и 20 столбцов. Каждая строка представляет сообщение (размещенное на платформе социальных сетей) в наборе данных. Каждая точка данных, в свою очередь, содержит 20 различных пост-функций и столбцов.

Функции

Наш анализ фокусируется в основном на следующих атрибутах набора данных:

  1. автор (строка) : имя человека, написавшего фейковую новость.
  2. опубликовано (дата-время) : выделяет дату и время публикации или размещения новости в Интернете.
  3. title (строка) : представляет заголовок новости, который используется для публикации.
  4. text (строка) : представляет основной текст (тело) опубликованной новости.
  5. language (string) : указывает язык, на котором были опубликованы новости.
  6. site_url (строка) : сообщает URL-адрес сайта, на котором были опубликованы поддельные новости.
  7. страна (строка) : указывает страну, в которой были опубликованы фейковые новости.
  8. spam_score (двойной) : вероятность того, что сообщение было помечено программой как спам.
  9. type (string) : этот атрибут показывает жанр (категорию) поддельной новостной публикации, которая представляет цель публикации.

Первым шагом любого исследовательского анализа данных является просмотр набора данных и его очистка. Мы заметили, что некоторые строки в нашем наборе данных имеют нулевые значения. Вместо того, чтобы вводить строки с нулевыми значениями, мы решили отбросить такие строки из-за большого размера набора данных. Это не влияет на результаты нашего исследования, потому что таких строк было намного меньше, чем размер нашего набора данных.

Корреляции

fig = plt.figure(figsize=(8, 8))
sns.heatmap(df.corr(), annot=True)
plt.show()

      
                
Correlation heat map: spam_score v/s other features

df.drop(['uuid', 'ord_in_thread', 'domain_rank', 'country', 'main_img_url', 
         'replies_count', 'participants_count', 'thread_title', 'title',          
         'crawled', 'likes', 'comments', 'shares'], 
          axis=1, inplace=True)

Строки, хранящиеся в столбце «автор», были опущены; остались только буквы и цифры.

df['author'] = df['author'].str.lower().replace('[^a-z0-9\s]')

df['text'] = df['text'].str.lower() 
df['text'] = df['text'].str.replace('[^\w\s]', '') 
df['text'] = df['text'].str.replace('\d+', '') 
df['text'] = df['text'].str.replace(r'\s+', ' ', regex=True) 
df['text'] = df['text'].str.replace(r'\r+|\n+|\t+', '', regex=True)

df['Published Year']  = df['published'].str.split("-").str[0]
df['Published Month'] = df['published'].str.split("-").str[1]
df['Published Day']   = df['published'].str.split("-").str[2].str.slice(0, 2)

df.drop(['published'], axis=1, inplace=True)

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

С помощью EDA мы решаем следующие вопросы:

В какие месяцы 2016 года в нашем наборе данных о фейковых новостях была самая высокая концентрация фейковых новостей?

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

Месяцы 2016 года, в течение которых наблюдалось наибольшее количество фейковых новостей

Какие 10 слов чаще всего встречаются в постах с фейковыми новостями?

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

import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords 
stop_words = stopwords.words('english')
stop_words.append("us")
sw_df = df['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop_words)]))
bow = pd.Series([y for x in sw_df.values.flatten() for y in x.split()])
top_ten = bow.value_counts().nlargest(10)

      
                
Top 10 words that appeared in posts.

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

Подсюжеты для сайтов, занимающихся распространением фейковых новостей

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

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

Топ-10 авторов, опубликовавших больше всего фейковых новостей

Разработка функций

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

Чтобы машины могли понимать качественные данные, их необходимо сначала преобразовать в количественный формат. Следовательно, чтобы достичь нашей цели, мы преобразовали наши нечисловые столбцы, такие как «автор», «язык» и «site_url », в числовой тип данных, передав эти столбцы кодировщику меток.

from sklearn import preprocessing
str_column_names = ['author', 'language', 'site_url']
label_encoders = {}
for each_str_col_name in str_column_names:
    le = preprocessing.LabelEncoder()
    le.fit(df[each_str_col_name])
    df[each_str_col_name + '_t'] = le.transform(df[each_str_col_name])
    label_encoders[each_str_col_name] = le

cv = CountVectorizer(max_features=10000)
cv.fit(df['text'])
vecs_text = cv.transform(df['text']).toarray()

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

df['author'].fillna('anonymous', inplace=True)

Мы отметили, что когда мы вводили функции нашего набора данных в нашу модель, включая столбец «текст», производительность нашей модели была ужасной.
Показатель точности оказался неожиданно очень высоким (99%), но показатель F1 нашей модели оказался скудным (почти 0,01). При более внимательном рассмотрении мы обнаружили значительное несоответствие между количеством сообщений в социальных сетях, которые преодолели пороговое значение spam_score, равное 0,5. Было большое количество постов, помеченных как не фейковые, и гораздо меньше постов, помеченных как фейковые. Когда мы подсчитали показатели точности наших моделей, они неправильно классифицировали небольшое количество постов, помеченных как «фейковые», в результате чего были достигнуты такие высокие показатели точности и почти нулевой показатель F1. В конечном итоге мы решили не включать столбец «текст». Эта стратегия значительно улучшила оценку F1 наших моделей. Продолжайте читать, чтобы узнать показатели точности в разделе «Машинное обучение» этого поста.

Машинное обучение

Прогнозирование фейковых новостей

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

from sklearn.model_selection import train_test_split as tt_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.metrics import f1_score

#75-25 Test-Train Split
X_train, X_test, Y_train, Y_test = tt_split(X, Y, test_size=0.25,
                                      shuffle=True, random_state=25)

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

Мы применили модель логистической регрессии Склеарна и рассчитали соответствующую точность на тестовом наборе.

logreg =  LogisticRegression(solver='saga',penalty='elasticnet', 
              l1_ratio=0.5, max_iter=5000, class_weight='balanced', n_jobs = 4) 
logreg.fit(X_train, Y_train)

KNeighboursClassifier

K-NN — это надежный алгоритм машинного обучения для сильно несбалансированного набора данных, такого как наш. Мы попробовали разные значения k и вычислили соответствующие средние значения точности. Мы обнаружили, что оптимальный параметр для значения k равен 1. Это опять-таки связано с высоким дисбалансом между нашими классами. Точность составила 98,2% с оценкой F1 0,49. KNN является значительным улучшением по сравнению с классификатором логистической регрессии.

Случайный ЛесКлассификатор

Наконец, мы использовали метод машинного обучения для прогнозирования фейковых новостей. Для этого мы использовали модель RF Classifier sklearn. Кроме того, мы использовали метод перекрестной проверки K-Fold, чтобы повысить точность, сообщаемую нашим алгоритмом. Это достигается путем разделения набора данных на 5 частей и многократного использования 4 разных частей для обучения модели и 1 оставшейся части для проверки точности и других показателей.

Процесс описан в следующем фрагменте.

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix
from sklearn.metrics import plot_confusion_matrix

kf = KFold(n_splits=5, random_state=None, shuffle=False)
accuracy_scores = []
confusion_matrices = []
f1_scores = [] 

for train_index, test_index in kf.split(X_train):    
    # Split the dataset
    X_train_k, X_test_k = X_train[train_index], X_train[test_index]
    Y_train_k, Y_test_k = Y_train[train_index], Y_train[test_index]
    
    # Fit the model
    rfc_model = RFC(n_estimators=2, max_depth=3, random_state=114)
    rfc_model.fit(X_train_k, Y_train_k)
    
    # Make Predictions
    Y_pred = rfc_model.predict(X_test_k)
    
    # Evaluation
    accuracy_scores.append(rfc_model.score(X_test_k, Y_test_k))
    f1_scores.append(f1_score(Y_test_k, Y_pred))
    
    # Find confusion matrix of each fold and append it to confusion_matrices list
    conf_matrix = confusion_matrix(Y_test_k, Y_pred)
    confusion_matrices.append(conf_matrix)

Средняя матрица путаницы для классификатора случайного леса

Окончательный вердикт

Во-первых, мы обсудили, что такое Fake News. Затем мы изучили, очистили, визуализировали и проанализировали наш набор данных с использованием различных методов. Мы очистили и усовершенствовали наш набор данных, чтобы наши модели машинного обучения могли находить закономерности в нашем наборе данных. Мы изучили различные алгоритмы классификации, чтобы предсказать, что можно считать фейковой новостью, а что нет. Наше исследование показало, что классификатор случайного леса — лучший алгоритм для прогнозирования класса точек данных, когда у нас есть сильно асимметричный набор данных.

На результаты нашего исследования повлияли:

Мухаммад Заин Уль Абидин [email protected]

Мухаммад Шахмир [email protected]

Мухаммад Хамза [email protected]

Сайфулла Шакил [email protected]

Абдур Рехман Халид [email protected]