Análisis del conjunto de datos de noticias falsas

Las noticias falsas son información falsa o engañosa presentada como noticia. Las noticias falsas a menudo tienen el objetivo de dañar la reputación de una persona o entidad o de ganar dinero a través de los ingresos publicitarios. La prevalencia de noticias falsas ha aumentado con el reciente auge de las redes sociales, y esta información errónea se está filtrando gradualmente en los principales medios de comunicación. Se han implicado varios factores en la difusión de noticias falsas, como la polarización política, la política de la posverdad, el razonamiento motivado, el sesgo de confirmación y los algoritmos de las redes sociales.
Descripción del conjunto de datos
Este conjunto de datos se remonta a 2016; en ese momento, hubo una afluencia de noticias falsas en todas las plataformas de medios, especialmente en las redes sociales, donde se publicaban activamente muchas noticias falsas sobre las elecciones estadounidenses. La difusión de noticias falsas giró principalmente en torno al escándalo del correo electrónico de Hillary Clinton.
Forma
El conjunto de datos tiene una forma de (12,999, 20), que denota 12,999 filas y 20 columnas. Cada fila representa una publicación (publicada en una plataforma de redes sociales) en el conjunto de datos. Cada punto de datos, a su vez, contiene 20 funciones y columnas de publicación diferentes.
Características
Nuestro análisis se centra principalmente en los siguientes atributos del conjunto de datos:
- autor (cadena) : nombre de la persona que escribió la noticia falsa.
- Published (datetime) : destaca la fecha y la hora en que se publicó la noticia o se subió a Internet.
- title (cadena) : representa el título de la noticia que se utiliza para la publicación.
- texto (cadena) : representa el texto principal (cuerpo) de la noticia publicada.
- language (string) : indica el idioma en el que se publicó la noticia.
- site_url (cadena) : indica la URL del sitio en el que se publicó la noticia falsa.
- país (cadena) : indica el país en el que se publicó la noticia falsa.
- spam_score (doble) : probabilidad de que el software haya marcado la publicación como spam.
- tipo (cadena) : este atributo muestra el género (categoría) de la publicación de noticias falsas que representa el propósito de la publicación.
El primer paso de cualquier análisis exploratorio de datos es observar el conjunto de datos y limpiarlo. Notamos que algunas filas en nuestro conjunto de datos tenían valores nulos. En lugar de imputar las filas con valores nulos, decidimos descartar dichas filas debido al gran tamaño del conjunto de datos. Esto no afecta los resultados de nuestro estudio porque dichas filas eran mucho menos numerosas que el tamaño de nuestro conjunto de datos.
Correlaciones
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)
Las cadenas almacenadas en la columna "autor" se redujeron; solo se conservaron los alfabetos y los dígitos.
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)
El análisis exploratorio de datos (EDA) es el proceso de explorar datos, generar conocimientos, probar hipótesis, verificar suposiciones y revelar patrones ocultos subyacentes. La limpieza del conjunto de datos y la realización de un amplio análisis exploratorio de datos son procesos necesarios y una gran oportunidad para establecer las bases para un modelo sólido de aprendizaje automático.
Estamos abordando las siguientes preguntas usando EDA:
¿Qué meses de 2016 tuvieron la mayor concentración de noticias falsas en nuestro conjunto de datos de noticias falsas?
Usando un gráfico circular, encontramos que octubre y noviembre tuvieron la mayor concentración de noticias falsas.

¿Cuáles son las 10 palabras principales que aparecen en las publicaciones de noticias falsas?
Al explorar las palabras que aparecen con frecuencia, eliminamos todas las palabras vacías en la columna de texto completo, luego encontramos el recuento de las palabras de toda la columna y luego seleccionamos las 10 palabras principales que aparecían con más frecuencia.
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.
Para responder a esta pregunta, dibujamos subparcelas de conteos de valores de publicaciones marcadas como falsas por la herramienta contra site_urls. Nuestros hallazgos podrían haberse utilizado para marcar sitios para ajustar sus clasificaciones de dominio o bloquear dichos sitios para que no se muestren a los usuarios. Nuestro estudio encontró que la distribución de noticias falsas fue razonablemente uniforme en site_urls.

¿Quiénes son los 10 autores principales que publicaron la mayor cantidad de noticias falsas en nuestro conjunto de datos?
Para encontrar los 10 principales autores que publicaron la mayor cantidad de noticias falsas, calculamos la frecuencia de cada autor en nuestro conjunto de datos y trazamos los recuentos de valores frente a los nombres de los autores en un gráfico de barras.

