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

Фейковые новости — это ложная или вводящая в заблуждение информация, представленная как новость. Поддельные новости часто преследуют цель нанести ущерб репутации физического или юридического лица или заработать деньги за счет доходов от рекламы. Распространенность фейковых новостей увеличилась с недавним ростом социальных сетей, и эта дезинформация постепенно просачивается в основные СМИ. К распространению фейковых новостей причастны несколько факторов, таких как политическая поляризация, политика постправды, мотивированные рассуждения, предвзятость подтверждения и алгоритмы социальных сетей.
Описание набора данных
Этот набор данных датируется 2016 годом; в то время был поток фейковых новостей на всех медиа-платформах, особенно в социальных сетях, где активно публиковалось много фейковых новостей, связанных с американскими выборами. Распространение фейковых новостей в основном вращалось вокруг скандала с электронной почтой Хиллари Клинтон.
Форма
Набор данных имеет форму (12 999, 20), что означает 12 999 строк и 20 столбцов. Каждая строка представляет сообщение (размещенное на платформе социальных сетей) в наборе данных. Каждая точка данных, в свою очередь, содержит 20 различных пост-функций и столбцов.
Функции
Наш анализ фокусируется в основном на следующих атрибутах набора данных:
- автор (строка) : имя человека, написавшего фейковую новость.
- опубликовано (дата-время) : выделяет дату и время публикации или размещения новости в Интернете.
- title (строка) : представляет заголовок новости, который используется для публикации.
- text (строка) : представляет основной текст (тело) опубликованной новости.
- language (string) : указывает язык, на котором были опубликованы новости.
- site_url (строка) : сообщает URL-адрес сайта, на котором были опубликованы поддельные новости.
- страна (строка) : указывает страну, в которой были опубликованы фейковые новости.
- spam_score (двойной) : вероятность того, что сообщение было помечено программой как спам.
- 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 года в нашем наборе данных о фейковых новостях была самая высокая концентрация фейковых новостей?
Используя круговую диаграмму, мы обнаружили, что в октябре и ноябре была самая высокая концентрация фейковых новостей.

Какие 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 лучших авторов, опубликовавших больше всего фейковых новостей, мы рассчитали частоту появления каждого автора в нашем наборе данных и нанесли на гистограмму значения счетчиков в зависимости от имен авторов.

Разработка функций
Разработка признаков использует знания предметной области для извлечения признаков, таких как характеристики, свойства и атрибуты, из необработанных данных. Разработка признаков облегчает процесс машинного обучения и увеличивает прогностическую силу алгоритмов машинного обучения за счет создания признаков из необработанных данных.
Чтобы машины могли понимать качественные данные, их необходимо сначала преобразовать в количественный формат. Следовательно, чтобы достичь нашей цели, мы преобразовали наши нечисловые столбцы, такие как «автор», «язык» и «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]