Análise do conjunto de dados de notícias falsas

Dec 05 2022
Fake news são informações falsas ou enganosas apresentadas como notícias. Muitas vezes, as notícias falsas têm como objetivo prejudicar a reputação de uma pessoa ou entidade ou ganhar dinheiro com receitas publicitárias.
Esta postagem do blog pretende explorar e analisar o conjunto de dados de notícias falsas para nos ajudar a fazer inferências úteis e implementar modelos preditivos na identificação de notícias falsas.

Fake news são informações falsas ou enganosas apresentadas como notícias. Muitas vezes, as notícias falsas têm como objetivo prejudicar a reputação de uma pessoa ou entidade ou ganhar dinheiro com receitas publicitárias. A prevalência de notícias falsas aumentou com o recente surgimento das mídias sociais, e essa desinformação está gradualmente se infiltrando na grande mídia. Vários fatores foram implicados na disseminação de notícias falsas, como polarização política, política pós-verdade, raciocínio motivado, viés de confirmação e algoritmos de mídia social.

Descrição do conjunto de dados

Este conjunto de dados remonta a 2016; na época, havia um influxo de notícias falsas em todas as plataformas de mídia, especialmente nas redes sociais, onde muitas notícias falsas sobre as eleições americanas estavam sendo postadas ativamente. A disseminação de notícias falsas girou principalmente em torno do escândalo do e-mail de Hillary Clinton.

Forma

O conjunto de dados tem uma forma de (12.999, 20), denotando 12.999 linhas e 20 colunas. Cada linha representa uma postagem (postada em uma plataforma de mídia social) no conjunto de dados. Cada ponto de dados, por sua vez, contém 20 colunas e recursos de postagem diferentes.

Características

Nossa análise se concentra principalmente nos seguintes atributos do conjunto de dados:

  1. author (string) : nome da pessoa que escreveu a fake news.
  2. publicado (datetime) : destaca a data e a hora em que a notícia foi divulgada ou colocada online.
  3. title (string) : representa o título da notícia que será utilizada para postagem.
  4. text (string) : representa o texto principal (corpo) da notícia postada.
  5. language (string) : informa o idioma em que a notícia foi postada.
  6. site_url (string) : informa a URL do site em que a fake news foi publicada.
  7. país (string) : informa o país em que a notícia falsa foi postada.
  8. spam_score (duplo) : probabilidade de que a postagem tenha sido marcada como spam pelo software.
  9. type (string) : este atributo mostra o gênero (categoria) da postagem de notícias falsas que representa o objetivo da postagem.

A primeira etapa de qualquer análise exploratória de dados é examinar o conjunto de dados e limpá-lo. Percebemos que algumas linhas em nosso conjunto de dados tinham valores nulos. Em vez de imputar as linhas com valores nulos, decidimos descartar essas linhas devido ao grande tamanho do conjunto de dados. Isso não afeta os resultados de nosso estudo porque essas linhas eram muito menores em número do que o tamanho de nosso conjunto de dados.

correlações

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)

As strings armazenadas na coluna “autor” foram rebaixadas; apenas alfabetos e dígitos foram mantidos.

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)

Análise exploratória de dados (EDA) é o processo de explorar dados, gerar insights, testar hipóteses, verificar suposições e revelar padrões ocultos subjacentes. Limpar o conjunto de dados e fazer uma extensa análise exploratória de dados são processos necessários e uma grande chance de estabelecer as bases para um modelo sólido de aprendizado de máquina.

Estamos abordando as seguintes questões usando EDA:

Quais meses de 2016 tiveram a maior concentração de notícias falsas em nosso Fake News Dataset?

Usando um gráfico de pizza, descobrimos que outubro e novembro tiveram a maior concentração de Fake News.

Meses de 2016 em que mais notícias falsas foram observadas

Quais são as 10 principais palavras que aparecem nas postagens de Fake News?

Ao explorar as palavras que ocorrem com frequência, removemos todas as palavras de parada em toda a coluna de texto, depois encontramos a contagem das palavras de toda a coluna e, em seguida, selecionamos as 10 palavras que mais apareceram.

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 essa pergunta, desenhamos subparcelas de contagens de valor de postagens marcadas como falsas pela ferramenta contra site_urls. Nossas descobertas podem ter sido usadas para sinalizar sites para ajustar suas classificações de domínio ou impedir que esses sites apareçam para os usuários. Nosso estudo descobriu que a distribuição de notícias falsas era razoavelmente uniforme entre site_urls.

Subtramas para sites envolvidos na disseminação de notícias falsas

Quem são os 10 principais autores que publicaram mais notícias falsas em nosso conjunto de dados?

