-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0938a37
commit f42823f
Showing
5 changed files
with
254 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,3 +4,4 @@ _site/ | |
Gemfile.lock | ||
|
||
.vscode/ | ||
.history |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<table class="not-full-width-table" style="border: 1px solid #666;"> | ||
<tr> | ||
<th colspan="4" style="background: #666; border: 1px solid #666;">{{ include.titulo }}</th> | ||
</tr> | ||
<tr> | ||
<th colspan="2" style="background: #fff; border-width: 0px"></th> | ||
<th colspan="2">Predito</th> | ||
</tr> | ||
<tr> | ||
<th colspan="2" style="background: #fff; border-width: 0px"></th> | ||
<th>V</th> | ||
<th>N</th> | ||
</tr> | ||
<tr> | ||
<th rowspan="2">Real</th> | ||
<th>V</th> | ||
<td>{{ include.VP }}</td> | ||
<td>{{ include.FP }}</td> | ||
</tr> | ||
<tr> | ||
<th>F</th> | ||
<td>{{ include.VP }}</td> | ||
<td>{{ include.FP }}</td> | ||
</tr> | ||
</table> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,223 @@ | ||
--- | ||
layout: post | ||
title: Identificação de Bots no Twitter | ||
subtitle: | ||
image: /img/twitter-bot/capa.jpg | ||
author: Aline Nascimento Xavier, João Pedro Kincheski Fassina, Pedro Luiz de Souza Moreira | ||
--- | ||
|
||
Este projeto foi proposto pelo grupo CIDAMO – UFPR como 3ª atividade avaliativa para ingresso no grupo. | ||
O propósito desta atividade é o estudo e o desenvolvimento de um tema utilizando técnicas de machine learning e nós iremos abordar a identificação de bots no Twitter PT-BR. | ||
|
||
## Introdução | ||
|
||
O Twitter possui 330 milhões de usuários ativos mensalmente no mundo todo, e a quantidade exata de bots é desconhecida. Estima-se que o número de contas falsas varia entre 5% a 15%, e essa discordância nas porcentagens acontece pois os bots estão cada vez mais sofisticados. | ||
|
||
Por definição bots são aplicações de softwares que tentam simular ações humanas e são programados a realizar tarefas repetidas vezes. Os bots são classificados entre benignos e malignos, o primeiro consiste em capturar mídias e realizar serviços ao consumidor, enquanto o segundo possui características de difusão de informações, verídicas ou não, na rede. | ||
|
||
Neste trabalho nos iremos abordar os bots sociais, que tentam se passar por humanos, geram e consomem informação da rede, podem possuir assinaturas temporais e apresentam interações avançadas, como conversas, respostas e comentários com outras contas que não necessariamente são falsas. | ||
|
||
<iframe width="560" height="315" src="https://www.youtube.com/embed/wAG0ARdGXIE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
|
||
- Descrição do Problema | ||
- Quais foram as ações tomadas no projeto | ||
|
||
E mais, você encontra no vídeo acima! | ||
|
||
## Problema | ||
Na última década o uso da internet em campanhas eleitorais se tornou comum ao redor do mundo e o uso das redes sociais na disseminação de informações políticas virou negócio para as agências de marketing digital. Neste cenário vários estudos foram desenvolvidos na identificação de bots. O Bot Sentinel foi desenvolvido para identificar contas falsas no Twitter, e em abril deste ano a plataforma americana identificou pela primeira vez o uso massivo de bots brasileiros para alavancagem de assuntos. | ||
|
||
{% include image.html url="https://ogimg.infoglobo.com.br/brasil/24392165-597-805/FT1086A/652/xbolsonaro-pronunciamento.png.pagespeed.ic.DR74QcJWYw.jpg" description="Imagem da Noticia - Presidente Jair Bolsonaro em um discurso junto a seu ministério Fonte: [1] " %} | ||
|
||
Essa publicação foi o ponto de partida deste projeto que tem como objetivo detectar a presença de bots entre hashtags do Twitter. | ||
|
||
## Análise Descritiva | ||
<iframe width="560" height="315" src="https://www.youtube.com/embed/Wd9TKsq-eYo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
|
||
### Obtenção do Banco de Dados | ||
Após a publicação do Bot Sentinel nós precisávamos de uma ferramenta que capturasse os tweets diretamente do Twitter referente as hashtags citadas no artigo, entre as hashtags mencionadas decidimos trabalhar com a #FechadosComBolsonaro que era a mais popular e possuía um volume muito grande de tweets. | ||
|
||
Para a captura dos tweets utilizamos o pacote Rtweet no RStudio, que possui algumas limitações, por exemplo, os resultados das pesquisas retornam apenas de seis a nove dias anteriores e possui o limitante de 18.000 tweets em 15 minutos, e mesmo com essas restrições conseguimos capturar 1,1 milhão de status da hashtag #FechadosComBolsonaro publicados no Twitter entre os dias 21 a 25 de abril de 2020 que correspondem a 102 mil usuários. | ||
|
||
Assim conseguimos criar uma base de dados bruta com 1,1 milhão de linhas e com 90 colunas com informações da conta de usuário, relacionamento com outras contas, conteúdos dos status e outros metadados. | ||
|
||
Além da captura dos status/tweets, também precisávamos de um target para dizer se uma conta era ou não bot, para isso utilizamos o pacote BotorNot também no RStudio. O pacote utiliza deep learning para analisar metadados de usuários e tweets e retorna a probabilidade da conta ser bot. Quando utiliza os metadados e os tweets o modelo do pacote possui uma acurácia de 93,53% para classificar bots, porém a análise dos tweets é muito custosa computacionalmente e o idioma interfere no resultado quando diferente do inglês, por isso decidimos utilizar o recurso do pacote que só analisa os metadados do usuário, fazendo com que analise 90 mil perfis a cada 15 minutos ao invés de 180, porém a acurácia cai para 91,9%. | ||
|
||
Para tornar a nossa base em um problema de classificação escolhemos limiares para classificar as contas, usuários com uma probabilidade maior que 70% foram classificados como bot e usuários com uma probabilidade menor de 30% foram classificados como humanos, no final ficamos com 25 mil usuários bots e 37 mil pessoas daqueles 102 mil usuários iniciais. | ||
|
||
|
||
**Links Para as Bases de dados** | ||
|
||
- [Todos os Status + Probabilidades **Base #FechadoscomBolsonaro**](https://drive.google.com/file/d/132ci7hTI-aObNnW38idZ9IPtUd-jULRP/view?usp=sharing) | ||
- [Base Trending Topics Extras | ||
](https://drive.google.com/drive/folders/1E4E_5A57rOfr3BnHOaXRHUibRrj_SSWJ?usp=sharing) - Até 36000 status mais recentes, dos Trending Topics relacionados à política nacional entre 11/04/2020 e 18/04/2020. A coleta foi feita manualmente utilizando o site https://www.trendsmap.com/ | ||
- Não disponibilizamos a classificação manual, caso queira ter acesso a esse e outros dados, entre em contato conosco pelo e-mail do CiDAMO. | ||
|
||
### Tratamento das Variáveis | ||
Inicialmente a nossa base possuía 90 features e continha informações de vários tweets de um mesmo perfil, mas o objetivo era avaliar o usuário, por isso criamos algumas variáveis e realizamos tratamentos na base para que cada linha contivesse o agrupamento de dados de uma respectiva conta, para criar essas novas features consideramos vários trabalhos acadêmicos que constam na bibliografia. Abaixo apresentamos a lista de variáveis que utilizamos nos nossos modelos. | ||
|
||
**Usuário** | ||
- Nome de Usuário possui mais de 4 números | ||
- Nome de Usuário possui tamanho maior que a média do tamanho de nomes de usuário na base | ||
- Conta possui localização | ||
- Conta possui descrição | ||
- Possui Emoji no Nome | ||
- Possui emoji na descrição | ||
- Possui Avatar Padrão | ||
- Possui Capa Padrão | ||
|
||
**Conteúdo** | ||
- Fonte - **Ordinal Encoding** - Apenas fontes do Twitter, ou Outros, por frequência (1ª aparição na base) | ||
- Quantidade de # nos status da base | ||
- Quantidade de @ nos status da base | ||
|
||
**Rede** | ||
- Quantidade de Retweets da Conta | ||
- Quantidade de Tweets na Base | ||
- Quantidade de Status da Conta | ||
- Quantidade de Favoritos da Conta | ||
- Taxa Tweets/Favoritos | ||
- Quantidade de Tweets Duplicados na base | ||
- CoParticipação em [71 hashtags](https://drive.google.com/drive/folders/1E4E_5A57rOfr3BnHOaXRHUibRrj_SSWJ?usp=sharing) | ||
|
||
**Amigos** | ||
- Possui menos de 10 seguidores | ||
- Taxa Seguidores/Seguidos | ||
- Quantidade de vezes listado | ||
- Quantidade de Seguidores | ||
- Quantidade de Seguidos | ||
|
||
**Tempo** | ||
- Tempo entre primeiro e último tweet na base | ||
- Tempo de Conta em dias | ||
|
||
|
||
Abaixo você encontra a relação de correlação das variáveis em relação à classificação em bot ou não | ||
|
||
|
||
<iframe src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQuf6hIRiEWFw6vJiBwTFbqMjQaYfyhxOVZ6qEyAYzt0qd_jxIJ6SDsKBXh1MQ8HX1x_18gKdt9kCp4/pubhtml?gid=0&single=true&widget=true&headers=false" width="720" height="480" ></iframe> | ||
|
||
|
||
## Metodologia | ||
|
||
<iframe width="560" height="315" src="https://www.youtube.com/embed/jl3ZOLPMI3w" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
|
||
### Modelos | ||
Foram utilizados 4 modelos diferentes neste projeto sendo eles: | ||
- [SGD](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html) | ||
- [Rede Neural - TensorFlow](https://www.tensorflow.org/learn) | ||
- [XGBoost](https://xgboost.readthedocs.io/en/latest/) | ||
- [LightGBM](https://lightgbm.readthedocs.io/en/latest/) | ||
|
||
#### SGD - Gradiente Descendente Estocástico | ||
É um método iterativo que tem o objetivo de reduzir uma função de perda e achar um minimizador, segue a mesma ideia do Gradiente Descendente porém neste método ao invés de utilizar todos os seus dados para calcular o gradiente se utiliza mini-batches, que são alguns ou apenas um dado do seu conjunto todo, deste modo temos que calcular muito menos derivadas, economizando bastante tempo. O que se perde ao escolher apenas alguns é que se tem um caminho muito mais ruidoso. | ||
|
||
{% include image.html url="https://media.geeksforgeeks.org/wp-content/uploads/gdp.png" description="Caminho feito pelo Gradiente Descendente Fonte: [2] " %} | ||
|
||
{% include image.html url="https://media.geeksforgeeks.org/wp-content/uploads/sgd-1.jpg" description="Caminho feito pelo Gradiente Descendente Estocástico Fonte: [3] " %} | ||
|
||
|
||
#### Redes Neurais | ||
Uma rede neural tem como objetivo simular a tomada de decisões de um ser humano e isso é feito “emulando” os seus neurônios. | ||
|
||
Comumente uma rede vai ser composta de uma camada de entrada, que é por onde os dados entram, cada uma das features vai para um neurônio que vai passá-la para frente aplicando uma função a ela, assim como em todas as outras camadas intermediárias do processo, e por fim ela chega a uma camada de saída que devolve o resultado. | ||
|
||
{% include image.html url="https://sites.icmc.usp.br/andre/research/neural/image/camadas_an.gif" description="Organização em Camadas de uma Rede Neural Fonte: [4] " %} | ||
|
||
Essencialmente é assim que uma rede neural funciona de um modo bem básico e simplificado, existem múltiplos parâmetros a serem configurados que vão depender principalmente de qual biblioteca se está utilizando e de qual é o seu objetivo. | ||
Neste projeto foi utilizada a biblioteca TensorFlow com camadas densas. | ||
|
||
#### Light GBM e XG Boost | ||
Ambos são algoritmos de gradient boosting que utilizam as árvores de decisão como base, as árvores funcionam como grandes sequências de condicionais (nós) que separam os dados pelas suas features sequencialmente até que se chegue aos nós finais, que decidem qual é a categoria. | ||
|
||
{% include image.html url="https://i1.wp.com/www.vooo.pro/insights/wp-content/uploads/2016/12/RDS-Vooo_insights-Tutorial_arvore_de_decisao_02.jpg?resize=768%2C446&ssl=1" description="Estrutura de uma árvore de decisão Fonte: [5] " %} | ||
|
||
##### Gradient boosting | ||
Começa-se com uma aprendizagem fraca, que neste caso são as árvores, e com o objetivo de minimizar a função de perda elas começam com o aprendizado, cada árvore após a primeira utiliza a sua antecessora olhando para os erros que ela fez e tenta corrigi-los, isto é feito até que se alcance alguma condição de parada. | ||
|
||
Uma das principais diferenças entre o Light GBM e o XGBoost é a forma como as suas árvores são formadas, as do GBM crescem por folha enquanto que as do XG crescem por nível, isso faz com que ele consiga melhorar a sua precisão ainda mais por iteração. | ||
|
||
{% include image.html url="https://miro.medium.com/max/1400/1*L8Q9sb4uLZbA7kn9E_FkKQ.png" description="Crescimento por nível e Crescimento por folha Fonte: [6] " %} | ||
|
||
|
||
## Resultados | ||
|
||
<iframe width="560" height="315" src="https://www.youtube.com/embed/I73qZ4VP5Ow" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
|
||
Nos dividimos aleatoriamente a nossa base de 62 mil usuários classificados em bots e humanos em 70% treino e o restante em teste. | ||
|
||
Utilizando os modelos treinados na fase de treino obtivemos as acurácias mostradas na tabela abaixo na fase de teste. A **Tabela 1 **mostra que entre os 4 modelos utilizamos o LightGBM seguido pelo XGBoost apresentaram a melhor acurácia. | ||
|
||
| Modelo | Escore | | ||
|---------------|--------| | ||
| SGD | 0.6476 | | ||
| LightGB | 0.9476 | | ||
| XGBoos | 0.9247 | | ||
| Redes Neurais | 0.8419 | | ||
|
||
**Tabela 1** | ||
validação | ||
Para maior validação dos nossos modelos, criamos uma base de contas verificadas manualmente pela equipe, selecionamos 100 usuários aleatórios que foram retirados de uma captura da hashtag #MaiaTraidorNacional, desses classificamos 32 como sendo bots e 68 como humanos. Nesta base os modelos treinados performaram de maneira diferente, como mostra a **Tabela 2**, onde combinados o escore com o recall podemos ver que os melhores modelos foram SGD e XGBoost, que classificaram boa parte dos bots corretamente, e em contrapartida tivemos as redes neurais errando 100% na classificação dos bots. | ||
|
||
| Modelo | Escore | Recall | | ||
|---------------|--------|---------| | ||
| SGD | 0.5454 | 0.71875 | | ||
| LightGBM | 0.5151 | 0.46875 | | ||
| XGBoost | 0.5252 | 1 | | ||
| Redes Neurais | 0.5656 | 0 | | ||
|
||
**Tabela 2** | ||
|
||
Apenas essas métricas não foram o suficiente para avaliarmos os modelos, para compreendermos melhor como cada modelo estava classificando utilizamos a matriz a confusão que mostra os valores reais e os valores preditos pelo modelo. | ||
|
||
{% include confusion_matrix.html titulo="Matriz de confusão" VP="VP" VN="VN" FP="FP" FN="FN" %} | ||
|
||
- VP – Verdadeiros positivos (humanos) | ||
- FP – Falsos positivos (humanos classificados com bots) | ||
- FN – Falsos negativos (bots classificados como humanos) | ||
- VN – Verdadeiros negativos (bots) | ||
|
||
<div class="row"> | ||
<div class="col-md-3 col-sm-6 col-xs-12"> | ||
{% include confusion_matrix.html titulo="LGBM" VP="40" FP="27" FN="17" VN="15" %} | ||
</div> | ||
<div class="col-md-3 col-sm-6 col-xs-12"> | ||
{% include confusion_matrix.html titulo="SGD" VP="31" FP="36" FN="9" VN="23" %} | ||
</div> | ||
<div class="col-md-3 col-sm-6 col-xs-12"> | ||
{% include confusion_matrix.html titulo="XGBoost" VP="0" FP="67" FN="0" VN="32" %} | ||
</div> | ||
<div class="col-md-3 col-sm-6 col-xs-12"> | ||
{% include confusion_matrix.html titulo="TensorFlow" VP="67" FP="0" FN="32" VN="0" %} | ||
</div> | ||
</div> | ||
|
||
Olhando para matriz de confusão de cada modelo mostrado abaixo, podemos verificar que os modelos XGboost e as Redes Neurais classificaram todo o conjunto de dados em bots e humanos respectivamente, mostrando um péssimo desempenho. Já o modelo LightGBM conseguiu classificar melhor os humanos enquanto o SGD conseguiu classificar melhor os bots. | ||
|
||
## Conclusão | ||
|
||
Fica claro pelos dados apresentados nos resultados que os modelos performaram de maneiras muito diferentes da base de treino com a base de validação. A hipótese que consideramos que justifica esses resultados é o target usado. Na base de treino utilizamos a biblioteca BotOrNot e na base de validação classificamos as contas manualmente, fato que gerou muitas controvérsias na equipe, uma vez que a classificação das contas era muito subjetiva e sujeita a várias interpretações para cada avaliador. | ||
|
||
Considerando essa dificuldade na classificação manual dos usuários e os resultados obtidos na base de treino, levantamos a hipótese que existe uma chance grande do modelo LightGBM estar classificando melhor os bots do que a análise manual. | ||
|
||
**Últimas versões do Notebook** | ||
|
||
- [Notebook - 07/05/2020](https://drive.google.com/file/d/1eRMCzk97pUjf8TIXd9REjfEBRlsE7TVC/view?usp=sharing) | ||
- [Notebook - 30/04/2020](https://drive.google.com/file/d/1rjjk5sBHjtRgCPVWRJElPQ4oLS2q4qOL/view?usp=sharing) | ||
- [Notebook - 23/04/2020](https://drive.google.com/file/d/1RWvt0E5jxmUAhKYlI3-ZvfYbzZQQIWIU/view?usp=sharing) | ||
|
||
|
||
### Referências | ||
- [1] [https://oglobo.globo.com/brasil/plataforma-que-monitora-robos-aponta-presenca-macica-de-contas-falsas-entre-apoiadores-de-bolsonaro-24399334](https://oglobo.globo.com/brasil/plataforma-que-monitora-robos-aponta-presenca-macica-de-contas-falsas-entre-apoiadores-de-bolsonaro-24399334) | ||
- [2] [https://www.geeksforgeeks.org/ml-stochastic-gradient-descent-sgd/](https://www.geeksforgeeks.org/ml-stochastic-gradient-descent-sgd/) | ||
- [3] [https://www.geeksforgeeks.org/ml-stochastic-gradient-descent-sgd/](https://www.geeksforgeeks.org/ml-stochastic-gradient-descent-sgd/) | ||
- [4] [https://sites.icmc.usp.br/andre/research/neural/](https://sites.icmc.usp.br/andre/research/neural/) | ||
- [5] [https://www.vooo.pro/insights/um-tutorial-completo-sobre-a-modelagem-baseada-em-tree-arvore-do-zero-em-r-python/](https://www.vooo.pro/insights/um-tutorial-completo-sobre-a-modelagem-baseada-em-tree-arvore-do-zero-em-r-python/) | ||
- [6] [https://towardsdatascience.com/lightgbm-vs-xgboost-which-algorithm-win-the-race-1ff7dd4917d](https://towardsdatascience.com/lightgbm-vs-xgboost-which-algorithm-win-the-race-1ff7dd4917d) | ||
- [7] E. Ferrara, O. Varol, C. Davis, F. Menczer, A. Flammini.(2014). "The Rise of Social Bots". Disponível em: [https://arxiv.org/abs/1407.5225](https://arxiv.org/abs/1407.5225) | ||
- [8] Emerging Technology from the arXiv. (2014). "How To Spot A Social Bot On Twitter". Disponível em [https://www.technologyreview.com/2014/07/28/74316/how-to-spot-a-social-bot-on-twitter/](https://www.technologyreview.com/2014/07/28/74316/how-to-spot-a-social-bot-on-twitter/) | ||
- [9] RUEDIGER, M. A. et al. (Ed.) (2018). Bots, Social Networks and Politics in Brazil: | ||
Analysis of interferences made by automated profiles in the 2014 elections. Policy | ||
Paper. Rio de Janeiro: FGV DAPP. Disponível em [http://bibliotecadigital.fgv.br/dspace/themes/Mirage2/pages/pdfjs/web/viewer.html?file=http://bibliotecadigital.fgv.br/dspace/bitstream/handle/10438/24841/%5bFINAL%5d%20Bots-socialnetworks-and-politics-in-brazil.pdf?sequence=1&isAllowed=y](http://bibliotecadigital.fgv.br/dspace/themes/Mirage2/pages/pdfjs/web/viewer.html?file=http://bibliotecadigital.fgv.br/dspace/bitstream/handle/10438/24841/%5bFINAL%5d%20Bots-socialnetworks-and-politics-in-brazil.pdf?sequence=1&isAllowed=y) | ||
- [10] Varol, Onur & Ferrara, Emilio & Davis, Clayton & Menczer, Filippo & Flammini, Alessandro. (2017). Online Human-Bot Interactions: Detection, Estimation, and Characterization. Disponivel em: [https://www.researchgate.net/publication/314433388_Online_Human-Bot_Interactions_Detection_Estimation_and_Characterization](https://www.researchgate.net/publication/314433388_Online_Human-Bot_Interactions_Detection_Estimation_and_Characterization) | ||
- [11] Efthimion, P. George; Payne, Scott; and Proferes, Nicholas (2018) "Supervised Machine Learning Bot Detection Techniques to Identify Social Twitter Bots," SMU Data Science Review: Vol. 1 : No. 2 , Article 5. Disponivel em: [https://scholar.smu.edu/datasciencereview/vol1/iss2/5](https://scholar.smu.edu/datasciencereview/vol1/iss2/5) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.