Ingeniería de características
La ingeniería de características utiliza el conocimiento del dominio para extraer características, como características, propiedades y atributos, de los datos sin procesar. La ingeniería de funciones facilita el proceso de aprendizaje automático y aumenta el poder predictivo de los algoritmos de aprendizaje automático mediante la creación de funciones a partir de datos sin procesar.
Para que las máquinas den sentido a los datos cualitativos, primero deben convertirse al formato cuantitativo. Por lo tanto, para obtener nuestra meta objetiva, convertimos nuestras columnas no numéricas, como 'autor', 'idioma' y 'site_url ', en tipos de datos numéricos alimentando estas columnas a un codificador de etiquetas.
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()
Una característica vital del ciclo de vida de la ciencia de datos es que requiere múltiples iteraciones en cada etapa para producir información valiosa. Un error crítico que cometimos cuando comenzamos nuestro estudio fue descartar la columna "autor" asumiendo que era información redundante. Resulta que la columna " autor " contiene información valiosa para determinar la " falsedad " de una publicación en particular. Rectificamos nuestro error y decidimos codificar filas con autores faltantes como anónimos.
df['author'].fillna('anonymous', inplace=True)
Notamos que cuando introducimos las características de nuestro conjunto de datos en nuestro modelo, incluida la columna 'texto', el rendimiento de nuestro modelo fue abismal.
La puntuación de precisión fue inesperadamente muy alta (99 %), pero la puntuación F1 de nuestro modelo fue escasa (casi 0,01). En una mirada más cercana, encontramos una disparidad significativa entre la cantidad de publicaciones en las redes sociales que cruzaron el umbral de spam_score de 0.5. Hubo una gran cantidad de publicaciones que se marcaron como no falsas y muchas menos publicaciones marcadas como falsas. Cuando calculamos los puntajes de precisión de nuestros modelos, clasificaron erróneamente esa pequeña cantidad de publicaciones marcadas como "falsas", por lo que lograron puntajes de precisión tan altos y un puntaje F1 que fue casi cero. Finalmente decidimos no incluir la columna 'texto'. Esta estrategia mejoró enormemente la puntuación de F1 de nuestros modelos. Siga leyendo para conocer las puntuaciones de precisión en la sección Aprendizaje automático de esta publicación.
Aprendizaje automático
Predicción de noticias falsas
Empleamos varias técnicas de aprendizaje automático para predecir si una publicación en las redes sociales es falsa. Utilizamos diferentes modelos de clasificación para clasificar nuestros puntos de datos según la etiqueta ( 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)
Regresión logística
Aplicamos el modelo de regresión logística de Sklearn y calculamos la precisión correspondiente en el conjunto de prueba.
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)
KVecinosClasificador
K-NN es un algoritmo robusto de aprendizaje automático para un conjunto de datos altamente desequilibrado como el nuestro. Probamos diferentes valores de k y calculamos las correspondientes precisiones medias. Encontramos que el parámetro óptimo para el valor de k es 1. Esto nuevamente se debe al alto desequilibrio entre nuestras clases. La precisión reportó 98,2% con una puntuación F1 de 0,49. KNN es una mejora significativa sobre el clasificador de regresión logística.
RandomForestClassifier
Finalmente, empleamos un método de aprendizaje automático para predecir noticias falsas. Usamos el modelo RF Classifier de sklearn para esto. Además, utilizamos el método de validación cruzada K-Fold para mejorar la precisión informada por nuestro algoritmo. Lo logra dividiendo el conjunto de datos en 5 partes y usando 4 partes diferentes de forma iterativa para entrenar el modelo y la 1 parte restante para probar la precisión y otras métricas.
El proceso se describe en el siguiente fragmento.
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)

El veredicto final
Primero, discutimos qué son las noticias falsas. Luego estudiamos, limpiamos, visualizamos y analizamos nuestro conjunto de datos usando varias técnicas. Limpiamos y modificamos las características de nuestro conjunto de datos para que nuestros modelos de aprendizaje automático pudieran encontrar patrones en nuestro conjunto de datos. Exploramos varios algoritmos de clasificación para predecir qué califica como Fake News y qué no. Nuestro estudio encontró que Random Forest Classifier es el mejor algoritmo para predecir una clase de punto de datos cuando tenemos un conjunto de datos altamente asimétrico.
Los hallazgos de nuestro estudio son aportados por:
Muhammad Zain Ul Abidin [email protected]
Muhammad Shahmeer [email protected]
Muhammad Hamza [email protected]
Saifullah Shakeel [email protected]
Abdur Rehman Khalid [email protected]