Para encontrar os 10 principais autores que publicaram mais notícias falsas, calculamos a frequência de cada autor em nosso conjunto de dados e plotamos as contagens de valor em relação aos nomes dos autores em um gráfico de barras.

Os 10 autores que mais publicaram notícias falsas

Engenharia de recursos

A engenharia de recursos usa conhecimento de domínio para extrair recursos, como características, propriedades e atributos, de dados brutos. A engenharia de recursos facilita o processo de aprendizado de máquina e aumenta o poder preditivo dos algoritmos de aprendizado de máquina, criando recursos a partir de dados brutos.

Para que as máquinas entendam os dados qualitativos, eles devem primeiro ser convertidos para o formato quantitativo. Portanto, para obter nosso objetivo, convertemos nossas colunas não numéricas, como 'autor', 'idioma' e 'site_url ', em tipo de dados numéricos, alimentando essas colunas em um codificador de rótulo.

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()

Uma característica vital do ciclo de vida do Data Science é que ele requer várias iterações em cada estágio para produzir insights valiosos. Um erro crítico que cometemos quando iniciamos nosso estudo foi descartar a coluna “autor” assumindo-a como informação redundante. Acontece que a coluna “ autor ” contém informações valiosas para determinar a “ falsidade ” de uma postagem específica. Corrigimos nosso erro e decidimos codificar as linhas com autores ausentes como anônimas.

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

Observamos que, quando inserimos os recursos de nosso conjunto de dados em nosso modelo, incluindo a coluna 'texto', o desempenho de nosso modelo foi péssimo.
A pontuação de precisão foi inesperadamente muito alta (99%), mas a pontuação F1 do nosso modelo foi escassa (quase 0,01). Analisando mais de perto, encontramos uma disparidade significativa entre o número de postagens de mídia social que ultrapassaram o limite de spam_score de 0,5. Houve um grande número de postagens marcadas como não falsas e muito menos postagens marcadas como falsas. Quando calculamos as pontuações de precisão de nossos modelos, eles classificaram incorretamente o pequeno número de postagens marcadas como 'falsas', alcançando pontuações de precisão tão altas e uma pontuação F1 quase zero. Por fim, decidimos não incluir a coluna 'texto'. Essa estratégia melhorou imensamente a pontuação F1 de nossos modelos. Continue lendo para descobrir as pontuações de precisão na seção Machine Learning desta postagem.

Aprendizado de máquina

Prevendo notícias falsas

Empregamos várias técnicas de aprendizado de máquina para prever se uma postagem de mídia social é falsa. Usamos diferentes modelos de classificação para classificar nossos pontos de dados de acordo com o Label( 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)

Regressão Logística

Aplicamos o modelo de regressão logística de Sklearn e calculamos a precisão correspondente no conjunto de teste.

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)

KNeighborsClassifier

K-NN é um algoritmo de aprendizado de máquina robusto para um conjunto de dados altamente desequilibrado como o nosso. Tentamos diferentes valores de k e calculamos as precisões médias correspondentes. Descobrimos que o parâmetro ideal para o valor de k é 1. Isso se deve novamente ao alto desequilíbrio entre nossas classes. A precisão relatou 98,2% com uma pontuação F1 de 0,49. O KNN é uma melhoria significativa em relação ao classificador de regressão logística.

RandomForestClassifier

Por fim, empregamos um método de aprendizado de máquina para prever notícias falsas. Usamos o modelo classificador de RF do sklearn para isso. Além disso, usamos o método K-Fold Cross Validation para melhorar a precisão relatada por nosso algoritmo. Ele consegue isso dividindo o conjunto de dados em 5 partes e usando 4 partes diferentes iterativamente para treinar o modelo e a 1 parte restante para testar a precisão e outras métricas.

O processo é delineado no trecho a seguir.

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)

Matriz de Confusão Média para Classificador de Floresta Aleatória

O veredicto final

Primeiro, discutimos o que são Fake News. Em seguida, estudamos, limpamos, visualizamos e analisamos nosso conjunto de dados usando várias técnicas. Limpamos e desenvolvemos nosso conjunto de dados para que nossos modelos de aprendizado de máquina pudessem encontrar padrões em nosso conjunto de dados. Exploramos vários algoritmos de classificação para prever o que se qualifica como Fake News e o que não se qualifica. Nosso estudo descobriu que o Random Forest Classifier é o melhor algoritmo para prever uma classe de pontos de dados quando temos um conjunto de dados altamente assimétrico.

Os resultados do nosso estudo são contribuídos por:

Muhammad Zain Ul Abidin [email protected]

Muhammad Shahmeer [email protected]

Muhammad Hamza [email protected]

Saifullah Shakeel [email protected]

Abdur Rehman Khalid [email protected]